// R-03 (Spec-Erhebung 08.08.2026): die Vergleichsart aus Spec Kap. 21 —
// deklarierbar statt geraten.
//
// Die Spezifikation fordert R-03 als P0, definiert aber keinen Mechanismus.
// PO-Linie (Kais, 08.08.2026, TG 9970 Antwort 4: „flexibel bleiben"):
// die Vergleichsart wird vom Menschen DEKLARIERT, das System rät nie —
// `undetermined` ist ein vollwertiger, ehrlicher Zustand („Vergleichsart
// nicht bestimmt", qaf-v2-header.tsx zeigt ihn seit Kap. 21 genau so an).
// Das System liefert zur Entscheidung die Evidenz (Dateinamen, Sachnummer,
// Identitäts-Befunde des Laufs) — Anzeige-Seite: app/qaf-differences/[id]/v2.
//
// Bewusst NICHT `comparison_mode`: die Spalte ist das geschlossene TECHNISCHE
// Modus-System (comparison-mode.ts — welche Blätter/Regeln der Lauf nutzt,
// normalizeComparisonMode mappt Unbekanntes auf 'summary'). Die fachliche
// Deklaration „was vergleiche ich hier" ist dazu orthogonal und lebt in der
// eigenen Spalte `qaf_comparison.declared_comparison_type` (Migration #120,
// nullable TEXT ohne CHECK — konsistent mit den status/value_state-Spalten
// dieses Schemas; die Wertemenge bewacht dieses Modul an der Boundary).
//
// Pure. Kein DB-, Framework- oder I/O-Zugriff (check:qaf-core-portability).

/** Spec Kap. 21 — die Werteliste des V2-Kopfes (qaf-v2-header.tsx zeigt die
 * DE-Labels; dieses Modul ist die framework-freie Quelle der Werte). */
export const DECLARED_COMPARISON_TYPES = [
  'temporal_change',
  'supplier_benchmark',
  'site_comparison',
  'variant_comparison',
  'undetermined',
] as const

export type DeclaredComparisonType = (typeof DECLARED_COMPARISON_TYPES)[number]

/** Boundary-Normalisierung des persistierten `string | null`: nur die fünf
 * Kap.-21-Werte passieren, alles andere (null, Alt-/Fremdwerte) wird ehrlich
 * `undetermined` — nie geraten, nie geworfen. */
export function normalizeDeclaredComparisonType(raw: string | null | undefined): DeclaredComparisonType {
  return (DECLARED_COMPARISON_TYPES as readonly string[]).includes(raw ?? '')
    ? (raw as DeclaredComparisonType)
    : 'undetermined'
}

/** Schreib-Validierung der Server-Action: im Gegensatz zur Lese-Normalisierung
 * oben wird ein unbekannter Wert beim SETZEN abgelehnt (false), nicht still
 * auf `undetermined` gebogen — sonst sähe ein Tippfehler wie eine bewusste
 * Rücknahme der Deklaration aus. */
export function isDeclaredComparisonType(raw: string): raw is DeclaredComparisonType {
  return (DECLARED_COMPARISON_TYPES as readonly string[]).includes(raw)
}

/** Die Issue-Typen, die als Identitäts-/Herkunfts-Evidenz für die
 * Vergleichsart-Entscheidung gelten (bestehende Checks + D15/D16,
 * plausibility.ts) — die V2-Seite filtert den persistierten
 * qaf_plausibility_issue-Bestand darauf. */
export const COMPARISON_TYPE_EVIDENCE_ISSUE_TYPES = [
  'part_number_mismatch',
  'part_name_changed',
  'variant_changed',
  'quotation_date_order',
  'supplier_mismatch',
  'supplier_no_mismatch',
  'request_version_changed',
  'change_index_changed',
  'filename_part_number_mismatch',
] as const
