/**
 * 视觉对比：原型基线（visual-baseline/demo/*.png） vs Playwright runtime 截图。
 * 禁止 toHaveScreenshot / toMatchSnapshot（用当前实现生成 snapshot 再自比）。
 */
import fs from "fs";
import path from "path";

export interface CompareVisualBaselineArgs {
  /** 原型基线，必须是 visual-baseline/demo/*.png */
  baseline: string;
  /** Playwright runtime 截图路径（不得落在 __screenshots__ / -snapshots） */
  runtime: string;
  /** 与 AC 中 diff≤N% 对齐，如 0.02 */
  maxDiffPixelRatio?: number;
}

// 校验基线来源合法，并返回可供 pixelmatch / 自定义 diff 工具消费的绝对路径。
export function resolveVisualBaselinePair(args: CompareVisualBaselineArgs): {
  baselineAbs: string;
  runtimeAbs: string;
  maxDiffPixelRatio: number;
} {
  const baseline = args.baseline.replace(/\\/g, "/");
  if (!/^visual-baseline\/demo\/[\w/.-]+\.(?:png|jpe?g|webp)$/i.test(baseline)) {
    throw new Error(`基线来源非法: ${args.baseline}；只允许 visual-baseline/demo/*.png`);
  }
  const runtime = args.runtime.replace(/\\/g, "/");
  if (/__screenshots__|-snapshots/i.test(runtime)) {
    throw new Error(`runtime 截图禁止落到 snapshot 产物目录: ${args.runtime}`);
  }

  const root = process.cwd();
  const baselineAbs = path.isAbsolute(args.baseline) ? args.baseline : path.join(root, args.baseline);
  const runtimeAbs = path.isAbsolute(args.runtime) ? args.runtime : path.join(root, args.runtime);
  if (!fs.existsSync(baselineAbs)) {
    throw new Error(`原型基线不存在: ${baselineAbs}`);
  }
  if (!fs.existsSync(runtimeAbs)) {
    throw new Error(`runtime 截图不存在: ${runtimeAbs}`);
  }

  return {
    baselineAbs,
    runtimeAbs,
    maxDiffPixelRatio: args.maxDiffPixelRatio ?? 0.02,
  };
}

/**
 * 一对一场景视觉对比入口。
 * 项目可在此接入 pixelmatch / Resemble；门禁只要求调用本函数并显式传入 demo 基线。
 */
export async function compareVisualBaseline(args: CompareVisualBaselineArgs): Promise<void> {
  const pair = resolveVisualBaselinePair(args);
  const baselineStat = fs.statSync(pair.baselineAbs);
  const runtimeStat = fs.statSync(pair.runtimeAbs);
  if (baselineStat.size <= 0 || runtimeStat.size <= 0) {
    throw new Error("基线或 runtime 截图为空文件");
  }
  // TODO: 接入像素级 diff；当前先保证「基线来源=demo、实现截图=runtime、一对一」契约成立
  if (pair.maxDiffPixelRatio < 0 || pair.maxDiffPixelRatio > 1) {
    throw new Error(`maxDiffPixelRatio 非法: ${pair.maxDiffPixelRatio}`);
  }
}
