import { calculateSigHash, getTransferArgumentBuffer, getUtxoArgumentBuffer, SIGHASH_ALL } from '../hash';
import {
  testMaxTransaction,
  testSendToV1AddressTransaction,
  testSendToV8AddressTransaction,
  testTransaction,
} from './testData';


  describe('Test KAS SDK', () => {
  it('Test getTransferArgument with v0 output address', async () => {
    console.log('transaction: ' + JSON.stringify(testTransaction, null, 2));
    const transferArgumentBuf = await getTransferArgumentBuffer(testTransaction);
    expect(transferArgumentBuf.toString('hex')).toMatchInlineSnapshot(
      `"0000b9040cd6c2cc517e2684744b61b9defaeb670312759d8a778007ab72c5d06e020f99135614633e507969d12522c80f967cff6ebc0436863e02ee42b2b66556fc8523b0471bcbea04575ccaa635eef9f9114f2890bda54367e5ff8caa3878bf820000000013006800000a3da6e8c7a8795440e60e4662686bc17cd965780095604c85d8d137e0f48079e803000000000000000022000000000000000122c8668c0000000000165472616e73616374696f6e5369676e696e6748617368328000002c8001b207800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"`
    );
  });

  it('Test getTransferArgument with v1 output address', async () => {
    console.log('transaction: ' + JSON.stringify(testSendToV1AddressTransaction, null, 2));
    const transferArgumentBuf = await getTransferArgumentBuffer(testSendToV1AddressTransaction);
    expect(transferArgumentBuf.toString('hex')).toMatchInlineSnapshot(
      `"0000b9040cd6c2cc517e2684744b61b9defaeb670312759d8a778007ab72c5d06e020f99135614633e507969d12522c80f967cff6ebc0436863e02ee42b2b66556fc8523b0471bcbea04575ccaa635eef9f9114f2890bda54367e5ff8caa3878bf82000000001300690103b1b89146cea93cf8bec6fa3d4d79c26586ac09a1e8ebf37aa5904629f63c857de803000000000000000023000000000000000122c8668c0000000000165472616e73616374696f6e5369676e696e6748617368328000002c8001b207800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"`
    );
  });

  it('Test getTransferArgument with v8 output address', async () => {
    console.log('transaction: ' + JSON.stringify(testSendToV8AddressTransaction, null, 2));
    const transferArgumentBuf = await getTransferArgumentBuffer(testSendToV8AddressTransaction);
    expect(transferArgumentBuf.toString('hex')).toMatchInlineSnapshot(
      `"0000b9040cd6c2cc517e2684744b61b9defaeb670312759d8a778007ab72c5d06e020f99135614633e507969d12522c80f967cff6ebc0436863e02ee42b2b66556fc8523b0471bcbea04575ccaa635eef9f9114f2890bda54367e5ff8caa3878bf82000000001300690200b815f3841cfb87b8fd834b2c1cba9a8790fb5f568cc7b3a377acd71350d08691e803000000000000000023000000000000000122c8668c0000000000165472616e73616374696f6e5369676e696e6748617368328000002c8001b207800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"`
    );
  });

  it('Test getTransferArgument for max', async () => {
    console.log('transaction: ' + JSON.stringify(testMaxTransaction, null, 2));
    const transferArgumentBuf = await getTransferArgumentBuffer(testMaxTransaction);
    expect(transferArgumentBuf.toString('hex')).toMatchInlineSnapshot(
      `"0000b9040cd6c2cc517e2684744b61b9defaeb670312759d8a778007ab72c5d06e020f99135614633e507969d12522c80f967cff6ebc0436863e02ee42b2b66556fc8523b0471bcbea04575ccaa635eef9f9114f2890bda54367e5ff8caa3878bf820000000013003400000a3da6e8c7a8795440e60e4662686bc17cd965780095604c85d8d137e0f4807916e8668c000000000000220000000000000000000000000000000000165472616e73616374696f6e5369676e696e6748617368000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"`
    );
  });

  it('Test getUtxoArgument', async () => {
    const index = 0;
    const utxo = testTransaction.utxos[index];
    const input = testTransaction.inputs[index];
    console.log('index: ' + index);
    console.log('utxo: ' + JSON.stringify(utxo, null, 2));
    console.log('input: ' + JSON.stringify(utxo, null, 2));
    const utxoArgumentBuf = await getUtxoArgumentBuffer(input, utxo);
    const utxoArgument = utxoArgumentBuf.toString('hex');
    expect(utxoArgument).toMatchInlineSnapshot(
      `"15328000002c8001b20780000000000000000000000021aa1aff85fc054381f8536d1ab8dbe68f1673a7c67b7ad7816431603c58d32e010000000000220000000000000020b1b89146cea93cf8bec6fa3d4d79c26586ac09a1e8ebf37aa5904629f63c857daccef3668c00000000000000000000000001"`
    );
  });

  it('Test before sign schnorr', async () => {
    testTransaction.inputs.forEach((_input, index) => {
      const sigHashBuffer = calculateSigHash(testTransaction, SIGHASH_ALL, index, {});
      const sigHash = sigHashBuffer.toString('hex');
      expect(sigHash).toMatchInlineSnapshot(`"5f0fff866d90ff84dbad16155f93fc02811ac97b033c50123c27af46d715ba7d"`);
    });
  });
});
