/**
 * 资产信息格式化工具函数
 */

import type { Ref } from 'vue'

export function useAssetFormatters(deviceRealtime?: Ref<any>) {
  // 格式化数据大小（MB转GB/MB）
  const formatDataSize = (mb: number) => {
    if (mb >= 1024) {
      return `${(mb / 1024).toFixed(2)}GB`
    }
    return `${mb.toFixed(2)}MB`
  }

  // 格式化金额（分转元）
  const formatAmount = (amount: number | undefined) => {
    if (amount === undefined || amount === null) return '¥0.00'
    const yuan = amount / 100
    return `¥${yuan.toFixed(2)}`
  }

  // 格式化时长（秒转为时分秒）
  const formatDuration = (seconds?: string) => {
    if (!seconds) return '-'
    const sec = Number(seconds)
    if (isNaN(sec)) return '-'

    const hours = Math.floor(sec / 3600)
    const minutes = Math.floor((sec % 3600) / 60)
    const secs = sec % 60

    if (hours > 0) {
      return `${hours}小时${minutes}分${secs}秒`
    } else if (minutes > 0) {
      return `${minutes}分${secs}秒`
    } else {
      return `${secs}秒`
    }
  }

  // 格式化ICCID为4位一组，用横杠分隔
  const formatIccidWithDashes = (iccid: string) => {
    if (!iccid) return ''
    return iccid.replace(/(\d{4})(?=\d)/g, '$1-')
  }

  // 获取实名状态名称
  const getRealNameStatusName = (status?: number) => {
    if (status === undefined || status === null) return '未知'
    const statusMap: Record<number, string> = {
      0: '未实名',
      1: '已实名'
    }
    return statusMap[status] || '未知'
  }

  // 获取实名状态标签类型
  const getRealNameStatusType = (status?: number): 'info' | 'success' | 'warning' | 'danger' => {
    if (status === undefined || status === null) return 'info'
    const map: Record<number, 'info' | 'success' | 'warning' | 'danger'> = {
      0: 'info',
      1: 'success'
    }
    return map[status] || 'info'
  }

  // 获取资产状态名称
  const getAssetStatusName = (status?: number) => {
    if (status === undefined || status === null) return '未知'
    const map: Record<number, string> = {
      1: '在库',
      2: '已分销',
      3: '已激活',
      4: '已停用'
    }
    return map[status] || '未知'
  }

  // 获取资产状态标签类型
  const getAssetStatusType = (
    status?: number
  ): 'primary' | 'success' | 'warning' | 'info' | 'danger' => {
    if (status === undefined || status === null) return 'info'
    const map: Record<number, 'primary' | 'success' | 'warning' | 'info' | 'danger'> = {
      1: 'info', // 在库
      2: 'success', // 已分销
      3: 'success', // 已激活
      4: 'danger' // 已停用
    }
    return map[status] || 'info'
  }

  // 获取在线状态名称
  const getOnlineStatusName = (status?: number) => {
    const map: Record<number, string> = {
      0: '未知',
      1: '在线',
      2: '离线'
    }
    return map[status ?? 0] || '未知'
  }

  // 获取在线状态标签类型
  const getOnlineStatusType = (
    status?: number
  ): 'primary' | 'success' | 'warning' | 'info' | 'danger' => {
    const map: Record<number, 'primary' | 'success' | 'warning' | 'info' | 'danger'> = {
      0: 'info', // 未知
      1: 'success', // 在线
      2: 'danger' // 离线
    }
    return map[status ?? 0] || 'info'
  }

  // 获取钱包状态标签类型
  const getWalletStatusType = (status?: number) => {
    const map: Record<number, any> = {
      1: 'success', // 正常
      2: 'warning', // 冻结
      3: 'danger' // 关闭
    }
    return map[status || 1] || 'info'
  }

  // 获取套餐状态标签类型
  const getPackageStatusTagType = (
    status?: number
  ): 'primary' | 'success' | 'warning' | 'info' | 'danger' => {
    if (status === undefined || status === null) return 'info'
    const map: Record<number, 'primary' | 'success' | 'warning' | 'info' | 'danger'> = {
      0: 'info', // 待生效
      1: 'success', // 生效中
      2: 'warning', // 已用完
      3: 'danger', // 已过期
      4: 'info' // 已失效
    }
    return map[status] || 'info'
  }

  // 计算信号强度等级（基于RSSI、RSRP、RSRQ）
  const calculateSignalStrength = () => {
    if (!deviceRealtime?.value) return '-'

    const rssi = deviceRealtime.value.rssi ? Number(deviceRealtime.value.rssi) : null
    const rsrp = deviceRealtime.value.rsrp ? Number(deviceRealtime.value.rsrp) : null

    // 优先使用RSRP判断（更准确）
    // RSRP范围通常在-140到-44 dBm之间，0或正值表示无效数据
    if (rsrp !== null && !isNaN(rsrp) && rsrp < 0) {
      if (rsrp >= -80) return '优秀'
      if (rsrp >= -90) return '良好'
      if (rsrp >= -100) return '一般'
      if (rsrp >= -110) return '较差'
      return '极差'
    }

    // 其次使用RSSI
    // RSSI范围通常在-113到-51 dBm之间，0或正值表示无效数据
    if (rssi !== null && !isNaN(rssi) && rssi < 0) {
      if (rssi >= -70) return '优秀'
      if (rssi >= -85) return '良好'
      if (rssi >= -100) return '一般'
      if (rssi >= -110) return '较差'
      return '极差'
    }

    return '-'
  }

  // 获取信号强度标签类型
  const getSignalStrengthType = (): 'primary' | 'success' | 'warning' | 'info' | 'danger' => {
    const strength = calculateSignalStrength()
    const map: Record<string, 'primary' | 'success' | 'warning' | 'info' | 'danger'> = {
      优秀: 'success',
      良好: 'success',
      一般: 'warning',
      较差: 'danger',
      极差: 'danger'
    }
    return map[strength] || 'info'
  }

  // 获取切卡模式名称
  const getSwitchModeName = (mode?: string) => {
    const map: Record<string, string> = {
      '0': '自动',
      '1': '手动'
    }
    return map[mode || ''] || '-'
  }

  // 获取交易类型标签颜色
  const getTransactionTypeTag = (type: string | undefined) => {
    const map: Record<string, any> = {
      recharge: 'success', // 充值
      deduct: 'danger', // 扣款
      refund: 'warning' // 退款
    }
    return map[type || ''] || 'info'
  }

  // 获取支付状态标签类型
  const getPaymentStatusType = (status: number): 'success' | 'warning' | 'danger' | 'info' => {
    const statusMap: Record<number, 'success' | 'warning' | 'danger' | 'info'> = {
      1: 'warning', // 待支付
      2: 'success', // 已支付
      3: 'danger', // 已取消
      4: 'info' // 已关闭
    }
    return statusMap[status] || 'info'
  }

  // 计算使用进度百分比
  const getUsageProgress = (cumulative: number, total: number): number => {
    if (!total || total <= 0) return 0
    const percentage = (cumulative / total) * 100
    return Math.min(Math.round(percentage * 100) / 100, 100)
  }

  // 根据百分比获取进度条颜色
  const getProgressColorByPercentage = (percentage: number): string => {
    if (percentage < 50) return '#67c23a'
    if (percentage < 80) return '#e6a23c'
    return '#f56c6c'
  }

  return {
    formatDataSize,
    formatAmount,
    formatDuration,
    formatIccidWithDashes,
    getRealNameStatusName,
    getRealNameStatusType,
    getAssetStatusName,
    getAssetStatusType,
    getOnlineStatusName,
    getOnlineStatusType,
    getWalletStatusType,
    getPackageStatusTagType,
    calculateSignalStrength,
    getSignalStrengthType,
    getSwitchModeName,
    getTransactionTypeTag,
    getPaymentStatusType,
    getUsageProgress,
    getProgressColorByPercentage
  }
}
