import { Account } from "@ledgerhq/types-live";
import { PolkadotTransaction as PlatformTransaction } from "@ledgerhq/wallet-api-core";
import BigNumber from "bignumber.js";
import dot from "./walletApiAdapter";

describe("getWalletAPITransactionSignFlowInfos", () => {
  describe("should properly get infos for DOT platform tx", () => {
    it("with most basic tx", () => {
      const dotPlatformTx: PlatformTransaction = {
        family: "polkadot",
        amount: new BigNumber(100000),
        recipient: "0xABCDEF",
        mode: "send",
      };

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

      expect(canEditFees).toBe(true);

      expect(hasFeesProvided).toBe(false);

      expect(liveTx).toMatchInlineSnapshot(`
{
  "amount": "100000",
  "era": null,
  "family": "polkadot",
  "fees": null,
  "mode": "send",
  "numSlashingSpans": 0,
  "recipient": "0xABCDEF",
  "rewardDestination": null,
  "useAllAmount": false,
  "validators": [],
}
`);
    });

    it("with era provided", () => {
      const dotPlatformTx: PlatformTransaction = {
        family: "polkadot",
        amount: new BigNumber(100000),
        recipient: "0xABCDEF",
        mode: "send",
        era: 1,
      };

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

      expect(canEditFees).toBe(true);

      expect(hasFeesProvided).toBe(false);

      expect(liveTx).toMatchInlineSnapshot(`
{
  "amount": "100000",
  "era": "1",
  "family": "polkadot",
  "fees": null,
  "mode": "send",
  "numSlashingSpans": 0,
  "recipient": "0xABCDEF",
  "rewardDestination": null,
  "useAllAmount": false,
  "validators": [],
}
`);
    });

    it("with mode provided", () => {
      const dotPlatformTx: PlatformTransaction = {
        family: "polkadot",
        amount: new BigNumber(100000),
        recipient: "0xABCDEF",
        mode: "bond",
      };

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

      expect(canEditFees).toBe(true);

      expect(hasFeesProvided).toBe(false);

      expect(liveTx).toMatchInlineSnapshot(`
{
  "amount": "100000",
  "era": null,
  "family": "polkadot",
  "fees": null,
  "mode": "bond",
  "numSlashingSpans": 0,
  "recipient": "0xABCDEF",
  "rewardDestination": null,
  "useAllAmount": false,
  "validators": [],
}
`);
    });

    it("with fees provided", () => {
      const dotPlatformTx: PlatformTransaction = {
        family: "polkadot",
        amount: new BigNumber(100000),
        recipient: "0xABCDEF",
        mode: "send",
        fee: new BigNumber(300),
      };

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

      expect(canEditFees).toBe(true);

      expect(hasFeesProvided).toBe(true);

      expect(liveTx).toMatchInlineSnapshot(`
{
  "amount": "100000",
  "era": null,
  "family": "polkadot",
  "fees": "300",
  "feesStrategy": null,
  "mode": "send",
  "numSlashingSpans": 0,
  "recipient": "0xABCDEF",
  "rewardDestination": null,
  "useAllAmount": false,
  "validators": [],
}
`);
    });
  });
});
