// WXS 格式化工具 — WXML 中不能调用 JS 方法，需通过 WXS 桥接
// 规范：docs/miniprogram-dev/design-system/DISPLAY-STANDARDS.md

/** 数字保留 N 位小数；空值返回 '--' */
function toFixed(num, digits) {
  if (num === undefined || num === null) return '--'
  // CHANGE 2026-03-27 | 防护：传入字符串时先转数字，避免 toFixed is not a function
  var n = typeof num === 'number' ? num : parseFloat(num)
  if (isNaN(n)) return '--'
  return n.toFixed(digits)
}

/** 空值兜底；null/undefined/'' 统一返回 '--' */
function safe(val) {
  if (val === undefined || val === null || val === '') return '--'
  return val
}

/**
 * 金额格式化（WXS 版）
 * ¥12,680 / -¥368 / ¥0 / --
 */
function money(value) {
  if (value === undefined || value === null) return '--'
  if (value === 0) return '¥0'
  var abs = Math.round(Math.abs(value))
  var s = abs.toString()
  var result = ''
  var count = 0
  for (var i = s.length - 1; i >= 0; i--) {
    if (count > 0 && count % 3 === 0) result = ',' + result
    result = s[i] + result
    count++
  }
  return (value < 0 ? '-¥' : '¥') + result
}

/**
 * 计数格式化（WXS 版）
 * 零值返回 '--'；≥1000 加千分位；自动拼接单位
 */
function count(value, unit) {
  if (value === undefined || value === null || value === 0) return '--'
  var s = value.toString()
  if (value >= 1000) {
    var result = ''
    var c = 0
    for (var i = s.length - 1; i >= 0; i--) {
      if (c > 0 && c % 3 === 0) result = ',' + result
      result = s[i] + result
      c++
    }
    return result + unit
  }
  return s + unit
}

/**
 * 百分比展示（WXS 版）
 * 保留1位小数；超过100%正常展示；空值返回 '--'
 */
function percent(value) {
  if (value === undefined || value === null) return '--'
  if (value === 0) return '0%'
  var n = typeof value === 'number' ? value : parseFloat(value)
  if (isNaN(n)) return '--'
  return n.toFixed(1) + '%'
}

/**
 * 课时格式化（WXS 版）— 带"小时"后缀
 * 整数 → N小时；非整数 → N.N小时；0 → 0小时；空 → --
 */
function hours(value) {
  if (value === undefined || value === null) return '--'
  var n = typeof value === 'number' ? value : parseFloat(value)
  if (isNaN(n)) return '--'
  if (n === 0) return '0小时'
  if (n % 1 === 0) return n + '小时'
  return n.toFixed(1) + '小时'
}

/**
 * 课时纯数字（WXS 版）— 不带后缀
 * 整数 → N；非整数 → N.N；0 → 0；空 → --
 */
function hoursNum(value) {
  if (value === undefined || value === null) return '--'
  var n = typeof value === 'number' ? value : parseFloat(value)
  if (isNaN(n)) return '--'
  if (n === 0) return '0'
  if (n % 1 === 0) return '' + n
  return n.toFixed(1)
}

/**
 * 课时紧凑格式（WXS 版）— 带"h"后缀
 * 用于一行内多指标的紧凑场景（如常客列表：5次 · 12.5h · ¥1,250）
 * 整数 → Nh；非整数 → N.Nh；0 → 0h；空 → --
 */
function hoursH(value) {
  if (value === undefined || value === null) return '--'
  var n = typeof value === 'number' ? value : parseFloat(value)
  if (isNaN(n)) return '--'
  if (n === 0) return '0h'
  if (n % 1 === 0) return n + 'h'
  return n.toFixed(1) + 'h'
}

/**
 * 千分位格式化（WXS 版）
 * 1234 → 1,234；-5678 → -5,678；空 → --
 */
function thousands(value) {
  if (value === undefined || value === null) return '--'
  var neg = value < 0
  var abs = Math.round(Math.abs(value))
  var s = abs.toString()
  var result = ''
  var c = 0
  for (var i = s.length - 1; i >= 0; i--) {
    if (c > 0 && c % 3 === 0) result = ',' + result
    result = s[i] + result
    c++
  }
  return neg ? '-' + result : result
}

/**
 * 同比/环比差值格式化（WXS 版）
 * +¥1,200 / -¥800 / --
 */
function trendValue(value) {
  if (value === undefined || value === null || value === 0) return '--'
  var abs = Math.round(Math.abs(value))
  var s = abs.toString()
  var result = ''
  var c = 0
  for (var i = s.length - 1; i >= 0; i--) {
    if (c > 0 && c % 3 === 0) result = ',' + result
    result = s[i] + result
    c++
  }
  return (value > 0 ? '+¥' : '-¥') + result
}

/**
 * 天数格式化（WXS 版）
 * "3天" / "--"
 */
function days(value) {
  if (value === undefined || value === null) return '--'
  // CHANGE 2026-03-27 | 修复：0天前不应返回 '--'，0 是有效值（今天到店）
  if (value === 0) return '0天'
  return value + '天'
}

/**
 * 距今天数格式化（WXS 版）
 * "今天" / "3天前" / "--"
 */
function daysAgo(value) {
  if (value === undefined || value === null) return '--'
  if (value === 0) return '今天'
  return value + '天前'
}

/**
 * 储值等级格式化（WXS 版）
 * 无/少/一般/多/非常多
 */
function storageLevel(balance) {
  if (balance === undefined || balance === null || balance === 0) return '无'
  if (balance < 200) return '少'
  if (balance < 500) return '一般'
  if (balance < 1500) return '多'
  return '非常多'
}

/**
 * 手机号脱敏（WXS 版）
 * "13812342304" → "138****2304"；短号/空值原样返回
 */
function maskPhone(phone) {
  if (!phone || phone.length < 7) return phone || ''
  return phone.substring(0, 3) + '****' + phone.substring(phone.length - 4)
}

/**
 * 格式化负数金额（优惠减扣专用）
 * CHANGE 2026-03-27 | board-finance-phase2 T3 | 优惠总计展示为 -¥xxx 格式
 */
function negativeMoney(val) {
  var n = parseFloat(val)
  if (isNaN(n) || n === 0) return '-¥0'
  var abs = n < 0 ? -n : n
  return '-' + money(abs)
}

/**
 * 环比文本格式化：持平→灰色无箭头，新增→灰色无箭头，上升→↑，下降→↓
 */
function compareText(compare, isDown) {
  if (!compare) return ''
  if (compare === '持平') return '持平'
  if (compare === '新增') return '新增'
  return (isDown ? '↓' : '↑') + compare
}

/**
 * 环比样式类：持平/新增→flat灰色，上升→up红色，下降→down绿色
 */
function compareClass(compare, isDown, size) {
  if (!compare) return ''
  var s = size || 'xs'
  if (compare === '持平' || compare === '新增') return 'compare-text-flat-' + s
  return isDown ? ('compare-text-down-' + s) : ('compare-text-up-' + s)
}

module.exports = {
  toFixed: toFixed,
  safe: safe,
  money: money,
  count: count,
  percent: percent,
  hours: hours,
  hoursH: hoursH,
  hoursNum: hoursNum,
  thousands: thousands,
  trendValue: trendValue,
  days: days,
  daysAgo: daysAgo,
  storageLevel: storageLevel,
  maskPhone: maskPhone,
  negativeMoney: negativeMoney,
  compareText: compareText,
  compareClass: compareClass,
}
