"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.loadBlacklistedTokenSections = exports.getVotesCount = exports.clearAccount = exports.isAccountEmpty = exports.shortAddressPreview = exports.listSubAccounts = exports.isTokenAccount = exports.isAccountBalanceUnconfirmed = exports.isAccount = exports.getParentAccount = exports.getFeesUnit = exports.getFeesCurrency = exports.getAccountSpendableBalance = exports.getAccountCurrency = exports.getMainAccount = exports.flattenAccounts = exports.findTokenAccountByCurrency = exports.accountWithMandatoryTokens = void 0;
const types_1 = require("@ledgerhq/coin-bitcoin/types");
const account_1 = require("@ledgerhq/coin-framework/account");
const helpers_1 = require("@ledgerhq/coin-cosmos/helpers");
const index_1 = require("@ledgerhq/coin-cosmos/types/index");
const index_2 = require("@ledgerhq/coin-tron/index");
const index_3 = require("@ledgerhq/coin-vechain/index");
const coin_canton_1 = require("@ledgerhq/coin-canton");
const staking_1 = require("../families/tezos/staking");
const state_1 = require("@ledgerhq/cryptoassets/state");
// TODO: remove this export and prefer import from root file.
var index_4 = require("@ledgerhq/coin-framework/account/index");
Object.defineProperty(exports, "accountWithMandatoryTokens", { enumerable: true, get: function () { return index_4.accountWithMandatoryTokens; } });
Object.defineProperty(exports, "findTokenAccountByCurrency", { enumerable: true, get: function () { return index_4.findTokenAccountByCurrency; } });
Object.defineProperty(exports, "flattenAccounts", { enumerable: true, get: function () { return index_4.flattenAccounts; } });
Object.defineProperty(exports, "getMainAccount", { enumerable: true, get: function () { return index_4.getMainAccount; } });
Object.defineProperty(exports, "getAccountCurrency", { enumerable: true, get: function () { return index_4.getAccountCurrency; } });
Object.defineProperty(exports, "getAccountSpendableBalance", { enumerable: true, get: function () { return index_4.getAccountSpendableBalance; } });
Object.defineProperty(exports, "getFeesCurrency", { enumerable: true, get: function () { return index_4.getFeesCurrency; } });
Object.defineProperty(exports, "getFeesUnit", { enumerable: true, get: function () { return index_4.getFeesUnit; } });
Object.defineProperty(exports, "getParentAccount", { enumerable: true, get: function () { return index_4.getParentAccount; } });
Object.defineProperty(exports, "isAccount", { enumerable: true, get: function () { return index_4.isAccount; } });
Object.defineProperty(exports, "isAccountBalanceUnconfirmed", { enumerable: true, get: function () { return index_4.isAccountBalanceUnconfirmed; } });
Object.defineProperty(exports, "isTokenAccount", { enumerable: true, get: function () { return index_4.isTokenAccount; } });
Object.defineProperty(exports, "listSubAccounts", { enumerable: true, get: function () { return index_4.listSubAccounts; } });
Object.defineProperty(exports, "shortAddressPreview", { enumerable: true, get: function () { return index_4.shortAddressPreview; } });
const isAccountEmpty = (a) => {
    if (a.type === "Account") {
        if ((0, index_1.isCosmosAccount)(a)) {
            return (0, helpers_1.isAccountEmpty)(a);
        }
        if ((0, index_2.isTronAccount)(a)) {
            return (0, index_2.isAccountEmpty)(a);
        }
        if (a.currency.family == "vechain") {
            return (0, index_3.isAccountEmpty)(a);
        }
        if (a.currency.family == "canton") {
            return (0, coin_canton_1.isAccountEmpty)(a);
        }
    }
    return (0, account_1.isAccountEmpty)(a);
};
exports.isAccountEmpty = isAccountEmpty;
// in future, could be a per currency thing
// clear account to a bare minimal version that can be restored via sync
// will preserve the balance to avoid user panic
function clearAccount(account) {
    // FIXME add in the coins bridge a way for a coin to define extra clean up functions to modularize this.
    return (0, account_1.clearAccount)(account, (account) => {
        if ((0, index_2.isTronAccount)(account)) {
            account.tronResources = {
                ...account.tronResources,
                cacheTransactionInfoById: {},
            };
        }
        if (account.currency.family === "bitcoin") {
            account.bitcoinResources = types_1.initialBitcoinResourcesValue;
        }
    });
}
exports.clearAccount = clearAccount;
const getVotesCount = (account, parentAccount) => {
    const mainAccount = (0, account_1.getMainAccount)(account, parentAccount);
    // FIXME add this back in the coin bridge.
    switch (mainAccount.currency.family) {
        case "tezos":
            return (0, staking_1.isAccountDelegating)(account) ? 1 : 0;
        case "tron":
            return mainAccount?.tronResources?.votes.length || 0;
        case "axelar":
        case "onomy":
        case "quicksilver":
        case "stride":
        case "persistence":
        case "stargaze":
        case "nyx":
        case "secret_network":
        case "sei_network":
        case "desmos":
        case "dydx":
        case "umee":
        case "binance_beacon_chain":
        case "osmosis":
        case "cosmos":
        case "coreum":
        case "mantra":
        case "crypto_org":
        case "xion":
        case "zenrock":
        case "babylon":
            return mainAccount?.cosmosResources?.delegations.length || 0;
        default:
            return 0;
    }
};
exports.getVotesCount = getVotesCount;
/**
 * Load blacklisted tokens and organize them into sections by parent currency
 * @param tokenIds - Array of token IDs to load
 * @returns Array of sections with parent currency and tokens
 */
async function loadBlacklistedTokenSections(tokenIds) {
    const tokens = await Promise.all(tokenIds.map(tokenId => (0, state_1.getCryptoAssetsStore)().findTokenById(tokenId)));
    const sections = [];
    for (const token of tokens) {
        if (token) {
            const parentCurrency = token.parentCurrency;
            const index = sections.findIndex(s => s.parentCurrency === parentCurrency);
            if (index < 0) {
                sections.push({
                    parentCurrency,
                    tokens: [token],
                });
            }
            else {
                sections[index].tokens.push(token);
            }
        }
    }
    return sections;
}
exports.loadBlacklistedTokenSections = loadBlacklistedTokenSections;
//# sourceMappingURL=helpers.js.map