import type { Locale } from '../i18n/types';
import type { AssessmentAnswers, Classification, ContentPack } from './types';

interface ClassifyStrings {
  readonly outOfScope: string;
  readonly prohibited: (label: string, ref: string) => string;
  readonly annexI: string;
  readonly annexIII: (label: string, ref: string) => string;
  readonly profilingBar: string;
  readonly art63: string;
  readonly transparency: (label: string, ref: string) => string;
  readonly minimal: string;
}

const STRINGS: Readonly<Partial<Record<Locale, ClassifyStrings>>> = {
  de: {
    outOfScope:
      'Das System erfüllt die KI-Definition nach Art. 3 Nr. 1 nicht — der AI Act ist nicht anwendbar.',
    prohibited: (label, ref) => `Verbotene Praktik: ${label} (${ref})`,
    annexI:
      'Das System ist Sicherheitsbauteil eines in Annex I regulierten Produkts bzw. selbst ein solches Produkt (Art. 6 Abs. 1) — Hochrisiko.',
    annexIII: (label, ref) => `Annex-III-Bereich: ${label} (${ref})`,
    profilingBar:
      'Das System führt Profiling natürlicher Personen durch — die Ausnahme nach Art. 6 Abs. 3 ist damit ausgeschlossen.',
    art63:
      'Ausnahme nach Art. 6 Abs. 3 in Anspruch genommen (eng begrenzte/vorbereitende Aufgabe ohne wesentliches Risiko). Die Einschätzung ist nach Art. 6 Abs. 4 zu dokumentieren.',
    transparency: (label, ref) => `Transparenzpflicht: ${label} (${ref})`,
    minimal:
      'Keine verbotene Praktik, kein Hochrisiko-Bereich, keine Transparenzpflicht-Auslöser — minimales Risiko. Es gelten die allgemeine KI-Kompetenzpflicht (Art. 4) und freiwillige Verhaltenskodizes.',
  },
  en: {
    outOfScope:
      'The system does not meet the AI definition under Art. 3(1) — the AI Act does not apply.',
    prohibited: (label, ref) => `Prohibited practice: ${label} (${ref})`,
    annexI:
      'The system is a safety component of a product regulated under Annex I, or such a product itself (Art. 6(1)) — high-risk.',
    annexIII: (label, ref) => `Annex III area: ${label} (${ref})`,
    profilingBar:
      'The system performs profiling of natural persons — the exception under Art. 6(3) is therefore excluded.',
    art63:
      'Exception under Art. 6(3) claimed (narrow procedural/preparatory task without significant risk). The assessment must be documented under Art. 6(4).',
    transparency: (label, ref) => `Transparency obligation: ${label} (${ref})`,
    minimal:
      'No prohibited practice, no high-risk area, no transparency triggers — minimal risk. The general AI literacy duty (Art. 4) and voluntary codes of conduct apply.',
  },
  fr: {
    outOfScope:
      'Le système ne répond pas à la définition de l’IA selon l’art. 3, point 1 — le règlement sur l’IA ne s’applique pas.',
    prohibited: (label, ref) => `Pratique interdite : ${label} (${ref})`,
    annexI:
      'Le système est un composant de sécurité d’un produit réglementé par l’annexe I, ou constitue lui-même un tel produit (art. 6, par. 1) — haut risque.',
    annexIII: (label, ref) => `Domaine de l’annexe III : ${label} (${ref})`,
    profilingBar:
      'Le système effectue un profilage de personnes physiques — l’exception prévue à l’art. 6, par. 3 est donc exclue.',
    art63:
      'Exception prévue à l’art. 6, par. 3 invoquée (tâche étroitement délimitée/préparatoire sans risque important). L’évaluation doit être documentée conformément à l’art. 6, par. 4.',
    transparency: (label, ref) => `Obligation de transparence : ${label} (${ref})`,
    minimal:
      'Aucune pratique interdite, aucun domaine à haut risque, aucun déclencheur d’obligation de transparence — risque minimal. S’appliquent l’obligation générale de maîtrise de l’IA (art. 4) et les codes de conduite volontaires.',
  },
  it: {
    outOfScope:
      'Il sistema non soddisfa la definizione di IA di cui all’art. 3, punto 1 — il regolamento sull’IA non è applicabile.',
    prohibited: (label, ref) => `Pratica vietata: ${label} (${ref})`,
    annexI:
      'Il sistema è un componente di sicurezza di un prodotto disciplinato dall’allegato I, oppure è esso stesso un tale prodotto (art. 6, par. 1) — alto rischio.',
    annexIII: (label, ref) => `Ambito dell’allegato III: ${label} (${ref})`,
    profilingBar:
      'Il sistema effettua la profilazione di persone fisiche — l’eccezione di cui all’art. 6, par. 3 è pertanto esclusa.',
    art63:
      'Eccezione di cui all’art. 6, par. 3 invocata (compito ristretto/preparatorio senza rischio significativo). La valutazione deve essere documentata ai sensi dell’art. 6, par. 4.',
    transparency: (label, ref) => `Obbligo di trasparenza: ${label} (${ref})`,
    minimal:
      'Nessuna pratica vietata, nessun ambito ad alto rischio, nessun fattore che attivi obblighi di trasparenza — rischio minimo. Si applicano l’obbligo generale di alfabetizzazione in materia di IA (art. 4) e i codici di condotta volontari.',
  },
  es: {
    outOfScope:
      'El sistema no cumple la definición de IA del art. 3, punto 1 — el Reglamento de IA no es aplicable.',
    prohibited: (label, ref) => `Práctica prohibida: ${label} (${ref})`,
    annexI:
      'El sistema es un componente de seguridad de un producto regulado en el anexo I, o es él mismo tal producto (art. 6, apdo. 1) — alto riesgo.',
    annexIII: (label, ref) => `Ámbito del anexo III: ${label} (${ref})`,
    profilingBar:
      'El sistema realiza elaboración de perfiles de personas físicas — la excepción del art. 6, apdo. 3 queda por tanto excluida.',
    art63:
      'Se invoca la excepción del art. 6, apdo. 3 (tarea estrictamente delimitada/preparatoria sin riesgo significativo). La evaluación debe documentarse conforme al art. 6, apdo. 4.',
    transparency: (label, ref) => `Obligación de transparencia: ${label} (${ref})`,
    minimal:
      'Ninguna práctica prohibida, ningún ámbito de alto riesgo, ningún desencadenante de obligaciones de transparencia — riesgo mínimo. Se aplican la obligación general de alfabetización en materia de IA (art. 4) y los códigos de conducta voluntarios.',
  },
  pl: {
    outOfScope:
      'System nie spełnia definicji AI z art. 3 pkt 1 — akt w sprawie AI nie ma zastosowania.',
    prohibited: (label, ref) => `Zakazana praktyka: ${label} (${ref})`,
    annexI:
      'System jest związanym z bezpieczeństwem elementem produktu regulowanego w załączniku I lub sam jest takim produktem (art. 6 ust. 1) — wysokie ryzyko.',
    annexIII: (label, ref) => `Obszar załącznika III: ${label} (${ref})`,
    profilingBar:
      'System dokonuje profilowania osób fizycznych — wyjątek z art. 6 ust. 3 jest zatem wykluczony.',
    art63:
      'Powołano się na wyjątek z art. 6 ust. 3 (wąsko ograniczone/przygotowawcze zadanie bez znaczącego ryzyka). Ocenę należy udokumentować zgodnie z art. 6 ust. 4.',
    transparency: (label, ref) => `Obowiązek przejrzystości: ${label} (${ref})`,
    minimal:
      'Brak zakazanej praktyki, brak obszaru wysokiego ryzyka, brak czynników wywołujących obowiązki przejrzystości — minimalne ryzyko. Obowiązują ogólny obowiązek kompetencji w zakresie AI (art. 4) i dobrowolne kodeksy postępowania.',
  },
  cs: {
    outOfScope:
      'Systém nesplňuje definici AI podle čl. 3 bodu 1 — akt o AI se nepoužije.',
    prohibited: (label, ref) => `Zakázaná praktika: ${label} (${ref})`,
    annexI:
      'Systém je bezpečnostní komponentou produktu regulovaného v příloze I, nebo je sám takovým produktem (čl. 6 odst. 1) — vysoké riziko.',
    annexIII: (label, ref) => `Oblast přílohy III: ${label} (${ref})`,
    profilingBar:
      'Systém provádí profilování fyzických osob — výjimka podle čl. 6 odst. 3 je tím vyloučena.',
    art63:
      'Uplatněna výjimka podle čl. 6 odst. 3 (úzce vymezený/přípravný úkol bez významného rizika). Posouzení je nutno zdokumentovat podle čl. 6 odst. 4.',
    transparency: (label, ref) => `Povinnost transparentnosti: ${label} (${ref})`,
    minimal:
      'Žádná zakázaná praktika, žádná oblast vysokého rizika, žádné spouštěče povinností transparentnosti — minimální riziko. Platí obecná povinnost gramotnosti v oblasti AI (čl. 4) a dobrovolné kodexy chování.',
  },
  sk: {
    outOfScope:
      'Systém nespĺňa definíciu AI podľa čl. 3 bodu 1 — akt o AI sa neuplatňuje.',
    prohibited: (label, ref) => `Zakázaná praktika: ${label} (${ref})`,
    annexI:
      'Systém je bezpečnostným komponentom produktu regulovaného v prílohe I, alebo je sám takýmto produktom (čl. 6 ods. 1) — vysoké riziko.',
    annexIII: (label, ref) => `Oblasť prílohy III: ${label} (${ref})`,
    profilingBar:
      'Systém vykonáva profilovanie fyzických osôb — výnimka podľa čl. 6 ods. 3 je tým vylúčená.',
    art63:
      'Uplatnená výnimka podľa čl. 6 ods. 3 (úzko vymedzená/prípravná úloha bez významného rizika). Posúdenie treba zdokumentovať podľa čl. 6 ods. 4.',
    transparency: (label, ref) => `Povinnosť transparentnosti: ${label} (${ref})`,
    minimal:
      'Žiadna zakázaná praktika, žiadna oblasť vysokého rizika, žiadne spúšťače povinností transparentnosti — minimálne riziko. Platia všeobecná povinnosť gramotnosti v oblasti AI (čl. 4) a dobrovoľné kódexy správania.',
  },
  ro: {
    outOfScope:
      'Sistemul nu îndeplinește definiția IA de la art. 3 pct. 1 — Regulamentul privind IA nu se aplică.',
    prohibited: (label, ref) => `Practică interzisă: ${label} (${ref})`,
    annexI:
      'Sistemul este o componentă de siguranță a unui produs reglementat în anexa I sau este el însuși un astfel de produs (art. 6 alin. (1)) — risc ridicat.',
    annexIII: (label, ref) => `Domeniu din anexa III: ${label} (${ref})`,
    profilingBar:
      'Sistemul realizează crearea de profiluri ale persoanelor fizice — excepția de la art. 6 alin. (3) este astfel exclusă.',
    art63:
      'S-a invocat excepția de la art. 6 alin. (3) (sarcină strict delimitată/pregătitoare, fără risc semnificativ). Evaluarea trebuie documentată conform art. 6 alin. (4).',
    transparency: (label, ref) => `Obligație de transparență: ${label} (${ref})`,
    minimal:
      'Nicio practică interzisă, niciun domeniu cu risc ridicat, niciun factor declanșator al obligațiilor de transparență — risc minim. Se aplică obligația generală de alfabetizare în materie de IA (art. 4) și codurile de conduită voluntare.',
  },
};

/**
 * Klassifiziert ein KI-System nach dem Risikomodell des EU AI Act.
 *
 * Prüfreihenfolge (entspricht der Systematik der Verordnung):
 * 1. Anwendbarkeit (KI-Definition, Art. 3 Nr. 1)
 * 2. Verbotene Praktiken (Art. 5) → "prohibited"
 * 3. Annex I Sicherheitsbauteil → "high"
 * 4. Annex III Bereiche, ggf. Ausnahme Art. 6 Abs. 3 → "high"
 * 5. Transparenzpflichten (Art. 50) → "limited"
 * 6. Sonst → "minimal"
 *
 * @param answers - Antworten des Bewertungs-Wizards
 * @param pack - Regulatorischer Content-Pack (für Begründungstexte)
 * @param locale - Sprache der Begründungen (Default: Deutsch)
 * @returns Unveränderliches Klassifizierungsergebnis mit Begründungen
 */
export function classify(
  answers: AssessmentAnswers,
  pack: ContentPack,
  locale: Locale = 'de',
): Classification {
  // Vollständig lokalisiert; Fallback EN für künftige Sprachen.
  const s = STRINGS[locale] ?? (STRINGS.en as ClassifyStrings);
  const reasons: string[] = [];
  const transparencyDuties = answers.transparencyTriggers.length > 0;

  if (!answers.isAISystem) {
    return {
      riskClass: 'out-of-scope',
      reasons: [s.outOfScope],
      gpaiObligations: false,
      transparencyDuties: false,
      art64DocumentationDuty: false,
    };
  }

  if (answers.prohibitedPractices.length > 0) {
    for (const id of answers.prohibitedPractices) {
      const item = pack.prohibitedPractices.find((p) => p.id === id);
      if (item) {
        reasons.push(s.prohibited(item.label, item.legalRef));
      }
    }
    return {
      riskClass: 'prohibited',
      reasons,
      gpaiObligations: answers.isGPAIModel,
      transparencyDuties: false,
      art64DocumentationDuty: false,
    };
  }

  if (answers.isAnnexISafetyComponent) {
    reasons.push(s.annexI);
    return {
      riskClass: 'high',
      reasons,
      gpaiObligations: answers.isGPAIModel,
      transparencyDuties,
      art64DocumentationDuty: false,
    };
  }

  if (answers.annexIIICategories.length > 0) {
    for (const id of answers.annexIIICategories) {
      const item = pack.annexIIICategories.find((c) => c.id === id);
      if (item) {
        reasons.push(s.annexIII(item.label, item.legalRef));
      }
    }

    if (answers.involvesProfiling) {
      reasons.push(s.profilingBar);
      return {
        riskClass: 'high',
        reasons,
        gpaiObligations: answers.isGPAIModel,
        transparencyDuties,
        art64DocumentationDuty: false,
      };
    }

    if (answers.art63Exception) {
      reasons.push(s.art63);
      return {
        riskClass: transparencyDuties ? 'limited' : 'minimal',
        reasons: transparencyDuties
          ? [...reasons, ...transparencyReasons(answers, pack, s)]
          : reasons,
        gpaiObligations: answers.isGPAIModel,
        transparencyDuties,
        art64DocumentationDuty: true,
      };
    }

    return {
      riskClass: 'high',
      reasons,
      gpaiObligations: answers.isGPAIModel,
      transparencyDuties,
      art64DocumentationDuty: false,
    };
  }

  if (transparencyDuties) {
    return {
      riskClass: 'limited',
      reasons: transparencyReasons(answers, pack, s),
      gpaiObligations: answers.isGPAIModel,
      transparencyDuties: true,
      art64DocumentationDuty: false,
    };
  }

  return {
    riskClass: 'minimal',
    reasons: [s.minimal],
    gpaiObligations: answers.isGPAIModel,
    transparencyDuties: false,
    art64DocumentationDuty: false,
  };
}

/** Erzeugt Begründungstexte für zutreffende Art.-50-Auslöser. */
function transparencyReasons(
  answers: AssessmentAnswers,
  pack: ContentPack,
  s: ClassifyStrings,
): string[] {
  return answers.transparencyTriggers.flatMap((id) => {
    const item = pack.transparencyTriggers.find((t) => t.id === id);
    return item ? [s.transparency(item.label, item.legalRef)] : [];
  });
}
