/**
 * 统一时间戳解析与格式化 — 根治前端时间显示 NaN 问题
 *
 * 后端 (df-storage) 统一以「毫秒数字字符串」存储 created_at / updated_at
 * （见 src-tauri now_millis：`SystemTime::now().as_millis().to_string()`）。
 *
 * 陷阱：`new Date("1718000000000")` 返回 Invalid Date —— JS 规范只对 number 类型
 * 按时间戳解析，纯数字字符串走日期字符串解析路径会失败 → getTime() = NaN
 * → `"{n} 天前".format(NaN)` = "NaN 天前"。
 *
 * 正确做法：先转 number 再 new Date。本模块统一处理毫秒字符串 / 秒级 / ISO / number / 空。
 */

import { t, currentLocale } from '@/i18n/i18n-helpers'

// CR-260615-08(P1-10):相对时间走 i18n(原硬编码中文,en locale 时间恒中文)。
// 类型安全访问经 i18n-helpers 收口(规避 vue-i18n TS2589)。

/** 解析任意时间值为毫秒时间戳；无效或空返回 null(仅本模块内部使用) */
function parseTs(v: string | number | null | undefined): number | null {
  if (v == null) return null
  if (typeof v === 'number') {
    if (!Number.isFinite(v)) return null
    return v > 1e12 ? v : v * 1000 // 秒级 → 毫秒
  }
  const s = String(v).trim()
  if (!s) return null
  // 纯数字字符串：> 1e12 视为毫秒，否则秒
  if (/^\d+$/.test(s)) {
    const n = Number(s)
    return n > 1e12 ? n : n * 1000
  }
  // ISO / 其他日期字符串
  const ms = new Date(s).getTime()
  return isNaN(ms) ? null : ms
}

/** 绝对日期 'YYYY/MM/DD HH:mm'；无效返回 '—' */
export function formatDate(v: string | number | null | undefined): string {
  const ms = parseTs(v)
  if (ms == null) return '—'
  const d = new Date(ms)
  const locale = currentLocale() === 'en' ? 'en-US' : 'zh-CN'
  return d.toLocaleDateString(locale) + ' ' + d.toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit' })
}

/** 相对时间(走 i18n:justNow/minutesAgo/hoursAgo/dayAgo；en/zh 双语)；无效返回 '—' */
export function formatRelative(v: string | number | null | undefined): string {
  const ms = parseTs(v)
  if (ms == null) return '—'
  const diffMin = Math.floor((Date.now() - ms) / 60000)
  if (diffMin < 1) return t('common.justNow')
  if (diffMin < 60) return t('common.minutesAgo', { n: diffMin })
  const diffH = Math.floor(diffMin / 60)
  if (diffH < 24) return t('common.hoursAgo', { n: diffH })
  const diffD = Math.floor(diffH / 24)
  return t('common.dayAgo', { n: diffD })
}
