import { sha256Canonical } from "../../../schema/src/canonical.js";

const SEMVER_PATTERN =
  /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+([0-9A-Za-z.-]+))?$/;

export type EvidenceFingerprintMaterial = {
  detectorMajor: string;
  normalizedTarget: unknown;
  violation: unknown;
  contractOrConfig: unknown;
  contextDimensions: Record<string, string>;
};

type EvidenceFingerprintPayload = {
  detectorMajor: string;
  normalizedTarget: unknown;
  violation: unknown;
  contractOrConfig: unknown;
  contextDimensions: Record<string, string>;
};

export function extractDetectorMajor(version: string): string {
  const match = SEMVER_PATTERN.exec(version);
  if (!match) {
    throw new Error(`invalid SemVer for detector major extraction: ${version}`);
  }

  return match[1] ?? "";
}

export function evidenceFingerprint(material: EvidenceFingerprintMaterial): string {
  const payload: EvidenceFingerprintPayload = {
    detectorMajor: material.detectorMajor,
    normalizedTarget: material.normalizedTarget,
    violation: material.violation,
    contractOrConfig: material.contractOrConfig,
    contextDimensions: material.contextDimensions,
  };

  return sha256Canonical(payload);
}
