import type {
  GeometryCellEvidence,
  GeometryRuleId,
  GeometryViolationFact,
  Ui001EvidenceRecord,
  Ui025GeometryEvidence,
} from "./types.js";
import { GEOMETRY_DETECTOR_VERSION } from "./types.js";

function targetCropRef(
  evidence: GeometryCellEvidence,
  locator: string,
): string {
  const crop = evidence.geometryArtifacts.targetCrops.find((entry) => entry.locator === locator);
  return crop?.artifact.relativePath ?? "";
}

export function buildUi025Evidence(
  evidence: GeometryCellEvidence,
  violation: GeometryViolationFact,
): Ui025GeometryEvidence {
  const measurement = violation.measurement;
  return {
    fullScreenshotRef: evidence.geometryArtifacts.fullScreenshot.relativePath,
    targetCropRef: targetCropRef(evidence, violation.locator),
    targetRect: measurement.targetRect as Ui025GeometryEvidence["targetRect"],
    clipChain: measurement.clipChain as Ui025GeometryEvidence["clipChain"],
    occluderRects: measurement.occluderRects as Ui025GeometryEvidence["occluderRects"],
    computedOverflow:
      typeof measurement.computedOverflow === "string" ? measurement.computedOverflow : "",
    direction:
      typeof measurement.direction === "string"
        ? measurement.direction
        : evidence.geometryProbe.direction,
    transformMatrices: measurement.transformMatrices as Ui025GeometryEvidence["transformMatrices"],
    deviceScaleFactor: Number(
      measurement.deviceScaleFactor ?? evidence.geometryProbe.deviceScaleFactor,
    ),
  };
}

export function screenshotRefs(evidence: GeometryCellEvidence): string[] {
  const refs = [evidence.geometryArtifacts.fullScreenshot.relativePath];
  for (const crop of evidence.geometryArtifacts.targetCrops) {
    refs.push(crop.artifact.relativePath);
  }
  return refs;
}

export function timestampPhase(evidence: GeometryCellEvidence): string {
  return evidence.settled.signal;
}

export function buildUi001Evidence(
  evidence: GeometryCellEvidence,
  ruleId: GeometryRuleId,
  violation: GeometryViolationFact,
  classificationBasis: string,
): Ui001EvidenceRecord {
  const geometryEvidence = buildUi025Evidence(evidence, violation);
  const cell = evidence.cell;
  return {
    ruleId,
    route: cell.routeId,
    url: cell.url,
    role: cell.role,
    locale: cell.locale,
    viewport: cell.viewport,
    state: cell.state,
    actions: cell.actions,
    timestampPhase: timestampPhase(evidence),
    targetLocator: violation.locator,
    measuredEvidence: {
      ...violation.measurement,
      geometryEvidence,
    },
    screenshotRefs: screenshotRefs(evidence),
    detectorVersion: GEOMETRY_DETECTOR_VERSION,
    classificationBasis,
    violation,
    geometryEvidence,
  };
}
