import { Account } from "@ledgerhq/types-live";
import { BitcoinTransaction as WalletAPITransaction } from "@ledgerhq/wallet-api-core";
import BigNumber from "bignumber.js";
import btc from "./walletApiAdapter";

describe("getPlatformTransactionSignFlowInfos", () => {
  describe("should properly get infos for BTC platform tx", () => {
    test("without fees provided", () => {
      const btcPlatformTx: WalletAPITransaction = {
        family: "bitcoin",
        amount: new BigNumber(100000),
        recipient: "0xABCDEF",
      };

      const { canEditFees, hasFeesProvided, liveTx } = btc.getWalletAPITransactionSignFlowInfos({
        walletApiTransaction: btcPlatformTx,
        account: {} as Account,
      });

      expect(canEditFees).toBe(true);

      expect(hasFeesProvided).toBe(false);

      expect(liveTx).toMatchInlineSnapshot(`
{
  "amount": "100000",
  "family": "bitcoin",
  "feePerByte": null,
  "feesStrategy": "medium",
  "networkInfo": null,
  "rbf": false,
  "recipient": "0xABCDEF",
  "useAllAmount": false,
  "utxoStrategy": {
    "excludeUTXOs": [],
    "strategy": 0,
  },
}
`);
    });

    test("with fees provided", () => {
      const btcPlatformTx: WalletAPITransaction = {
        family: "bitcoin",
        amount: new BigNumber(100000),
        recipient: "0xABCDEF",
        feePerByte: new BigNumber(300),
      };

      const { canEditFees, hasFeesProvided, liveTx } = btc.getWalletAPITransactionSignFlowInfos({
        walletApiTransaction: btcPlatformTx,
        account: {} as Account,
      });

      expect(canEditFees).toBe(true);

      expect(hasFeesProvided).toBe(true);

      expect(liveTx).toMatchInlineSnapshot(`
{
  "amount": "100000",
  "family": "bitcoin",
  "feePerByte": "300",
  "feesStrategy": null,
  "networkInfo": null,
  "rbf": false,
  "recipient": "0xABCDEF",
  "useAllAmount": false,
  "utxoStrategy": {
    "excludeUTXOs": [],
    "strategy": 0,
  },
}
`);
    });

    test("with opReturnData provided", () => {
      const btcPlatformTx: WalletAPITransaction = {
        family: "bitcoin",
        amount: new BigNumber(100000),
        recipient: "0xABCDEF",
        opReturnData: Buffer.from("hello world"),
      };

      const { canEditFees, hasFeesProvided, liveTx } = btc.getWalletAPITransactionSignFlowInfos({
        walletApiTransaction: btcPlatformTx,
        account: {} as Account,
      });

      expect(canEditFees).toBe(true);

      expect(hasFeesProvided).toBe(false);

      expect(liveTx).toMatchInlineSnapshot(`
{
  "amount": "100000",
  "family": "bitcoin",
  "feePerByte": null,
  "feesStrategy": "medium",
  "networkInfo": null,
  "opReturnData": {
    "data": [
      104,
      101,
      108,
      108,
      111,
      32,
      119,
      111,
      114,
      108,
      100,
    ],
    "type": "Buffer",
  },
  "rbf": false,
  "recipient": "0xABCDEF",
  "useAllAmount": false,
  "utxoStrategy": {
    "excludeUTXOs": [],
    "strategy": 0,
  },
}
`);
    });

    test("with changeAddress provided", () => {
      const btcPlatformTx: WalletAPITransaction = {
        family: "bitcoin",
        amount: new BigNumber(100000),
        recipient: "0xABCDEF",
        changeAddress: "1ChangeAddressExample",
      };

      const { canEditFees, hasFeesProvided, liveTx } = btc.getWalletAPITransactionSignFlowInfos({
        walletApiTransaction: btcPlatformTx,
        account: {} as Account,
      });

      expect(canEditFees).toBe(true);

      expect(hasFeesProvided).toBe(false);

      expect(liveTx).toMatchInlineSnapshot(`
{
  "amount": "100000",
  "changeAddress": "1ChangeAddressExample",
  "family": "bitcoin",
  "feePerByte": null,
  "feesStrategy": "medium",
  "networkInfo": null,
  "rbf": false,
  "recipient": "0xABCDEF",
  "useAllAmount": false,
  "utxoStrategy": {
    "excludeUTXOs": [],
    "strategy": 0,
  },
}
`);
    });
  });
});
