// tslint:disable: no-unused-expression
import { BitField } from '@node-dlc/common';
import { expect } from 'chai';

import { AddressIPv4 } from '../../lib/domain/AddressIPv4';
import { NodeAnnouncementMessage } from '../../lib/messages/NodeAnnouncementMessage';

describe('NodeAnnouncementMessage', () => {
  describe('deserialize basic message', () => {
    const input = Buffer.from(
      '010105d3b12aacb824409ce8724609fe453fdcd33a498ecca170784985c4a6a2765657c4ef9e1170d3a5795ec86021c3a081c84a9f3a02e2ca66d17b683baacae08000005cddd5e5036b96e4713c5f84dcb8030592e1bd42a2d9a43d91fa2e535b9bfd05f2c5def9b9b6d43364656d6f312e6c6e646578706c6f7265722e636f6d0000000000000000000000000701265736a32611',
      'hex',
    );

    let result: NodeAnnouncementMessage;

    before(() => {
      result = NodeAnnouncementMessage.deserialize(input);
    });

    it('should be type 257', () => {
      expect(result.type).to.equal(257);
    });

    it('should have a 64-byte signature', () => {
      expect(result.signature).to.deep.equal(
        Buffer.from(
          '05d3b12aacb824409ce8724609fe453fdcd33a498ecca170784985c4a6a2765657c4ef9e1170d3a5795ec86021c3a081c84a9f3a02e2ca66d17b683baacae080',
          'hex',
        ),
      );
    });

    it('should have featuers', () => {
      expect(result.features.toNumber()).to.equal(0);
    });

    it('should have the correct timestamp', () => {
      expect(result.timestamp).to.equal(1558042085);
    });

    it('should have the 33-byte node_id', () => {
      expect(result.nodeId).to.deep.equal(
        Buffer.from(
          '036b96e4713c5f84dcb8030592e1bd42a2d9a43d91fa2e535b9bfd05f2c5def9b9',
          'hex',
        ),
      );
    });

    it('should have the 3-byte rgb_color', () => {
      expect(result.rgbColor).to.deep.equal(Buffer.from('b6d433', 'hex'));
    });

    it('should have the 32-byte alias', () => {
      expect(result.alias).to.deep.equal(
        Buffer.from(
          '64656d6f312e6c6e646578706c6f7265722e636f6d0000000000000000000000',
          'hex',
        ),
      );
    });

    it('should valid addresses', () => {
      expect(result.addresses.length).to.equal(1);
      expect(result.addresses[0].type).to.equal(1);
      expect(result.addresses[0].host).to.equal('38.87.54.163');
      expect(result.addresses[0].port).to.equal(9745);
    });
  });

  describe('serialize basic message', () => {
    it('should serialize', () => {
      const instance = new NodeAnnouncementMessage();
      instance.nodeId = Buffer.from(
        '036b96e4713c5f84dcb8030592e1bd42a2d9a43d91fa2e535b9bfd05f2c5def9b9',
        'hex',
      );
      instance.signature = Buffer.from(
        '05d3b12aacb824409ce8724609fe453fdcd33a498ecca170784985c4a6a2765657c4ef9e1170d3a5795ec86021c3a081c84a9f3a02e2ca66d17b683baacae080',
        'hex',
      );
      instance.features = new BitField();
      instance.timestamp = 1558042085;
      instance.rgbColor = Buffer.from('b6d433', 'hex');
      instance.alias = Buffer.from(
        '64656d6f312e6c6e646578706c6f7265722e636f6d0000000000000000000000',
        'hex',
      );
      instance.addresses.push(new AddressIPv4('38.87.54.163', 9745));

      const result = instance.serialize();

      expect(result).to.deep.equal(
        Buffer.from(
          '010105d3b12aacb824409ce8724609fe453fdcd33a498ecca170784985c4a6a2765657c4ef9e1170d3a5795ec86021c3a081c84a9f3a02e2ca66d17b683baacae08000005cddd5e5036b96e4713c5f84dcb8030592e1bd42a2d9a43d91fa2e535b9bfd05f2c5def9b9b6d43364656d6f312e6c6e646578706c6f7265722e636f6d0000000000000000000000000701265736a32611',
          'hex',
        ),
      );
    });
  });

  describe('.verifySignatures', () => {
    it('should verify valid sigs', () => {
      const instance = NodeAnnouncementMessage.deserialize(
        Buffer.from(
          '010105d3b12aacb824409ce8724609fe453fdcd33a498ecca170784985c4a6a2765657c4ef9e1170d3a5795ec86021c3a081c84a9f3a02e2ca66d17b683baacae08000005cddd5e5036b96e4713c5f84dcb8030592e1bd42a2d9a43d91fa2e535b9bfd05f2c5def9b9b6d43364656d6f312e6c6e646578706c6f7265722e636f6d0000000000000000000000000701265736a32611',
          'hex',
        ),
      );
      const result = NodeAnnouncementMessage.verifySignatures(instance);
      expect(result).to.be.true;
    });
  });
});
