import { clsx, type ClassValue } from 'clsx';
import { twMerge } from 'tailwind-merge';

export function cn(...inputs: ClassValue[]): string {
  return twMerge(clsx(inputs));
}

/**
 * 天数可读性增强:"149" → "149 天(4 个月)";"427" → "427 天(1 年 2 个月)"。
 * 只有跨过月/年阈值才显示括号(避免"5 天(0 个月)"这种废话)。
 *
 * 规则:
 *   < 30 天     → 仅"X 天"
 *   30-364 天   → "X 天(N 个月)" — N = floor(days/30)
 *   ≥ 365 天    → "X 天(N 年 M 个月)";M=0 时简化为"X 天(N 年)"
 *
 * 公共 helper:reason / chain "X 天断口" / persona / fact timeline 都能用。
 */
export function formatDaysReadable(days: number | null | undefined): string {
  if (days == null || days < 0) return '—';
  const d = Math.floor(days);
  if (d < 30) return `${d} 天`;
  if (d < 365) {
    const m = Math.floor(d / 30);
    return `${d} 天(${m} 个月)`;
  }
  const y = Math.floor(d / 365);
  const m = Math.floor((d % 365) / 30);
  return m > 0 ? `${d} 天(${y} 年 ${m} 个月)` : `${d} 天(${y} 年)`;
}

/**
 * 牙位显示:原文用 ; 分隔多颗,超过 5 颗显示前 5 + "等 N 颗"。
 * 例:"14;15;16;17;47" → "14;15;16;17;47"(5 颗内,原样)
 *     "11;12;13;…23 颗" → "11;12;13;21;22 等 23 颗"
 *     空 / null → "—"
 */
export function formatToothPosition(
  raw: string | null | undefined,
  maxShow = 5,
): string {
  if (!raw) return '—';
  const parts = raw
    .split(';')
    .map((s) => s.trim())
    .filter(Boolean);
  if (parts.length <= maxShow) return parts.join(';');
  return `${parts.slice(0, maxShow).join(';')} 等 ${parts.length} 颗`;
}

/**
 * 性别 canonical 值 → 中文显示 label。
 *
 * 后端存的是 canonical 值(理想为 M/F,但摄入侧"自由文本直通"可能漏出
 * 男/女/male/female/1/2 等长尾),这里宽容兜底,任何识别不了的回退到 dash。
 * 显示是 i18n 关注点,归前端 —— 接口只负责给 canonical 值。
 */
export function formatGender(raw: string | null | undefined): string {
  if (!raw) return '—';
  const g = raw.trim().toLowerCase();
  if (['m', 'male', '男', '1'].includes(g)) return '男';
  if (['f', 'female', '女', '2'].includes(g)) return '女';
  return '—';
}
