// ============================================================
// size-format.ts — 尺寸参数显示格式统一
//
// 问题背景：
//   后端模型参数中的尺寸枚举值格式不统一——有的是纯像素值（如
//   "1024x2048"），有的是宽高比（如 "9:16"），前端 UI 上需要统一
//   显示为简化宽高比。
//
// 转换规则：
//   1. 像素格式 WxH（支持 x/X/× 分隔符）→ 计算最大公约数 → 简化比 W:H
//      例："1024x2048" → GCD(1024,2048)=1024 → "1:2"
//      例："1920×1080" → GCD(1920,1080)=120 → "16:9"
//   2. 宽高比格式 W:H → 计算最大公约数 → 简化比（9:16 已最简则不变）
//      例："10:20" → GCD(10,20)=10 → "1:2"
//   3. 非尺寸格式 → 原样返回（兜底：向后兼容未来的新格式）
//
// 提交行为：
//   仅修改显示标签（label），选项的 value 保持原始值不变。
//   因此表单存储和提交流程完全不受影响，后端收到的仍是原始值。
//
// 使用方式：
//   在 ComboBox 中调用 normalizeSizeDisplay() 统一格式化。
// ============================================================

// ── 正则 ──

/** 像素尺寸：1024x2048 / 1920×1080 / 512X1024 */
const PIXEL_SIZE_RE = /^(\d+)\s*[x×X]\s*(\d+)$/;

/** 宽高比：9:16 / 16:9 / 1:1 */
const ASPECT_RATIO_RE = /^(\d+)\s*:\s*(\d+)$/;

// ── 数学工具 ──

/** 辗转相除法求最大公约数 */
function gcd(a: number, b: number): number {
  while (b !== 0) {
    [a, b] = [b, a % b];
  }
  return a;
}

// ── 核心转换 ──

/** 将宽高化简为最简整数比字符串 */
function simplifyRatio(w: number, h: number): string {
  const d = gcd(w, h);
  return `${w / d}:${h / d}`;
}

/**
 * 将任意尺寸字符串转为简化宽高比。
 *
 * 支持输入格式：
 *   - "1024x2048"（像素尺寸）→ "1:2"
 *   - "1920×1080"（中文乘号）→ "16:9"
 *   - "9:16"（宽高比）      → "9:16"（已最简，不变）
 *   - "10:20"（未简宽高比）  → "1:2"
 *   - "other"（非尺寸值）   → "other"（兜底原样返回）
 */
export function toSimplifiedRatio(raw: string): string {
  // 尝试匹配像素格式
  let match = raw.match(PIXEL_SIZE_RE);
  if (match) {
    return simplifyRatio(parseInt(match[1], 10), parseInt(match[2], 10));
  }

  // 尝试匹配宽高比格式
  match = raw.match(ASPECT_RATIO_RE);
  if (match) {
    return simplifyRatio(parseInt(match[1], 10), parseInt(match[2], 10));
  }

  // 兜底：非尺寸格式原样返回
  return raw;
}

// ── ComboBox 集成 ──

/**
 * 将选项列表中的尺寸值统一转为简化宽高比显示。
 *
 * 仅修改 `label`（用户看到的文本），`value` 保持原始值不变。
 * 因此表单提交时后端收到的仍是原始枚举值，无需额外转换。
 *
 * @param options  原始选项列表 [{label: "1024x2048", value: "1024x2048"}, ...]
 * @returns        统一格式后的选项 [{label: "1:2", value: "1024x2048"}, ...]
 */
export function normalizeSizeDisplay(
  options: Array<{ label: string; value: string }>,
): Array<{ label: string; value: string }> {
  return options.map(({ label, value }) => ({
    label: toSimplifiedRatio(label),
    value, // 原始值不变，确保提交时后端收到正确值
  }));
}
