import { getCurrentNearPreloadData } from "@ledgerhq/coin-near/preload";
import { FIGMENT_NEAR_VALIDATOR_ADDRESS } from "@ledgerhq/coin-near/constants";
import { canStake, canUnstake } from "@ledgerhq/coin-near/logic";
import type { NearAccount, NearValidatorItem } from "@ledgerhq/coin-near/types";

export interface AccountBannerState {
  display: boolean;
  redelegate: boolean;
  validatorId: string;
  ledgerValidator: NearValidatorItem | undefined;
}

export function getAccountBannerState(account: NearAccount): AccountBannerState {
  // Group current validator
  const nearResources = account.nearResources ? account.nearResources : { stakingPositions: [] };

  const delegations = nearResources?.stakingPositions.map(delegation => {
    return delegation;
  });

  // Get ledger validator data
  const { validators } = getCurrentNearPreloadData() ?? {
    validators: [],
  };

  const ledgerValidator = validators.find(
    validator => validator.validatorAddress === FIGMENT_NEAR_VALIDATOR_ADDRESS,
  );

  // If Ledger doesn't provide validator, we don't display banner
  if (!ledgerValidator) {
    return {
      display: false,
      redelegate: false,
      validatorId: "",
      ledgerValidator: undefined,
    };
  }

  let redelegate = false;
  let validatorId = "";
  let display = false;

  // Find user current worst validator (default validator is ledger)
  let worstValidator = ledgerValidator;
  for (const delegation of delegations) {
    const validatorAdress = delegation?.validatorId;
    const validator = validators.find(validator => validator.validatorAddress === validatorAdress);
    const isValidRedelegation =
      validator &&
      validatorAdress !== ledgerValidator.validatorAddress &&
      validator.commission &&
      worstValidator.commission &&
      worstValidator?.commission <= validator?.commission &&
      canUnstake(delegation);
    if (isValidRedelegation) {
      validatorId = delegation.validatorId;
      worstValidator = validator;
    }
  }
  if (worstValidator) {
    if (worstValidator?.validatorAddress === ledgerValidator?.validatorAddress) {
      if (canStake(account)) {
        display = true;
      }
    } else {
      redelegate = true;
      display = true;
    }
  }

  return {
    display,
    redelegate,
    validatorId,
    ledgerValidator,
  };
}
