import { BigNumber, utils } from 'tronweb'

/** Tron Mainnet，与 WalletConnect CAIP-2 一致，见 https://docs.walletconnect.network/wallet-sdk/chain-support/tron */
export const TRON_MAINNET_CAIP2 = 'tron:0x2b6653dc' as const

/** rpcMap key（不含 tron: 前缀） */
export const TRON_MAINNET_CHAIN_ID_HEX = '0x2b6653dc'

/** 与 `session.namespaces.tron.accounts` 中单条 CAIP-10 格式一致（用于 tron_signTransaction 的 address） */
export function tronMainnetCaip10Account(base58Address: string): string {
  return `${TRON_MAINNET_CAIP2}:${base58Address}`
}

/**
 * Tether 在波场主网发行的官方 USDT（TRC20）合约。
 * Base58 区分大小写；常见笔误 GTCi 与正确 GTci 为不同地址。
 * @see https://tether.to
 */
export const TRC20_USDT_OFFICIAL_MAINNET = 'TR7NHqjeKQxGTci8q8ZY4pL8otSzgjLj6t' as const

export function isTronDepositNetwork(protocol: string, networkName: string): boolean {
  const p = protocol.toLowerCase().trim()
  const n = networkName.toLowerCase().trim()
  return p.includes('tron') || n === 'trc20'
}

/**
 * 将 WalletConnect 会话里的 tron CAIP-10 账户转为 Base58（T 开头）地址。
 * 兼容：`tron:<chain>:T…`、部分钱包返回的 `tron:<chain>:0x41…`（或 41… hex）。
 */
export function parseTronCaip10Address(accountStr: string): string | null {
  const trimmed = accountStr.trim()
  if (!trimmed) {
    return null
  }
  const parts = trimmed.split(':').map((p) => p.trim())
  if (parts.length < 3 || parts[0].toLowerCase() !== 'tron') {
    return null
  }
  const last = parts[parts.length - 1]
  if (!last) {
    return null
  }
  if (last.startsWith('T')) {
    if (utils.address.isAddress(last)) {
      return last
    }
    return null
  }

  let hexBody = last
  if (hexBody.startsWith('0x') || hexBody.startsWith('0X')) {
    hexBody = hexBody.slice(2)
  }
  if (!/^[a-fA-F0-9]+$/.test(hexBody)) {
    return null
  }
  // 部分钱包给 20 字节公钥哈希（40 hex），需补 Tron 地址前缀字节 0x41
  if (hexBody.length === 40) {
    hexBody = `41${hexBody}`
  }
  if (!utils.isHex(hexBody)) {
    return null
  }
  try {
    // 须传「无 0x」的 hex：若再包一层 0x，fromHex 会把 0x 换成 41 导致重复前缀
    const base58 = utils.address.fromHex(hexBody)
    if (typeof base58 === 'string' && utils.address.isAddress(base58)) {
      return base58
    }
  } catch {
    return null
  }
  return null
}

/** 充值子币种是否为 USDT/TUSDT（波场 TRC20 充值场景） */
export function isTronRechargeUsdtSymbol(coinName: string): boolean {
  const u = coinName.toUpperCase().trim()
  return u === 'USDT' || u === 'TUSDT'
}

/** USDT-TRC20 常用精度 */
export const TRC20_USDT_DECIMALS = 6

/**
 * 将十进制金额字符串转为 TRC20 最小单位整数字符串（无小数）
 */
export function trc20AmountToMinUnits(amountStr: string, decimals: number): string {
  const s = amountStr.trim()
  if (!s || !Number.isFinite(Number(s))) {
    throw new Error('充值金额无效')
  }
  return new BigNumber(s).times(new BigNumber(10).pow(decimals)).integerValue(BigNumber.ROUND_DOWN).toFixed(0)
}

/** TRX 转账数量：人类可读 TRX → SUN（1 TRX = 1e6 SUN） */
export function trxToSunAmount(amountStr: string): number {
  const sun = new BigNumber(amountStr.trim()).times(1_000_000)
  const n = sun.integerValue(BigNumber.ROUND_DOWN).toNumber()
  if (!Number.isFinite(n) || n <= 0) {
    throw new Error('充值金额无效')
  }
  return n
}
