import { a11yDetectorByRuleId } from "../a11y/detectors.js";
import { assetsDetectorByRuleId } from "../assets/detectors.js";
import { geometryDetectorByRuleId } from "../geometry/detectors.js";
import { interactionDetectorByRuleId } from "../interaction/detectors.js";
import { relationsDetectorByRuleId } from "../relations/detectors.js";
import { renderedDetectorByRuleId } from "../rendered/detectors.js";
import { sweepsDetectorByRuleId } from "../sweeps/detectors.js";
import type { CalibrationEntry, CalibrationFamily, CalibrationRuleId } from "./types.js";

const BLOCKING_CALIBRATION_SPECS: ReadonlyArray<{
  family: CalibrationFamily;
  ruleId: CalibrationRuleId;
}> = [
  { family: "rendered", ruleId: "UI-010" },
  { family: "rendered", ruleId: "UI-011" },
  { family: "rendered", ruleId: "UI-013" },
  { family: "rendered", ruleId: "UI-014" },
  { family: "rendered", ruleId: "UI-015" },
  { family: "rendered", ruleId: "UI-016" },
  { family: "rendered", ruleId: "UI-018" },
  { family: "geometry", ruleId: "UI-021" },
  { family: "interaction", ruleId: "UI-033" },
  { family: "interaction", ruleId: "UI-035" },
  { family: "interaction", ruleId: "UI-036" },
  { family: "interaction", ruleId: "UI-037" },
  { family: "interaction", ruleId: "UI-038" },
  { family: "relations", ruleId: "UI-034" },
  { family: "sweeps", ruleId: "UI-052" },
  { family: "a11y", ruleId: "UI-060" },
  { family: "a11y", ruleId: "UI-061" },
  { family: "a11y", ruleId: "UI-062" },
  { family: "assets", ruleId: "UI-070" },
];

function detectorForFamilyRule(
  family: CalibrationFamily,
  ruleId: CalibrationRuleId,
): { id: string; version: string } {
  switch (family) {
    case "rendered":
      return renderedDetectorByRuleId[ruleId as "UI-010"];
    case "geometry":
      return geometryDetectorByRuleId[ruleId as "UI-021"];
    case "interaction":
      return interactionDetectorByRuleId[ruleId as "UI-033"];
    case "relations":
      return relationsDetectorByRuleId[ruleId as "UI-034"];
    case "sweeps":
      return sweepsDetectorByRuleId[ruleId as "UI-052"];
    case "a11y":
      return a11yDetectorByRuleId[ruleId as "UI-060"];
    case "assets":
      return assetsDetectorByRuleId[ruleId as "UI-070"];
    default: {
      const exhaustive: never = family;
      throw new Error(`unsupported calibration family: ${String(exhaustive)}`);
    }
  }
}

/** Blocking-enabled detectors with known-bad fixtures for cross-engine calibration (UNI-013). */
export function blockingCalibrationCatalog(): CalibrationEntry[] {
  return BLOCKING_CALIBRATION_SPECS.map((spec) => {
    const detector = detectorForFamilyRule(spec.family, spec.ruleId);
    return {
      family: spec.family,
      ruleId: spec.ruleId,
      detectorId: detector.id,
      detectorVersion: detector.version,
    };
  });
}
