import type { Page, Stake } from "@ledgerhq/coin-module-framework/api/types";
import { apiClient } from "../network/api";

/**
 * Fetch stakes for a given Hedera account.
 */
export async function getStakes(address: string): Promise<Page<Stake>> {
  const mirrorAccount = await apiClient.getAccount(address);
  const stakedNodeId = mirrorAccount.staked_node_id;

  if (typeof stakedNodeId !== "number") {
    return { items: [] };
  }

  // -1 is used by the mirror node to indicate the account is no longer delegated
  // to any node (e.g. after an undelegation). In that case we skip the node lookup.
  const delegatedNode = stakedNodeId >= 0 ? await apiClient.getNode(stakedNodeId) : null;
  const balance = BigInt(mirrorAccount.balance.balance);
  const pendingReward = BigInt(mirrorAccount.pending_reward);

  const stake: Stake = {
    uid: address,
    address,
    asset: { type: "native" },
    state: delegatedNode ? "active" : "inactive",
    amount: balance + pendingReward,
    amountDeposited: balance,
    amountRewarded: pendingReward,
    details: {
      stakedNodeId,
      overstaked: delegatedNode
        ? BigInt(delegatedNode.stake) >= BigInt(delegatedNode.max_stake)
        : null,
    },
    ...(delegatedNode && {
      delegate: delegatedNode.node_account_id,
    }),
  };

  return { items: [stake] };
}
