// Kopfbereich des V2-Vergleichs (Spezifikation Kap. 21).
//
// Was immer sichtbar bleibt: Was wird hier eigentlich verglichen, ist es
// vergleichbar, aus welchen Dateien, und hält der Lauf seine eigenen Prüfungen
// aus.
//
// Der letzte Punkt ist der wichtigste und in der Vorgängerfassung der
// schwächste: Ein Lauf mit gescheiterten Prüfungen sah aus wie jeder andere.
// Jetzt steht ein Banner darüber, und solange es steht, ist die
// KI-Zusammenfassung gesperrt — sichtbar, mit Grund.
// tdd-guard:skip — darstellend; die reinen Helfer darunter sind getestet.

import { AlertTriangle } from 'lucide-react'
import type { ValidationBanner } from '@/lib/qaf-differences/internal/view-specs'
import type { DeclaredComparisonType } from '@/lib/qaf-differences/internal/declared-comparison-type'
import type { ComparabilityStatus as DerivedComparabilityStatus } from '@/lib/qaf-differences/internal/comparability'

// ── Reine Helfer (eigens geprüft) ───────────────────────────────────────────

// Seit R-03 kommt die Werteliste aus declared-comparison-type.ts (eine Quelle,
// dort auch die Boundary-Normalisierung des persistierten Werts); dieser Alias
// hält jeden bestehenden Importer dieser Komponente unverändert.
export type ComparisonType = DeclaredComparisonType

const TYPE_LABEL: Record<ComparisonType, string> = {
  temporal_change: 'Zeitlicher Änderungsvergleich',
  supplier_benchmark: 'Lieferantenvergleich',
  site_comparison: 'Standortvergleich',
  variant_comparison: 'Variantenvergleich',
  undetermined: 'Vergleichsart nicht bestimmt',
}

/**
 * Die Vergleichsart im Klartext.
 *
 * Sie gehört sichtbar in den Kopf, weil sie die Lesart aller Zahlen darunter
 * bestimmt: Ein Delta zwischen zwei Ständen desselben Teils bedeutet etwas
 * anderes als ein Delta zwischen zwei Lieferanten.
 */
export function comparisonTypeLabel(type: ComparisonType): string {
  return TYPE_LABEL[type]
}

// Seit Loop 4 kommt die Werteliste aus comparability.ts (eine Quelle — dort
// auch die Ableitung aus den persistierten Identitäts-Befunden); dieser Alias
// hält jeden bestehenden Importer dieser Komponente unverändert.
export type ComparabilityStatus = DerivedComparabilityStatus

interface ComparabilityView {
  labelDe: string
  tone: 'good' | 'warning' | 'critical' | 'neutral'
}

const COMPARABILITY: Record<ComparabilityStatus, ComparabilityView> = {
  comparable: { labelDe: 'Vergleichbar', tone: 'good' },
  limited: { labelDe: 'Eingeschränkt vergleichbar', tone: 'warning' },
  not_comparable: { labelDe: 'Nicht vergleichbar', tone: 'critical' },
  undetermined: { labelDe: 'Vergleichbarkeit nicht geprüft', tone: 'neutral' },
}

/**
 * Die Ampel der Vergleichbarkeit.
 *
 * „nicht geprüft" bekommt bewusst nicht Grün: Wo niemand hingesehen hat, ist
 * nichts in Ordnung — es ist nur nichts bekannt.
 */
export function comparabilityView(status: ComparabilityStatus): ComparabilityView {
  return COMPARABILITY[status]
}

/** Kurzform des Determinismus-Hashes für den Kopf. */
export function shortHash(digest: string | null): string | null {
  if (digest === null) return null
  const roh = digest.replace(/^sha256:/, '')
  return roh.length <= 12 ? roh : `${roh.slice(0, 12)}…`
}

// ── Darstellung ─────────────────────────────────────────────────────────────

const TONE_CLASS: Record<ComparabilityView['tone'], string> = {
  good: 'bg-[color:var(--status-green,#C8E6C9)] text-foreground',
  warning: 'bg-[color:var(--status-yellow,#FFE082)] text-foreground',
  critical: 'bg-[color:var(--status-red-strong,#F8BBD0)] text-foreground',
  neutral: 'bg-muted text-muted-foreground',
}

/**
 * Die Vergleichbarkeits-Ampel als eigenständiger Chip (Loop 9): dieselbe
 * Ableitung, dieselben Töne wie im V2-Kopf — der Klassik-Kopf nutzt sie mit,
 * statt eine zweite Label-Tabelle zu pflegen.
 */
export function QafComparabilityChip({
  status,
  reasonsDe = [],
}: {
  status: ComparabilityStatus
  reasonsDe?: string[]
}) {
  const ampel = comparabilityView(status)
  return (
    <span
      className={`rounded-[2px] px-2 py-1 text-xs ${TONE_CLASS[ampel.tone]}`}
      title={reasonsDe.join(' · ')}
    >
      {ampel.labelDe}
      {reasonsDe.length > 0 && ampel.tone !== 'good' ? ` (${reasonsDe.length})` : ''}
    </span>
  )
}

interface Props {
  partLabelDe: string
  supplierLabelDe: string | null
  comparisonType: ComparisonType
  comparability: ComparabilityStatus
  comparabilityReasonsDe?: string[]
  files: Array<{ roleDe: string; nameDe: string; stampDe: string | null }>
  contentHash: string | null
  validation: ValidationBanner
}

export function QafV2Header({
  partLabelDe,
  supplierLabelDe,
  comparisonType,
  comparability,
  comparabilityReasonsDe = [],
  files,
  contentHash,
  validation,
}: Props) {
  return (
    <header className="space-y-3">
      <div className="flex flex-wrap items-baseline gap-x-3 gap-y-1">
        <h1 className="font-display text-lg font-bold tracking-tight">{partLabelDe}</h1>
        {supplierLabelDe === null ? null : <span className="text-sm text-muted-foreground">{supplierLabelDe}</span>}
      </div>

      <div className="flex flex-wrap items-center gap-2 text-xs">
        <span className="rounded-[2px] bg-muted px-2 py-1">{comparisonTypeLabel(comparisonType)}</span>
        {/* Der Zähler im Chip liest sich als Problemzahl — beim guten Ergebnis
            bleibt er weg, die Begründung trägt dann allein der title-Tooltip
            (Review-Befund 10.08.; Ursprungs-Kontrakt: reference-case setzt
            comparable mit leeren reasons). Chip-Logik seit Loop 9 geteilt. */}
        <QafComparabilityChip status={comparability} reasonsDe={comparabilityReasonsDe} />
        {shortHash(contentHash) === null ? null : (
          <span className="font-mono text-muted-foreground" title="Determinismus-Hash des Laufs">
            {shortHash(contentHash)}
          </span>
        )}
      </div>

      <dl className="flex flex-wrap gap-x-6 gap-y-1 text-xs text-muted-foreground">
        {files.map((f) => (
          <div key={f.roleDe} className="flex gap-1.5">
            <dt className="font-medium">{f.roleDe}:</dt>
            <dd>
              {f.nameDe}
              {f.stampDe === null ? '' : ` · ${f.stampDe}`}
            </dd>
          </div>
        ))}
      </dl>

      {validation.visible ? (
        <div
          role="alert"
          className="flex items-start gap-2 rounded-[2px] border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm"
        >
          <AlertTriangle className="mt-0.5 h-4 w-4 shrink-0 text-destructive" />
          <p>{validation.messageDe}</p>
        </div>
      ) : null}
    </header>
  )
}
