import { CardType, Transport } from '@coolwallet/core';
import { createTransport } from '@coolwallet/transport-jre-http';
import { initialize } from '@coolwallet/testing-library';
import XRP from '../src/index';

type PromiseValue<T> = T extends Promise<infer V> ? V : never;
type Mandatory = PromiseValue<ReturnType<typeof initialize>>;

describe('Test XRP SDK', () => {
  let transport: Transport;
  let cardType: CardType;
  let props: Mandatory;
  const xrpSDK = new XRP();
  const mnemonic = 'zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo abstract';

  beforeAll(async () => {
    if (process.env.CARD === 'go') {
      cardType = CardType.Go;
    } else {
      cardType = CardType.Pro;
    }
    if (cardType === CardType.Go) {
      transport = (await createTransport('http://localhost:9527', CardType.Go))!;
    } else {
      transport = (await createTransport())!;
    }
    props = await initialize(transport, mnemonic);
  });

  describe('Test Get Address', () => {
    it('index 0 address', async () => {
      const address = await xrpSDK.getAddress(transport, props.appPrivateKey, props.appId, 0);
      expect(address).toMatchInlineSnapshot(`"rUFN5unZ7WEA5KcC5v5JN24FJcNFaAL6Wz"`);
    });
  });

  describe('Test Transfer XRP', () => {
    it('transfer with address 0', async () => {
      const signData = {
        transport,
        appPrivateKey: props.appPrivateKey,
        appId: props.appId,
        addressIndex: 0,
        payment: {
          TransactionType: 'Payment',
          Flags: 2147483648,
          Sequence: 82710910,
          DestinationTag: 2121215551,
          LastLedgerSequence: 94113337,
          Amount: '100000',
          Fee: '10',
          Destination: 'rwjPKE7LqyYYcccwRoJLuGn7TA1Jyw5c6v',
        },
        confirmCB: () => {},
        authorizedCB: () => {},
      };

      expect(await xrpSDK.signTransaction(signData)).toMatchInlineSnapshot(
        `"12000022800000002404EE117E2E7E6F2E3F201B059C0E396140000000000186A068400000000000000A7321035659B8E4B0D46DC5B22F62EF6211206C2F9AA4C28689217BE99FDD5C706516F1744730450221008B3D86039E2266E8850EFB069D8C2FA4DC847DFC918945F53233E3EA0D535924022005A92BE665F501DA3FE3BBE70A5696D142B7CF53ACA0AB05A64A2334E4105F308114819863812B0B9EA1F48EF5297D2F4EE1119BD87283146ABD3AD2BD443171175B7E7FD6C0BF547A6C5A78"`
      );
    });
  });

  describe('Test Transfer XRP with new script', () => {
    it('transfer without flags and destination tag', async () => {
      const signData = {
        transport,
        appPrivateKey: props.appPrivateKey,
        appId: props.appId,
        addressIndex: 0,
        payment: {
          TransactionType: 'Payment',
          Sequence: 82710910,
          LastLedgerSequence: 94113337,
          Amount: '100000',
          Fee: '10',
          Destination: 'rwjPKE7LqyYYcccwRoJLuGn7TA1Jyw5c6v',
        },
        confirmCB: () => {},
        authorizedCB: () => {},
      };

      expect(await xrpSDK.signTransaction(signData)).toMatchInlineSnapshot(
        `"1200002404EE117E201B059C0E396140000000000186A068400000000000000A7321035659B8E4B0D46DC5B22F62EF6211206C2F9AA4C28689217BE99FDD5C706516F174473045022100F9D55E27D707C1E582F63AEE1D7FD1877C1BA65C1F9D3EA69A2BD7A73BCC3172022059AE14C16A94B32204B9B3B47225107BD3C7DBDD1AEC17306D1F48A8B696AD9F8114819863812B0B9EA1F48EF5297D2F4EE1119BD87283146ABD3AD2BD443171175B7E7FD6C0BF547A6C5A78"`
      );
    });

    it('transfer with memo', async () => {
      const signData = {
        transport,
        appPrivateKey: props.appPrivateKey,
        appId: props.appId,
        addressIndex: 0,
        payment: {
          TransactionType: 'Payment',
          Sequence: 82710910,
          LastLedgerSequence: 94113337,
          Amount: '100000',
          Fee: '10',
          Destination: 'rwjPKE7LqyYYcccwRoJLuGn7TA1Jyw5c6v',
          Memos: [
            {
              Memo: {
                MemoData: '31303030303030', // withdraw 金額(1000000)的 hex code
              },
            },
          ],
        },
        confirmCB: () => {},
        authorizedCB: () => {},
      };

      expect(await xrpSDK.signTransaction(signData)).toMatchInlineSnapshot(
        `"1200002404EE117E201B059C0E396140000000000186A068400000000000000A7321035659B8E4B0D46DC5B22F62EF6211206C2F9AA4C28689217BE99FDD5C706516F17446304402206E2E146CEA0CC9EE86D914136F8C4C1854A0D11F5C7818ED1E612B77C0ED7EF002207EC0106D0A195E338656810D3AF1DDC0B966EFC26457EA0C8178601BD48B50948114819863812B0B9EA1F48EF5297D2F4EE1119BD87283146ABD3AD2BD443171175B7E7FD6C0BF547A6C5A78F9EA7D0731303030303030E1F1"`
      );
    });
  });

  describe('Test sign message', () => {
    it('sign Hello XRP', async () => {
      const message = 'Hello XRP';
      const signData = {
        transport,
        appPrivateKey: props.appPrivateKey,
        appId: props.appId,
        message,
        addressIndex: 0,
        confirmCB: () => {},
        authorizedCB: () => {},
      };

      expect(await xrpSDK.signMessage(signData)).toMatchInlineSnapshot(
        `"30450221008EBF9D0AA6A38160717CC7774CA9F64D6975C2B814CA1EF7C8A015ED6BA4488B022053231B762184A9534ADF43BF46100CC69CD1E7E4C4140DF11812CCA5BD0C4366"`
      );
    });
  });

  describe('Test Trust Set RLUSD', () => {
    it('trust set with RLUSD token', async () => {
      const signData = {
        transport,
        appPrivateKey: props.appPrivateKey,
        appId: props.appId,
        addressIndex: 0,
        tokenPayment: {
          TransactionType: 'TrustSet',
          Flags: 2147483648,
          Sequence: 82710910,
          LastLedgerSequence: 94113337,
          Fee: '10',
          Token: {
            name: 'RLUSD',
            code: '524C555344000000000000000000000000000000',
            issuer: 'rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De',
            value: '1000000000',
          },
        },
        confirmCB: () => {},
        authorizedCB: () => {},
      };

      expect(await xrpSDK.signTrustSet(signData)).toMatchInlineSnapshot(
        `"12001422800000002404EE117E201B059C0E3963D6C38D7EA4C68000524C555344000000000000000000000000000000E5E961C6A025C9404AA7B662DD1DF975BE75D13E68400000000000000A7321035659B8E4B0D46DC5B22F62EF6211206C2F9AA4C28689217BE99FDD5C706516F17446304402201DE7855C2222B3C499889457917332AA6BA85AFDCC46FF4208789B4BA7ABDC0002207C24050D0BFF666830DE535EF0D54A13E0E065F25BC4D79BB43CCE65C5D326538114819863812B0B9EA1F48EF5297D2F4EE1119BD872"`
      );
    });
  });

  describe('Test IOU Transfer RLUSD', () => {
    it('iou transfer with RLUSD token', async () => {
      const signData = {
        transport,
        appPrivateKey: props.appPrivateKey,
        appId: props.appId,
        addressIndex: 0,
        iouPayment: {
          TransactionType: 'Payment',
          Flags: 2147483648,
          Sequence: 82710910,
          LastLedgerSequence: 94113337,
          Fee: '10',
          Destination: 'rwjPKE7LqyYYcccwRoJLuGn7TA1Jyw5c6v',
          Token: {
            name: 'RLUSD',
            code: '524C555344000000000000000000000000000000',
            issuer: 'rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De',
            value: '100',
          },
        },
        confirmCB: () => {},
        authorizedCB: () => {},
      };

      expect(await xrpSDK.signIouTransfer(signData)).toMatchInlineSnapshot(
        `"12000022800000002404EE117E201B059C0E3961D5038D7EA4C68000524C555344000000000000000000000000000000E5E961C6A025C9404AA7B662DD1DF975BE75D13E68400000000000000A7321035659B8E4B0D46DC5B22F62EF6211206C2F9AA4C28689217BE99FDD5C706516F174473045022100EFA90B162D936A2E6145F39AF28F8ADFACEB95FCE4D72F9760C56B0DFC6EFA5B0220393D506879C5D7398B0F19FDB6A44676700E00B68ACF8CBCB33DE1462F6A27668114819863812B0B9EA1F48EF5297D2F4EE1119BD87283146ABD3AD2BD443171175B7E7FD6C0BF547A6C5A78"`
      );
    });
  });
});
