import type { Locale } from '../i18n/types';
import { docStrings, formatDocDate } from './docStrings';
import type { AISystem, CompanyProfile, ContentPack } from './types';

/** Anforderung im Lastenheft. */
interface Requirement {
  readonly id: string;
  readonly must: boolean;
  readonly de: string;
  readonly en: string;
  readonly fr: string;
  readonly it: string;
  readonly es: string;
  readonly pl: string;
  readonly cs: string;
  readonly sk: string;
  readonly ro: string;
  /** Nur bei Hochrisiko aufnehmen. */
  readonly highOnly?: boolean;
}

const REQUIREMENTS: readonly Requirement[] = [
  { id: 'REQ-01', must: true, highOnly: true,
    de: 'CE-Kennzeichnung und EU-Konformitätserklärung (Art. 47, 48) liegen vor und werden mitgeliefert.',
    en: 'CE marking and EU declaration of conformity (Art. 47, 48) exist and are supplied.',
    fr: 'Le marquage CE et la déclaration UE de conformité (art. 47, 48) existent et sont fournis.',
    it: 'La marcatura CE e la dichiarazione di conformità UE (art. 47, 48) esistono e vengono fornite.',
    es: 'El marcado CE y la declaración UE de conformidad (art. 47, 48) existen y se entregan.',
    pl: 'Oznakowanie CE i deklaracja zgodności UE (art. 47, 48) istnieją i są dostarczane.',
    cs: 'Označení CE a EU prohlášení o shodě (čl. 47, 48) existují a jsou dodávány.',
    sk: 'Označenie CE a EÚ vyhlásenie o zhode (čl. 47, 48) existujú a sú dodávané.',
    ro: 'Marcajul CE și declarația UE de conformitate (art. 47, 48) există și sunt furnizate.' },
  { id: 'REQ-02', must: true, highOnly: true,
    de: 'Registrierung des Systems in der EU-Datenbank (Art. 49) ist nachgewiesen.',
    en: 'Registration of the system in the EU database (Art. 49) is evidenced.',
    fr: 'L’enregistrement du système dans la base de données de l’UE (art. 49) est attesté.',
    it: 'La registrazione del sistema nella banca dati dell’UE (art. 49) è comprovata.',
    es: 'El registro del sistema en la base de datos de la UE (art. 49) está acreditado.',
    pl: 'Rejestracja systemu w bazie danych UE (art. 49) jest udokumentowana.',
    cs: 'Registrace systému v databázi EU (čl. 49) je doložena.',
    sk: 'Registrácia systému v databáze EÚ (čl. 49) je preukázaná.',
    ro: 'Înregistrarea sistemului în baza de date a UE (art. 49) este dovedită.' },
  { id: 'REQ-03', must: true,
    de: 'Vollständige Betriebsanleitung nach Art. 13 (Zweckbestimmung, Genauigkeit, Grenzen, Aufsicht, Wartung) in der Vertragssprache.',
    en: 'Complete instructions for use under Art. 13 (purpose, accuracy, limitations, oversight, maintenance) in the contract language.',
    fr: 'Notice d’utilisation complète selon l’art. 13 (destination, exactitude, limites, contrôle, maintenance) dans la langue du contrat.',
    it: 'Istruzioni per l’uso complete ai sensi dell’art. 13 (finalità, accuratezza, limiti, sorveglianza, manutenzione) nella lingua del contratto.',
    es: 'Instrucciones de uso completas conforme al art. 13 (finalidad, precisión, limitaciones, supervisión, mantenimiento) en el idioma del contrato.',
    pl: 'Kompletna instrukcja obsługi zgodnie z art. 13 (przeznaczenie, dokładność, ograniczenia, nadzór, konserwacja) w języku umowy.',
    cs: 'Úplný návod k použití podle čl. 13 (účel, přesnost, omezení, dohled, údržba) v jazyce smlouvy.',
    sk: 'Úplný návod na použitie podľa čl. 13 (účel, presnosť, obmedzenia, dohľad, údržba) v jazyku zmluvy.',
    ro: 'Instrucțiuni de utilizare complete conform art. 13 (scop, acuratețe, limitări, supraveghere, întreținere) în limba contractului.' },
  { id: 'REQ-04', must: true, highOnly: true,
    de: 'Logging-Fähigkeit nach Art. 12: automatische Ereignisprotokolle sind für den Betreiber zugänglich und mind. 6 Monate speicherbar.',
    en: 'Logging capability under Art. 12: automatic event logs are accessible to the deployer and storable for at least 6 months.',
    fr: 'Capacité de journalisation selon l’art. 12 : les journaux d’événements automatiques sont accessibles au déployeur et conservables pendant au moins 6 mois.',
    it: 'Capacità di registrazione ai sensi dell’art. 12: i log automatici degli eventi sono accessibili al deployer e conservabili per almeno 6 mesi.',
    es: 'Capacidad de registro conforme al art. 12: los registros automáticos de eventos son accesibles para el responsable del despliegue y pueden conservarse durante al menos 6 meses.',
    pl: 'Zdolność rejestrowania zdarzeń zgodnie z art. 12: automatyczne dzienniki zdarzeń są dostępne dla podmiotu stosującego i mogą być przechowywane przez co najmniej 6 miesięcy.',
    cs: 'Schopnost protokolování podle čl. 12: automatické protokoly událostí jsou přístupné zavádějícímu subjektu a lze je uchovávat nejméně 6 měsíců.',
    sk: 'Schopnosť protokolovania podľa čl. 12: automatické protokoly udalostí sú prístupné nasadzujúcemu subjektu a možno ich uchovávať najmenej 6 mesiacov.',
    ro: 'Capacitate de jurnalizare conform art. 12: jurnalele automate de evenimente sunt accesibile implementatorului și pot fi păstrate cel puțin 6 luni.' },
  { id: 'REQ-05', must: true, highOnly: true,
    de: 'Schnittstellen für menschliche Aufsicht nach Art. 14 (Eingriff, Abbruch, Übersteuerung) sind vorhanden und dokumentiert.',
    en: 'Human oversight interfaces under Art. 14 (intervention, stop, override) exist and are documented.',
    fr: 'Les interfaces de contrôle humain selon l’art. 14 (intervention, arrêt, neutralisation) existent et sont documentées.',
    it: 'Le interfacce per la sorveglianza umana ai sensi dell’art. 14 (intervento, arresto, override) esistono e sono documentate.',
    es: 'Existen y están documentadas las interfaces de supervisión humana conforme al art. 14 (intervención, parada, anulación).',
    pl: 'Interfejsy nadzoru ludzkiego zgodnie z art. 14 (interwencja, zatrzymanie, przejęcie kontroli) istnieją i są udokumentowane.',
    cs: 'Rozhraní pro lidský dohled podle čl. 14 (zásah, zastavení, převzetí řízení) existují a jsou zdokumentována.',
    sk: 'Rozhrania pre ľudský dohľad podľa čl. 14 (zásah, zastavenie, prevzatie riadenia) existujú a sú zdokumentované.',
    ro: 'Interfețele de supraveghere umană conform art. 14 (intervenție, oprire, preluarea controlului) există și sunt documentate.' },
  { id: 'REQ-06', must: true, highOnly: true,
    de: 'Nachweis von Genauigkeit, Robustheit und Cybersicherheit nach Art. 15 inkl. Schutz gegen Prompt Injection, Data Poisoning und Adversarial Attacks.',
    en: 'Evidence of accuracy, robustness and cybersecurity under Art. 15 incl. protection against prompt injection, data poisoning and adversarial attacks.',
    fr: 'Preuve de l’exactitude, de la robustesse et de la cybersécurité selon l’art. 15, y compris la protection contre l’injection de prompts, l’empoisonnement des données et les attaques adverses.',
    it: 'Prova di accuratezza, robustezza e cibersicurezza ai sensi dell’art. 15, inclusa la protezione contro prompt injection, data poisoning e attacchi avversari.',
    es: 'Prueba de precisión, robustez y ciberseguridad conforme al art. 15, incluida la protección contra inyección de instrucciones (prompt injection), envenenamiento de datos y ataques adversarios.',
    pl: 'Wykazanie dokładności, solidności i cyberbezpieczeństwa zgodnie z art. 15, w tym ochrony przed prompt injection, zatruwaniem danych (data poisoning) i atakami adwersarialnymi.',
    cs: 'Prokázání přesnosti, spolehlivosti a kybernetické bezpečnosti podle čl. 15 vč. ochrany proti prompt injection, otravě dat (data poisoning) a adversariálním útokům.',
    sk: 'Preukázanie presnosti, spoľahlivosti a kybernetickej bezpečnosti podľa čl. 15 vrátane ochrany proti prompt injection, otrave dát (data poisoning) a adverzariálnym útokom.',
    ro: 'Dovada acurateței, robusteții și securității cibernetice conform art. 15, inclusiv protecția împotriva prompt injection, a otrăvirii datelor (data poisoning) și a atacurilor adversariale.' },
  { id: 'REQ-07', must: true,
    de: 'Transparenzfunktionen nach Art. 50 (KI-Offenlegung, maschinenlesbare Kennzeichnung synthetischer Inhalte) sind implementiert, soweit einschlägig.',
    en: 'Transparency features under Art. 50 (AI disclosure, machine-readable marking of synthetic content) are implemented where applicable.',
    fr: 'Les fonctions de transparence selon l’art. 50 (divulgation de l’IA, marquage lisible par machine des contenus synthétiques) sont mises en œuvre, le cas échéant.',
    it: 'Le funzioni di trasparenza ai sensi dell’art. 50 (divulgazione dell’IA, marcatura leggibile meccanicamente dei contenuti sintetici) sono implementate, ove pertinente.',
    es: 'Las funciones de transparencia conforme al art. 50 (divulgación de IA, marcado legible por máquina de contenidos sintéticos) están implementadas, cuando proceda.',
    pl: 'Funkcje przejrzystości zgodnie z art. 50 (ujawnienie AI, nadające się do odczytu maszynowego oznaczanie treści syntetycznych) są wdrożone, o ile mają zastosowanie.',
    cs: 'Funkce transparentnosti podle čl. 50 (zveřejnění AI, strojově čitelné označování syntetického obsahu) jsou implementovány, pokud jsou relevantní.',
    sk: 'Funkcie transparentnosti podľa čl. 50 (zverejnenie AI, strojovo čitateľné označovanie syntetického obsahu) sú implementované, pokiaľ sú relevantné.',
    ro: 'Funcțiile de transparență conform art. 50 (divulgarea IA, marcarea lizibilă automat a conținutului sintetic) sunt implementate, acolo unde este cazul.' },
  { id: 'REQ-08', must: true,
    de: 'Unterstützung bei Vorfallmeldungen: Anbieter meldet schwerwiegende Vorfälle (Art. 73) und informiert den Auftraggeber unverzüglich.',
    en: 'Incident reporting support: provider reports serious incidents (Art. 73) and informs the customer without undue delay.',
    fr: 'Assistance pour la notification des incidents : le fournisseur signale les incidents graves (art. 73) et informe le client sans retard injustifié.',
    it: 'Supporto per la segnalazione degli incidenti: il fornitore segnala gli incidenti gravi (art. 73) e informa il committente senza indebito ritardo.',
    es: 'Apoyo en la notificación de incidentes: el proveedor notifica los incidentes graves (art. 73) e informa al cliente sin demora indebida.',
    pl: 'Wsparcie przy zgłaszaniu incydentów: dostawca zgłasza poważne incydenty (art. 73) i niezwłocznie informuje zamawiającego.',
    cs: 'Podpora při hlášení incidentů: poskytovatel hlásí závažné incidenty (čl. 73) a neprodleně informuje zadavatele.',
    sk: 'Podpora pri hlásení incidentov: poskytovateľ hlási závažné incidenty (čl. 73) a bezodkladne informuje objednávateľa.',
    ro: 'Sprijin pentru raportarea incidentelor: furnizorul raportează incidentele grave (art. 73) și informează fără întârziere clientul.' },
  { id: 'REQ-09', must: true,
    de: 'DSGVO-Konformität: Auftragsverarbeitungsvertrag, Angaben zu Datenflüssen, Speicherorten (EU), Unterauftragnehmern und Löschkonzept.',
    en: 'GDPR conformity: data processing agreement, information on data flows, storage locations (EU), sub-processors and deletion concept.',
    fr: 'Conformité au RGPD : contrat de sous-traitance, informations sur les flux de données, les lieux de stockage (UE), les sous-traitants ultérieurs et le concept de suppression.',
    it: 'Conformità al GDPR: contratto di trattamento dei dati, informazioni su flussi di dati, luoghi di archiviazione (UE), sub-responsabili e piano di cancellazione.',
    es: 'Conformidad con el RGPD: contrato de encargo de tratamiento, información sobre flujos de datos, ubicaciones de almacenamiento (UE), subencargados y plan de supresión.',
    pl: 'Zgodność z RODO: umowa powierzenia przetwarzania, informacje o przepływach danych, miejscach przechowywania (UE), podwykonawcach przetwarzania i koncepcji usuwania danych.',
    cs: 'Soulad s GDPR: smlouva o zpracování údajů, informace o tocích dat, místech uložení (EU), dalších zpracovatelích a koncepci výmazu.',
    sk: 'Súlad s GDPR: zmluva o spracúvaní údajov, informácie o tokoch dát, miestach uloženia (EÚ), ďalších sprostredkovateľoch a koncepcii vymazania.',
    ro: 'Conformitate cu RGPD: contract de prelucrare a datelor, informații privind fluxurile de date, locurile de stocare (UE), subîmputerniciții și conceptul de ștergere.' },
  { id: 'REQ-10', must: false,
    de: 'Update- und Support-Zusagen: Sicherheitsupdates, Re-Zertifizierung bei wesentlichen Änderungen, Reaktionszeiten.',
    en: 'Update and support commitments: security updates, re-certification upon substantial modification, response times.',
    fr: 'Engagements de mise à jour et de support : mises à jour de sécurité, recertification en cas de modification substantielle, délais de réaction.',
    it: 'Impegni di aggiornamento e supporto: aggiornamenti di sicurezza, ricertificazione in caso di modifica sostanziale, tempi di risposta.',
    es: 'Compromisos de actualización y soporte: actualizaciones de seguridad, recertificación en caso de modificación sustancial, tiempos de respuesta.',
    pl: 'Zobowiązania dotyczące aktualizacji i wsparcia: aktualizacje bezpieczeństwa, ponowna certyfikacja przy istotnych zmianach, czasy reakcji.',
    cs: 'Závazky týkající se aktualizací a podpory: bezpečnostní aktualizace, recertifikace při podstatné změně, doby odezvy.',
    sk: 'Záväzky týkajúce sa aktualizácií a podpory: bezpečnostné aktualizácie, recertifikácia pri podstatnej zmene, reakčné časy.',
    ro: 'Angajamente de actualizare și asistență: actualizări de securitate, recertificare în cazul modificărilor substanțiale, timpi de reacție.' },
  { id: 'REQ-11', must: false,
    de: 'Exit-Strategie: Datenexport in offenem Format, Übergabe von Konfiguration und Protokollen bei Vertragsende.',
    en: 'Exit strategy: data export in an open format, handover of configuration and logs at contract end.',
    fr: 'Stratégie de sortie : export des données dans un format ouvert, remise de la configuration et des journaux à la fin du contrat.',
    it: 'Strategia di uscita: esportazione dei dati in un formato aperto, consegna della configurazione e dei log alla fine del contratto.',
    es: 'Estrategia de salida: exportación de datos en un formato abierto, entrega de la configuración y los registros al finalizar el contrato.',
    pl: 'Strategia wyjścia: eksport danych w otwartym formacie, przekazanie konfiguracji i dzienników po zakończeniu umowy.',
    cs: 'Strategie ukončení: export dat v otevřeném formátu, předání konfigurace a protokolů při skončení smlouvy.',
    sk: 'Stratégia ukončenia: export dát v otvorenom formáte, odovzdanie konfigurácie a protokolov pri skončení zmluvy.',
    ro: 'Strategie de ieșire: export de date într-un format deschis, predarea configurației și a jurnalelor la încetarea contractului.' },
  { id: 'REQ-12', must: false, highOnly: true,
    de: 'Einsicht in relevante Teile der technischen Dokumentation (Annex IV) unter Vertraulichkeit, soweit für Betreiberpflichten erforderlich.',
    en: 'Access to relevant parts of the technical documentation (Annex IV) under confidentiality, insofar as required for deployer duties.',
    fr: 'Accès aux parties pertinentes de la documentation technique (annexe IV) sous confidentialité, dans la mesure nécessaire aux obligations du déployeur.',
    it: 'Accesso alle parti pertinenti della documentazione tecnica (allegato IV) in regime di riservatezza, nella misura necessaria agli obblighi del deployer.',
    es: 'Acceso a las partes pertinentes de la documentación técnica (anexo IV) bajo confidencialidad, en la medida necesaria para las obligaciones del responsable del despliegue.',
    pl: 'Wgląd w istotne części dokumentacji technicznej (załącznik IV) z zachowaniem poufności, w zakresie niezbędnym dla obowiązków podmiotu stosującego.',
    cs: 'Přístup k relevantním částem technické dokumentace (příloha IV) za podmínek důvěrnosti, v rozsahu nezbytném pro povinnosti zavádějícího subjektu.',
    sk: 'Prístup k relevantným častiam technickej dokumentácie (príloha IV) za podmienok dôvernosti, v rozsahu nevyhnutnom pre povinnosti nasadzujúceho subjektu.',
    ro: 'Acces la părțile relevante ale documentației tehnice (anexa IV) sub obligație de confidențialitate, în măsura necesară pentru obligațiile implementatorului.' },
];

const PROC = {
  de: {
    title: 'Lastenheft KI-Beschaffung — AI-Act-Anforderungen an den Anbieter',
    intro:
      'Dieses Lastenheft definiert die regulatorischen Mindestanforderungen (EU AI Act, DSGVO) an den Anbieter des unten bezeichneten KI-Systems. Es ist Grundlage für Angebot, Pflichtenheft und Vertrag.',
    colId: 'Nr.', colReq: 'Anforderung', colPrio: 'Priorität', colFulfilled: 'Erfüllt (Anbieter)',
    must: 'MUSS', should: 'SOLL', fulfilled: 'JA / NEIN / TEILWEISE',
    note: 'Hinweis: Bei Hochrisiko-Systemen gelten alle MUSS-Anforderungen zwingend; Nichterfüllung schließt die Beauftragung aus.',
  },
  en: {
    title: 'AI procurement requirements specification — AI Act requirements for the provider',
    intro:
      'This requirements specification defines the minimum regulatory requirements (EU AI Act, GDPR) for the provider of the AI system identified below. It forms the basis for offer, implementation specification and contract.',
    colId: 'No.', colReq: 'Requirement', colPrio: 'Priority', colFulfilled: 'Fulfilled (provider)',
    must: 'MUST', should: 'SHOULD', fulfilled: 'YES / NO / PARTIALLY',
    note: 'Note: For high-risk systems all MUST requirements are mandatory; non-fulfilment excludes the award.',
  },
  fr: {
    title: 'Cahier des charges pour l’acquisition d’IA — exigences du règlement sur l’IA envers le fournisseur',
    intro:
      'Ce cahier des charges définit les exigences réglementaires minimales (règlement européen sur l’IA, RGPD) envers le fournisseur du système d’IA désigné ci-dessous. Il sert de base à l’offre, aux spécifications de réalisation et au contrat.',
    colId: 'N°', colReq: 'Exigence', colPrio: 'Priorité', colFulfilled: 'Rempli (fournisseur)',
    must: 'DOIT', should: 'DEVRAIT', fulfilled: 'OUI / NON / PARTIELLEMENT',
    note: 'Remarque : pour les systèmes à haut risque, toutes les exigences DOIT sont impératives ; leur non-respect exclut l’attribution du marché.',
  },
  it: {
    title: 'Capitolato per l’acquisto di IA — requisiti del regolamento sull’IA per il fornitore',
    intro:
      'Questo capitolato definisce i requisiti normativi minimi (regolamento UE sull’IA, GDPR) per il fornitore del sistema di IA indicato di seguito. Costituisce la base per offerta, specifiche di attuazione e contratto.',
    colId: 'N.', colReq: 'Requisito', colPrio: 'Priorità', colFulfilled: 'Soddisfatto (fornitore)',
    must: 'DEVE', should: 'DOVREBBE', fulfilled: 'SÌ / NO / PARZIALMENTE',
    note: 'Nota: per i sistemi ad alto rischio tutti i requisiti DEVE sono vincolanti; il mancato soddisfacimento esclude l’aggiudicazione.',
  },
  es: {
    title: 'Pliego de condiciones para la adquisición de IA — requisitos del Reglamento de IA para el proveedor',
    intro:
      'Este pliego de condiciones define los requisitos regulatorios mínimos (Reglamento de IA de la UE, RGPD) para el proveedor del sistema de IA indicado a continuación. Constituye la base para la oferta, el pliego de prescripciones técnicas y el contrato.',
    colId: 'N.º', colReq: 'Requisito', colPrio: 'Prioridad', colFulfilled: 'Cumplido (proveedor)',
    must: 'DEBE', should: 'DEBERÍA', fulfilled: 'SÍ / NO / PARCIALMENTE',
    note: 'Nota: en los sistemas de alto riesgo todos los requisitos DEBE son obligatorios; su incumplimiento excluye la adjudicación.',
  },
  pl: {
    title: 'Specyfikacja wymagań dla zakupu AI — wymagania aktu w sprawie AI wobec dostawcy',
    intro:
      'Niniejsza specyfikacja wymagań określa minimalne wymagania regulacyjne (unijny akt w sprawie AI, RODO) wobec dostawcy wskazanego poniżej systemu AI. Stanowi podstawę oferty, specyfikacji realizacyjnej i umowy.',
    colId: 'Nr', colReq: 'Wymaganie', colPrio: 'Priorytet', colFulfilled: 'Spełnione (dostawca)',
    must: 'MUSI', should: 'POWINIEN', fulfilled: 'TAK / NIE / CZĘŚCIOWO',
    note: 'Uwaga: w przypadku systemów wysokiego ryzyka wszystkie wymagania MUSI są bezwzględnie obowiązujące; ich niespełnienie wyklucza udzielenie zamówienia.',
  },
  cs: {
    title: 'Zadávací dokumentace pro pořízení AI — požadavky aktu o AI na poskytovatele',
    intro:
      'Tato zadávací dokumentace definuje minimální regulační požadavky (akt EU o AI, GDPR) na poskytovatele níže uvedeného systému AI. Je základem pro nabídku, prováděcí specifikaci a smlouvu.',
    colId: 'Č.', colReq: 'Požadavek', colPrio: 'Priorita', colFulfilled: 'Splněno (poskytovatel)',
    must: 'MUSÍ', should: 'MĚL BY', fulfilled: 'ANO / NE / ČÁSTEČNĚ',
    note: 'Upozornění: u vysoce rizikových systémů jsou všechny požadavky MUSÍ závazné; jejich nesplnění vylučuje zadání zakázky.',
  },
  sk: {
    title: 'Zadávacia dokumentácia pre obstaranie AI — požiadavky aktu o AI na poskytovateľa',
    intro:
      'Táto zadávacia dokumentácia definuje minimálne regulačné požiadavky (akt EÚ o AI, GDPR) na poskytovateľa nižšie uvedeného systému AI. Je základom pre ponuku, realizačnú špecifikáciu a zmluvu.',
    colId: 'Č.', colReq: 'Požiadavka', colPrio: 'Priorita', colFulfilled: 'Splnené (poskytovateľ)',
    must: 'MUSÍ', should: 'MAL BY', fulfilled: 'ÁNO / NIE / ČIASTOČNE',
    note: 'Upozornenie: pri vysokorizikových systémoch sú všetky požiadavky MUSÍ záväzné; ich nesplnenie vylučuje zadanie zákazky.',
  },
  ro: {
    title: 'Caiet de sarcini pentru achiziția de IA — cerințele Regulamentului privind IA față de furnizor',
    intro:
      'Acest caiet de sarcini definește cerințele de reglementare minime (Regulamentul UE privind IA, RGPD) față de furnizorul sistemului de IA indicat mai jos. Constituie baza pentru ofertă, specificația de implementare și contract.',
    colId: 'Nr.', colReq: 'Cerință', colPrio: 'Prioritate', colFulfilled: 'Îndeplinit (furnizor)',
    must: 'TREBUIE', should: 'AR TREBUI', fulfilled: 'DA / NU / PARȚIAL',
    note: 'Notă: pentru sistemele cu risc ridicat, toate cerințele TREBUIE sunt obligatorii; neîndeplinirea lor exclude atribuirea contractului.',
  },
} as const;

/**
 * Erzeugt das Lastenheft für die KI-Beschaffung (Betreiber-Perspektive):
 * AI-Act-Anforderungen, die der Anbieter erfüllen und im Pflichtenheft
 * beantworten muss.
 *
 * @param system - Bewertetes KI-System
 * @param pack - Regulatorischer Content-Pack
 * @param today - Stichtag im ISO-Format
 * @param profile - Firmenprofil für den Berichtskopf (optional)
 * @param locale - Dokumentsprache (Default: Deutsch)
 */
export function procurementSpec(
  system: AISystem,
  pack: ContentPack,
  today: string,
  profile?: CompanyProfile,
  locale: Locale = 'de',
): string {
  const s = docStrings(locale);
  const p = PROC[locale];
  const high = system.classification.riskClass === 'high';
  const requirements = REQUIREMENTS.filter((r) => high || !r.highOnly);

  const lines = [
    `# ${p.title}`,
    '',
    `| | |`,
    `|---|---|`,
    ...(profile && profile.name.trim() !== '' ? [`| **${s.meta.company}** | ${profile.name} |`] : []),
    `| **${s.meta.system}** | ${system.name} |`,
    `| **${s.meta.purpose}** | ${system.purpose || '—'} |`,
    `| **${s.meta.riskClass}** | ${s.risk[system.classification.riskClass]} |`,
    `| **${s.meta.createdAt}** | ${formatDocDate(today, locale)} |`,
    `| **${s.meta.contentPack}** | v${pack.version} |`,
    '',
    s.disclaimer,
    '',
    p.intro,
    '',
    `| ${p.colId} | ${p.colReq} | ${p.colPrio} | ${p.colFulfilled} |`,
    '|---|---|---|---|',
  ];
  for (const r of requirements) {
    lines.push(`| ${r.id} | ${r[locale]} | ${r.must ? p.must : p.should} | ${p.fulfilled} |`);
  }
  lines.push('', p.note);
  return lines.join('\n');
}

const DECL = {
  de: {
    title: 'EU-Konformitätserklärung (Entwurf, Art. 47 / Annex V)',
    intro:
      'Entwurf auf Basis von Annex V der Verordnung (EU) 2024/1689. Vor Verwendung rechtlich prüfen und durch die Geschäftsleitung unterzeichnen.',
    fields: [
      ['1. KI-System (Name, Typ, Version)', ''],
      ['2. Anbieter (Name und Anschrift)', ''],
      ['3. Verantwortung', 'Die alleinige Verantwortung für die Ausstellung dieser Konformitätserklärung trägt der Anbieter.'],
      ['4. Gegenstand der Erklärung', 'Das oben bezeichnete KI-System steht im Einklang mit der Verordnung (EU) 2024/1689 und ggf. weiteren einschlägigen Harmonisierungsvorschriften der Union.'],
      ['5. Angewandte harmonisierte Normen / gemeinsame Spezifikationen', '_[AUSFÜLLEN]_'],
      ['6. Notifizierte Stelle (falls einschlägig)', 'Name, Kennnummer, Bescheinigung: _[AUSFÜLLEN]_'],
      ['7. DSGVO-Erklärung (falls personenbezogene Daten verarbeitet werden)', 'Das System entspricht den Verordnungen (EU) 2016/679 und (EU) 2018/1725 bzw. der Richtlinie (EU) 2016/680.'],
      ['8. Ort, Datum der Ausstellung', '_[AUSFÜLLEN]_'],
      ['9. Unterzeichnet für und im Namen von', 'Name, Funktion, Unterschrift: _[AUSFÜLLEN]_'],
    ],
  },
  en: {
    title: 'EU declaration of conformity (draft, Art. 47 / Annex V)',
    intro:
      'Draft based on Annex V of Regulation (EU) 2024/1689. Have it legally reviewed and signed by management before use.',
    fields: [
      ['1. AI system (name, type, version)', ''],
      ['2. Provider (name and address)', ''],
      ['3. Responsibility', 'This declaration of conformity is issued under the sole responsibility of the provider.'],
      ['4. Object of the declaration', 'The AI system identified above is in conformity with Regulation (EU) 2024/1689 and, where applicable, other relevant Union harmonisation legislation.'],
      ['5. Applied harmonised standards / common specifications', '_[TO BE COMPLETED]_'],
      ['6. Notified body (where applicable)', 'Name, identification number, certificate: _[TO BE COMPLETED]_'],
      ['7. GDPR statement (where personal data is processed)', 'The system complies with Regulations (EU) 2016/679 and (EU) 2018/1725 or Directive (EU) 2016/680.'],
      ['8. Place and date of issue', '_[TO BE COMPLETED]_'],
      ['9. Signed for and on behalf of', 'Name, function, signature: _[TO BE COMPLETED]_'],
    ],
  },
  fr: {
    title: 'Déclaration UE de conformité (projet, art. 47 / annexe V)',
    intro:
      'Projet fondé sur l’annexe V du règlement (UE) 2024/1689. À faire vérifier juridiquement et signer par la direction avant utilisation.',
    fields: [
      ['1. Système d’IA (nom, type, version)', ''],
      ['2. Fournisseur (nom et adresse)', ''],
      ['3. Responsabilité', 'La présente déclaration de conformité est établie sous la seule responsabilité du fournisseur.'],
      ['4. Objet de la déclaration', 'Le système d’IA désigné ci-dessus est conforme au règlement (UE) 2024/1689 et, le cas échéant, aux autres actes législatifs d’harmonisation de l’Union applicables.'],
      ['5. Normes harmonisées appliquées / spécifications communes', '_[À COMPLÉTER]_'],
      ['6. Organisme notifié (le cas échéant)', 'Nom, numéro d’identification, certificat : _[À COMPLÉTER]_'],
      ['7. Déclaration RGPD (si des données à caractère personnel sont traitées)', 'Le système est conforme aux règlements (UE) 2016/679 et (UE) 2018/1725 ou à la directive (UE) 2016/680.'],
      ['8. Lieu et date de délivrance', '_[À COMPLÉTER]_'],
      ['9. Signé par et au nom de', 'Nom, fonction, signature : _[À COMPLÉTER]_'],
    ],
  },
  it: {
    title: 'Dichiarazione di conformità UE (bozza, art. 47 / allegato V)',
    intro:
      'Bozza basata sull’allegato V del regolamento (UE) 2024/1689. Da sottoporre a verifica legale e far firmare dalla direzione prima dell’uso.',
    fields: [
      ['1. Sistema di IA (nome, tipo, versione)', ''],
      ['2. Fornitore (nome e indirizzo)', ''],
      ['3. Responsabilità', 'La presente dichiarazione di conformità è rilasciata sotto la responsabilità esclusiva del fornitore.'],
      ['4. Oggetto della dichiarazione', 'Il sistema di IA sopra indicato è conforme al regolamento (UE) 2024/1689 e, ove applicabile, ad altre normative di armonizzazione dell’Unione pertinenti.'],
      ['5. Norme armonizzate applicate / specifiche comuni', '_[DA COMPLETARE]_'],
      ['6. Organismo notificato (se applicabile)', 'Nome, numero di identificazione, certificato: _[DA COMPLETARE]_'],
      ['7. Dichiarazione GDPR (se vengono trattati dati personali)', 'Il sistema è conforme ai regolamenti (UE) 2016/679 e (UE) 2018/1725 o alla direttiva (UE) 2016/680.'],
      ['8. Luogo e data di rilascio', '_[DA COMPLETARE]_'],
      ['9. Firmato a nome e per conto di', 'Nome, funzione, firma: _[DA COMPLETARE]_'],
    ],
  },
  es: {
    title: 'Declaración UE de conformidad (borrador, art. 47 / anexo V)',
    intro:
      'Borrador basado en el anexo V del Reglamento (UE) 2024/1689. Debe someterse a revisión jurídica y ser firmado por la dirección antes de su uso.',
    fields: [
      ['1. Sistema de IA (nombre, tipo, versión)', ''],
      ['2. Proveedor (nombre y dirección)', ''],
      ['3. Responsabilidad', 'La presente declaración de conformidad se expide bajo la exclusiva responsabilidad del proveedor.'],
      ['4. Objeto de la declaración', 'El sistema de IA arriba indicado es conforme con el Reglamento (UE) 2024/1689 y, en su caso, con otra legislación de armonización de la Unión aplicable.'],
      ['5. Normas armonizadas aplicadas / especificaciones comunes', '_[POR COMPLETAR]_'],
      ['6. Organismo notificado (en su caso)', 'Nombre, número de identificación, certificado: _[POR COMPLETAR]_'],
      ['7. Declaración RGPD (si se tratan datos personales)', 'El sistema cumple los Reglamentos (UE) 2016/679 y (UE) 2018/1725 o la Directiva (UE) 2016/680.'],
      ['8. Lugar y fecha de expedición', '_[POR COMPLETAR]_'],
      ['9. Firmado en nombre y por cuenta de', 'Nombre, cargo, firma: _[POR COMPLETAR]_'],
    ],
  },
  pl: {
    title: 'Deklaracja zgodności UE (projekt, art. 47 / załącznik V)',
    intro:
      'Projekt na podstawie załącznika V rozporządzenia (UE) 2024/1689. Przed użyciem poddać weryfikacji prawnej i przedłożyć zarządowi do podpisu.',
    fields: [
      ['1. System AI (nazwa, typ, wersja)', ''],
      ['2. Dostawca (nazwa i adres)', ''],
      ['3. Odpowiedzialność', 'Niniejsza deklaracja zgodności wydawana jest na wyłączną odpowiedzialność dostawcy.'],
      ['4. Przedmiot deklaracji', 'Wskazany powyżej system AI jest zgodny z rozporządzeniem (UE) 2024/1689 oraz, w stosownych przypadkach, z innym właściwym unijnym prawodawstwem harmonizacyjnym.'],
      ['5. Zastosowane normy zharmonizowane / wspólne specyfikacje', '_[DO UZUPEŁNIENIA]_'],
      ['6. Jednostka notyfikowana (w stosownych przypadkach)', 'Nazwa, numer identyfikacyjny, certyfikat: _[DO UZUPEŁNIENIA]_'],
      ['7. Oświadczenie RODO (jeżeli przetwarzane są dane osobowe)', 'System jest zgodny z rozporządzeniami (UE) 2016/679 i (UE) 2018/1725 lub dyrektywą (UE) 2016/680.'],
      ['8. Miejsce i data wydania', '_[DO UZUPEŁNIENIA]_'],
      ['9. Podpisano w imieniu i na rzecz', 'Imię i nazwisko, funkcja, podpis: _[DO UZUPEŁNIENIA]_'],
    ],
  },
  cs: {
    title: 'EU prohlášení o shodě (návrh, čl. 47 / příloha V)',
    intro:
      'Návrh na základě přílohy V nařízení (EU) 2024/1689. Před použitím nechat právně ověřit a podepsat vedením.',
    fields: [
      ['1. Systém AI (název, typ, verze)', ''],
      ['2. Poskytovatel (název a adresa)', ''],
      ['3. Odpovědnost', 'Toto prohlášení o shodě se vydává na výhradní odpovědnost poskytovatele.'],
      ['4. Předmět prohlášení', 'Výše uvedený systém AI je ve shodě s nařízením (EU) 2024/1689 a případně s dalšími příslušnými harmonizačními právními předpisy Unie.'],
      ['5. Použité harmonizované normy / společné specifikace', '_[DOPLNIT]_'],
      ['6. Oznámený subjekt (přichází-li v úvahu)', 'Název, identifikační číslo, certifikát: _[DOPLNIT]_'],
      ['7. Prohlášení GDPR (jsou-li zpracovávány osobní údaje)', 'Systém je v souladu s nařízeními (EU) 2016/679 a (EU) 2018/1725, resp. se směrnicí (EU) 2016/680.'],
      ['8. Místo a datum vydání', '_[DOPLNIT]_'],
      ['9. Podepsáno za a jménem', 'Jméno, funkce, podpis: _[DOPLNIT]_'],
    ],
  },
  sk: {
    title: 'EÚ vyhlásenie o zhode (návrh, čl. 47 / príloha V)',
    intro:
      'Návrh na základe prílohy V nariadenia (EÚ) 2024/1689. Pred použitím nechať právne overiť a podpísať vedením.',
    fields: [
      ['1. Systém AI (názov, typ, verzia)', ''],
      ['2. Poskytovateľ (názov a adresa)', ''],
      ['3. Zodpovednosť', 'Toto vyhlásenie o zhode sa vydáva na výhradnú zodpovednosť poskytovateľa.'],
      ['4. Predmet vyhlásenia', 'Vyššie uvedený systém AI je v zhode s nariadením (EÚ) 2024/1689 a prípadne s ďalšími príslušnými harmonizačnými právnymi predpismi Únie.'],
      ['5. Použité harmonizované normy / spoločné špecifikácie', '_[DOPLNIŤ]_'],
      ['6. Notifikovaná osoba (ak je to relevantné)', 'Názov, identifikačné číslo, certifikát: _[DOPLNIŤ]_'],
      ['7. Vyhlásenie GDPR (ak sa spracúvajú osobné údaje)', 'Systém je v súlade s nariadeniami (EÚ) 2016/679 a (EÚ) 2018/1725, resp. so smernicou (EÚ) 2016/680.'],
      ['8. Miesto a dátum vydania', '_[DOPLNIŤ]_'],
      ['9. Podpísané za a v mene', 'Meno, funkcia, podpis: _[DOPLNIŤ]_'],
    ],
  },
  ro: {
    title: 'Declarație UE de conformitate (proiect, art. 47 / anexa V)',
    intro:
      'Proiect pe baza anexei V la Regulamentul (UE) 2024/1689. Înainte de utilizare, a se supune verificării juridice și semnării de către conducere.',
    fields: [
      ['1. Sistem de IA (denumire, tip, versiune)', ''],
      ['2. Furnizor (denumire și adresă)', ''],
      ['3. Responsabilitate', 'Prezenta declarație de conformitate este emisă pe răspunderea exclusivă a furnizorului.'],
      ['4. Obiectul declarației', 'Sistemul de IA indicat mai sus este în conformitate cu Regulamentul (UE) 2024/1689 și, după caz, cu alte acte legislative de armonizare ale Uniunii aplicabile.'],
      ['5. Standarde armonizate aplicate / specificații comune', '_[DE COMPLETAT]_'],
      ['6. Organism notificat (după caz)', 'Denumire, număr de identificare, certificat: _[DE COMPLETAT]_'],
      ['7. Declarație RGPD (dacă se prelucrează date cu caracter personal)', 'Sistemul respectă Regulamentele (UE) 2016/679 și (UE) 2018/1725 sau Directiva (UE) 2016/680.'],
      ['8. Locul și data emiterii', '_[DE COMPLETAT]_'],
      ['9. Semnat pentru și în numele', 'Nume, funcție, semnătură: _[DE COMPLETAT]_'],
    ],
  },
} as const;

/**
 * Erzeugt den Entwurf der EU-Konformitätserklärung (Anbieter, Hochrisiko).
 *
 * @param system - Bewertetes KI-System
 * @param pack - Regulatorischer Content-Pack
 * @param today - Stichtag im ISO-Format
 * @param profile - Firmenprofil (Anbieterangaben werden vorbefüllt)
 * @param locale - Dokumentsprache (Default: Deutsch)
 */
export function conformityDeclaration(
  system: AISystem,
  _pack: ContentPack,
  today: string,
  profile?: CompanyProfile,
  locale: Locale = 'de',
): string {
  const s = docStrings(locale);
  const d = DECL[locale];
  const provider =
    profile && profile.name.trim() !== ''
      ? [profile.name, profile.street, profile.zipCity].filter((x) => x.trim() !== '').join(', ')
      : s.todo;

  const lines = [`# ${d.title}`, '', s.disclaimer, '', d.intro, ''];
  for (const [label, preset] of d.fields) {
    let value: string = preset;
    if (label.startsWith('1.')) value = `${system.name}${system.purpose ? ` — ${system.purpose}` : ''}`;
    if (label.startsWith('2.')) value = provider;
    if (label.startsWith('8.')) value = `${profile?.zipCity ?? ''} ${formatDocDate(today, locale)}`.trim();
    lines.push(`## ${label}`, '', value || s.todo, '');
  }
  return lines.join('\n');
}
