/**
 * 格式化工具函数
 */

/**
 * 格式化流量（MB -> GB/MB）
 * @param mb 流量（MB）
 * @param decimal 保留小数位数
 */
export function formatFlow(mb: number | undefined, decimal = 2): string {
  if (mb === undefined || mb === null) return '-'

  if (mb >= 1024) {
    return `${(mb / 1024).toFixed(decimal)} GB`
  }
  return `${mb.toFixed(decimal)} MB`
}

/**
 * 格式化金额（分 -> 元）
 * @param fen 金额（分）
 * @param showSymbol 是否显示货币符号
 */
export function formatMoney(fen: number | undefined, showSymbol = true): string {
  if (fen === undefined || fen === null) return '-'

  const yuan = (fen / 100).toFixed(2)
  return showSymbol ? `¥${yuan}` : yuan
}

/**
 * 格式化手机号（中间4位隐藏）
 * @param phone 手机号
 */
export function formatPhone(phone: string | undefined): string {
  if (!phone) return '-'

  return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2')
}

/**
 * 格式化ICCID（显示前5位和后4位）
 * @param iccid ICCID
 */
export function formatIccid(iccid: string | undefined): string {
  if (!iccid) return '-'

  if (iccid.length > 10) {
    return `${iccid.substring(0, 5)}...${iccid.substring(iccid.length - 4)}`
  }
  return iccid
}

/**
 * 格式化ICCID（完整显示，带分隔符）
 * @param iccid ICCID
 */
export function formatIccidFull(iccid: string | undefined): string {
  if (!iccid) return '-'

  // 每4位添加一个空格
  return iccid.replace(/(\d{4})(?=\d)/g, '$1 ')
}

/**
 * 格式化百分比
 * @param value 数值
 * @param total 总数
 * @param decimal 保留小数位数
 */
export function formatPercentage(
  value: number | undefined,
  total: number | undefined,
  decimal = 2
): string {
  if (value === undefined || total === undefined || total === 0) return '-'

  const percentage = ((value / total) * 100).toFixed(decimal)
  return `${percentage}%`
}

/**
 * 格式化时长（秒 -> 时分秒）
 * @param seconds 秒数
 */
export function formatDuration(seconds: number | undefined): string {
  if (seconds === undefined || seconds === null) return '-'

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

  const parts: string[] = []
  if (hours > 0) parts.push(`${hours}时`)
  if (minutes > 0) parts.push(`${minutes}分`)
  if (secs > 0 || parts.length === 0) parts.push(`${secs}秒`)

  return parts.join('')
}

/**
 * 格式化文件大小
 * @param bytes 字节数
 * @param decimal 保留小数位数
 */
export function formatFileSize(bytes: number | undefined, decimal = 2): string {
  if (bytes === undefined || bytes === null) return '-'

  const units = ['B', 'KB', 'MB', 'GB', 'TB']
  let size = bytes
  let unitIndex = 0

  while (size >= 1024 && unitIndex < units.length - 1) {
    size /= 1024
    unitIndex++
  }

  return `${size.toFixed(decimal)} ${units[unitIndex]}`
}

/**
 * 格式化数字（添加千分位）
 * @param num 数字
 */
export function formatNumber(num: number | undefined): string {
  if (num === undefined || num === null) return '-'

  return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',')
}

/**
 * 隐藏银行卡号（显示前4位和后4位）
 * @param cardNo 银行卡号
 */
export function formatBankCard(cardNo: string | undefined): string {
  if (!cardNo) return '-'

  if (cardNo.length > 8) {
    const stars = '*'.repeat(cardNo.length - 8)
    return `${cardNo.substring(0, 4)} ${stars} ${cardNo.substring(cardNo.length - 4)}`
  }
  return cardNo
}

/**
 * 格式化日期范围
 * @param startDate 开始日期
 * @param endDate 结束日期
 */
export function formatDateRange(startDate: string, endDate: string): string {
  if (!startDate || !endDate) return '-'

  return `${startDate} ~ ${endDate}`
}

/**
 * 格式化日期时间
 * @param date 日期字符串或时间戳
 * @param format 格式化模板，默认 'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的日期字符串
 */
export function formatDateTime(
  date: string | number | Date | undefined | null,
  format: string = 'YYYY-MM-DD HH:mm:ss'
): string {
  if (!date) return '-'

  const d = new Date(date)
  if (isNaN(d.getTime())) return '-'

  const year = d.getFullYear()
  const month = String(d.getMonth() + 1).padStart(2, '0')
  const day = String(d.getDate()).padStart(2, '0')
  const hours = String(d.getHours()).padStart(2, '0')
  const minutes = String(d.getMinutes()).padStart(2, '0')
  const seconds = String(d.getSeconds()).padStart(2, '0')

  return format
    .replace('YYYY', String(year))
    .replace('MM', month)
    .replace('DD', day)
    .replace('HH', hours)
    .replace('mm', minutes)
    .replace('ss', seconds)
}

/**
 * 格式化费率（基点 -> 百分比）
 * @param basisPoints 费率基点（100基点=1%）
 * @param decimal 保留小数位数
 */
export function formatFeeRate(basisPoints: number | undefined, decimal = 2): string {
  if (basisPoints === undefined || basisPoints === null) return '-'

  const percentage = (basisPoints / 100).toFixed(decimal)
  return `${percentage}%`
}
