import type { TokenCurrency } from "@ledgerhq/types-cryptoassets";
import type { TokenAccount } from "@ledgerhq/types-live";
import BigNumber from "bignumber.js";
import type {
  HederaAccount,
  HederaAccountRaw,
  HederaResources,
  HederaResourcesRaw,
} from "../../types";
import { getMockedCurrency, getMockedHTSTokenCurrency } from "./currency.fixture";

const defaultMockedCurrency = getMockedCurrency();
const defaultMockedTokenCurrency = getMockedHTSTokenCurrency();
const defaultMockAccountId = "js:2:hedera:0.0.1234567:hederaBip44";
const defaultMockTokenAccountId = `${defaultMockAccountId}+${defaultMockedTokenCurrency.id}`;
const defaultBalance = new BigNumber(100000000);
const defaultTokenBalance = new BigNumber(10);

export const mockHederaResources: HederaResources = {
  maxAutomaticTokenAssociations: 0,
  isAutoTokenAssociationEnabled: false,
  delegation: null,
};

export const mockHederaResourcesRaw: HederaResourcesRaw = {
  maxAutomaticTokenAssociations: 0,
  isAutoTokenAssociationEnabled: false,
  delegation: null,
};

/**
 * default settings:
 * - account balance is 1 HBAR
 * - auto token association is disabled
 * - subAccounts array is empty (no tokens account are used)
 */
export const getMockedAccount = (overrides?: Partial<HederaAccount>): HederaAccount => {
  return {
    type: "Account",
    id: defaultMockAccountId,
    seedIdentifier: "",
    derivationMode: "",
    index: 0,
    freshAddress: "0.0.12345",
    freshAddressPath: "44/3030",
    used: false,
    balance: defaultBalance,
    spendableBalance: defaultBalance,
    creationDate: new Date(),
    blockHeight: 0,
    currency: defaultMockedCurrency,
    operationsCount: 0,
    operations: [],
    pendingOperations: [],
    lastSyncDate: new Date(),
    balanceHistoryCache: {
      HOUR: { latestDate: null, balances: [] },
      DAY: { latestDate: null, balances: [] },
      WEEK: { latestDate: null, balances: [] },
    },
    swapHistory: [],
    subAccounts: [],
    hederaResources: mockHederaResources,
    ...overrides,
  };
};

export const getMockedAccountRaw = (overrides?: Partial<HederaAccountRaw>): HederaAccountRaw => {
  return {
    id: defaultMockAccountId,
    seedIdentifier: "",
    derivationMode: "",
    index: 0,
    freshAddress: "0.0.12345",
    freshAddressPath: "44/3030",
    used: false,
    balance: defaultBalance.toString(),
    spendableBalance: defaultBalance.toString(),
    creationDate: new Date().toISOString(),
    blockHeight: 0,
    currencyId: defaultMockedCurrency.id,
    operationsCount: 0,
    operations: [],
    pendingOperations: [],
    lastSyncDate: new Date().toISOString(),
    balanceHistoryCache: {
      HOUR: { latestDate: null, balances: [] },
      DAY: { latestDate: null, balances: [] },
      WEEK: { latestDate: null, balances: [] },
    },
    swapHistory: [],
    subAccounts: [],
    hederaResources: mockHederaResourcesRaw,
    ...overrides,
  };
};

/**
 * default settings:
 * - balance is 10
 */
export const getMockedTokenAccount = (
  token: TokenCurrency,
  overrides?: Partial<TokenAccount>,
): TokenAccount => {
  return {
    type: "TokenAccount",
    id: defaultMockTokenAccountId,
    parentId: defaultMockAccountId,
    token,
    balance: defaultTokenBalance,
    spendableBalance: defaultTokenBalance,
    creationDate: new Date(),
    operations: [],
    operationsCount: 0,
    pendingOperations: [],
    swapHistory: [],
    balanceHistoryCache: {
      HOUR: { latestDate: null, balances: [] },
      DAY: { latestDate: null, balances: [] },
      WEEK: { latestDate: null, balances: [] },
    },
    ...overrides,
  };
};

export const MAINNET_TEST_ACCOUNTS = {
  pristine: {
    accountId: "0.0.800000",
    publicKey: "3608128be58bfb7e753068e0bc82430ec77e51eed578e0a7055a0bd1296fe334",
  },
  withoutTokens: {
    accountId: "0.0.8000000",
    publicKey: "96eae0821a63a138f37e0a60a83f9a0317fa11dde4d7669a62afb5ced2158141",
  },
  withTokens: {
    accountId: "0.0.8835924",
    accountIdWithErc20: "0.0.4351292",
    publicKey: "34e26415574250721e8869bd33ea2678c2bbccff5fc70bd8b0ec9239295fd2cf",
    associatedTokenWithBalance: "0.0.456858",
    associatedTokenWithoutBalance: "0.0.7243470",
    notAssociatedToken: "0.0.3176721",
    erc20Token: "0xca367694cdac8f152e33683bb36cc9d6a73f1ef2",
  },
  withQuickBalanceChanges: {
    accountId: "0.0.10176637",
  },
  activeStaking: {
    accountId: "0.0.8835924",
    publicKey: "34e26415574250721e8869bd33ea2678c2bbccff5fc70bd8b0ec9239295fd2cf",
  },
  inactiveStaking: {
    accountId: "0.0.9806001",
    publicKey: "0283ef0997da7161c9a3aec45c57f4e074cb67916c97c1e5339d9f988e702e0450",
  },
  withStakingHistory: {
    accountId: "0.0.10083165",
  },
};
