/**
 * UCCA Legal Metadata - Kompositorisches Bewertungssystem
 *
 * Jedes Feld trägt seine eigene Rechtsgrundlage.
 * Das Ergebnis ist die Aggregation aller ausgewählten Felder.
 * Bei Problemen werden Lösungsvorschläge angezeigt.
 */

// ============================================================================
// Types
// ============================================================================

export interface LegalReference {
  article: string          // z.B. "Art. 9 DSGVO"
  title: string            // z.B. "Besondere Kategorien personenbezogener Daten"
  relevance: string        // Warum relevant für dieses Feld
}

export interface RequiredControl {
  id: string
  title: string
  description: string
  effort: 'low' | 'medium' | 'high'
}

export interface FieldMetadata {
  // Identifikation
  id: string
  label: string
  labelSimple: string      // Einfache Sprache

  // Rechtliche Einordnung
  legalRefs: LegalReference[]

  // Risikobewertung
  riskScore: number        // 0-30 pro Feld
  severity: 'INFO' | 'WARN' | 'BLOCK'

  // Erforderliche Maßnahmen wenn ausgewählt
  requiredControls: string[]

  // Erklärungen
  explanation: string       // Fachsprache
  explanationSimple: string // Einfache Sprache

  // Hinweis für Nutzer
  userHint?: string
}

export interface ProblemSolution {
  id: string
  title: string
  description: string
  // Was ändert sich wenn Lösung akzeptiert wird
  removes_fields?: string[]      // Diese Felder werden "entschärft"
  adds_controls?: string[]       // Diese Kontrollen werden hinzugefügt
  new_risk_score?: number        // Neuer Risiko-Beitrag (meist 0)
  effort: 'low' | 'medium' | 'high'
  // Frage an das Team
  team_question: string
}

export interface Problem {
  id: string
  title: string
  description: string
  severity: 'WARN' | 'BLOCK'
  // Welche Feld-Kombination löst das Problem aus
  triggered_by: {
    all_of?: string[]    // Alle müssen ausgewählt sein
    any_of?: string[]    // Mindestens eins muss ausgewählt sein
    none_of?: string[]   // Keins darf ausgewählt sein (z.B. fehlende Einwilligung)
  }
  // Rechtliche Grundlage
  legalRefs: LegalReference[]
  // Mögliche Lösungen
  solutions: ProblemSolution[]
}

// ============================================================================
// Erforderliche Kontrollen / Maßnahmen
// ============================================================================

export const CONTROLS: Record<string, RequiredControl> = {
  explicit_consent: {
    id: 'explicit_consent',
    title: 'Ausdrückliche Einwilligung',
    description: 'Betroffene müssen aktiv und informiert einwilligen (Opt-in, keine vorausgefüllten Checkboxen).',
    effort: 'medium',
  },
  parental_consent: {
    id: 'parental_consent',
    title: 'Einwilligung der Erziehungsberechtigten',
    description: 'Bei Minderjährigen muss die Einwilligung der Eltern/Erziehungsberechtigten eingeholt werden.',
    effort: 'high',
  },
  age_verification: {
    id: 'age_verification',
    title: 'Altersverifikation',
    description: 'Mechanismus zur Prüfung des Alters der Nutzer implementieren.',
    effort: 'medium',
  },
  dsfa: {
    id: 'dsfa',
    title: 'Datenschutz-Folgenabschätzung (DSFA)',
    description: 'Formale DSFA nach Art. 35 DSGVO durchführen und dokumentieren.',
    effort: 'high',
  },
  human_in_the_loop: {
    id: 'human_in_the_loop',
    title: 'Menschliche Überprüfung (HITL)',
    description: 'Jede automatisierte Entscheidung muss von einem Menschen überprüft werden können.',
    effort: 'medium',
  },
  contestation_right: {
    id: 'contestation_right',
    title: 'Anfechtungsrecht',
    description: 'Betroffene müssen automatisierte Entscheidungen anfechten können.',
    effort: 'low',
  },
  data_minimization: {
    id: 'data_minimization',
    title: 'Datenminimierung',
    description: 'Nur die unbedingt notwendigen Daten erheben und verarbeiten.',
    effort: 'low',
  },
  anonymization: {
    id: 'anonymization',
    title: 'Anonymisierung',
    description: 'Personenbezogene Daten vor der Verarbeitung anonymisieren.',
    effort: 'medium',
  },
  pseudonymization: {
    id: 'pseudonymization',
    title: 'Pseudonymisierung',
    description: 'Direkte Identifikatoren durch Pseudonyme ersetzen.',
    effort: 'medium',
  },
  encryption: {
    id: 'encryption',
    title: 'Verschlüsselung',
    description: 'Daten bei Übertragung und Speicherung verschlüsseln.',
    effort: 'low',
  },
  access_logging: {
    id: 'access_logging',
    title: 'Zugriffs-Protokollierung',
    description: 'Alle Zugriffe auf personenbezogene Daten protokollieren.',
    effort: 'low',
  },
  retention_policy: {
    id: 'retention_policy',
    title: 'Löschkonzept',
    description: 'Automatische Löschung nach definierter Aufbewahrungsfrist.',
    effort: 'medium',
  },
  scc: {
    id: 'scc',
    title: 'Standardvertragsklauseln (SCC)',
    description: 'EU-Standardvertragsklauseln mit Drittland-Anbieter abschließen.',
    effort: 'medium',
  },
  tia: {
    id: 'tia',
    title: 'Transfer Impact Assessment',
    description: 'Bewertung der Datenschutzrisiken bei Drittlandtransfer.',
    effort: 'high',
  },
  purpose_limitation: {
    id: 'purpose_limitation',
    title: 'Zweckbindung dokumentieren',
    description: 'Verarbeitungszweck klar definieren und dokumentieren.',
    effort: 'low',
  },
  transparency: {
    id: 'transparency',
    title: 'Transparenz-Information',
    description: 'Betroffene über die Verarbeitung informieren (Datenschutzerklärung).',
    effort: 'low',
  },
  pixelization: {
    id: 'pixelization',
    title: 'Verpixelung/Unkenntlichmachung',
    description: 'Identifizierende Merkmale (Gesichter, Kennzeichen) automatisch verpixeln.',
    effort: 'medium',
  },
  no_training: {
    id: 'no_training',
    title: 'Kein KI-Training mit Daten',
    description: 'Daten dürfen nur für Inferenz, nicht für Training verwendet werden.',
    effort: 'low',
  },
}

// ============================================================================
// Feld-Metadaten: Datentypen
// ============================================================================

export const DATA_TYPE_METADATA: Record<string, FieldMetadata> = {
  personal_data: {
    id: 'personal_data',
    label: 'Personenbezogene Daten',
    labelSimple: 'Namen, E-Mails, Adressen',
    legalRefs: [
      { article: 'Art. 4(1) DSGVO', title: 'Definition personenbezogener Daten', relevance: 'Grundlegende Definition' },
      { article: 'Art. 6 DSGVO', title: 'Rechtmäßigkeit der Verarbeitung', relevance: 'Rechtsgrundlage erforderlich' },
    ],
    riskScore: 10,
    severity: 'INFO',
    requiredControls: ['purpose_limitation', 'transparency'],
    explanation: 'Personenbezogene Daten erfordern eine Rechtsgrundlage nach Art. 6 DSGVO.',
    explanationSimple: 'Wenn Sie Daten verarbeiten, mit denen man Personen identifizieren kann, brauchen Sie einen guten Grund dafür.',
  },

  article_9_data: {
    id: 'article_9_data',
    label: 'Besondere Kategorien (Art. 9)',
    labelSimple: 'Gesundheit, Religion, politische Meinung',
    legalRefs: [
      { article: 'Art. 9 DSGVO', title: 'Besondere Kategorien personenbezogener Daten', relevance: 'Grundsätzliches Verarbeitungsverbot' },
      { article: 'Art. 9(2) DSGVO', title: 'Ausnahmen vom Verbot', relevance: 'Ausdrückliche Einwilligung oder andere Ausnahme erforderlich' },
    ],
    riskScore: 25,
    severity: 'WARN',
    requiredControls: ['explicit_consent', 'dsfa', 'encryption'],
    explanation: 'Besondere Kategorien personenbezogener Daten sind grundsätzlich verboten. Ausnahmen nur bei ausdrücklicher Einwilligung oder anderen Art. 9(2) Gründen.',
    explanationSimple: 'Gesundheitsdaten, religiöse Überzeugungen und ähnlich sensible Daten dürfen nur in Ausnahmefällen verarbeitet werden.',
    userHint: '⚠️ Hohes Risiko - DSFA wahrscheinlich erforderlich',
  },

  minor_data: {
    id: 'minor_data',
    label: 'Daten von Minderjährigen',
    labelSimple: 'Daten von Kindern/Jugendlichen (unter 18)',
    legalRefs: [
      { article: 'Art. 8 DSGVO', title: 'Bedingungen für die Einwilligung eines Kindes', relevance: 'Besondere Anforderungen an Einwilligung' },
      { article: 'ErwGr. 38', title: 'Besonderer Schutz für Kinder', relevance: 'Kinder verdienen besonderen Schutz' },
    ],
    riskScore: 20,
    severity: 'WARN',
    requiredControls: ['parental_consent', 'age_verification', 'data_minimization'],
    explanation: 'Daten von Minderjährigen erfordern besondere Schutzmaßnahmen. Bei Onlinediensten: Einwilligung ab 16 Jahren (in DE), darunter Elterneinwilligung.',
    explanationSimple: 'Bei Kindern und Jugendlichen gelten strengere Regeln. Oft müssen die Eltern zustimmen.',
    userHint: '👶 Besonderer Schutz für Minderjährige erforderlich',
  },

  license_plates: {
    id: 'license_plates',
    label: 'KFZ-Kennzeichen',
    labelSimple: 'Auto-Kennzeichen',
    legalRefs: [
      { article: 'Art. 4(1) DSGVO', title: 'Personenbezogene Daten', relevance: 'Kennzeichen ermöglichen Identifikation des Halters' },
      { article: 'Art. 6 DSGVO', title: 'Rechtmäßigkeit', relevance: 'Rechtsgrundlage für Verarbeitung erforderlich' },
    ],
    riskScore: 15,
    severity: 'WARN',
    requiredControls: ['purpose_limitation', 'retention_policy'],
    explanation: 'KFZ-Kennzeichen sind personenbezogene Daten, da sie die Identifikation des Halters ermöglichen.',
    explanationSimple: 'Über ein Kennzeichen kann man den Fahrzeughalter herausfinden - daher sind es persönliche Daten.',
    userHint: '🚗 Kennzeichen = personenbezogene Daten',
  },

  images: {
    id: 'images',
    label: 'Bilder von Personen',
    labelSimple: 'Fotos mit erkennbaren Gesichtern',
    legalRefs: [
      { article: 'Art. 4(14) DSGVO', title: 'Biometrische Daten', relevance: 'Gesichtsbilder können biometrische Daten sein' },
      { article: '§ 22 KUG', title: 'Recht am eigenen Bild', relevance: 'Einwilligung für Bildveröffentlichung' },
    ],
    riskScore: 15,
    severity: 'WARN',
    requiredControls: ['explicit_consent', 'purpose_limitation'],
    explanation: 'Bilder von Personen sind personenbezogene Daten. Bei Gesichtserkennung: biometrische Daten (Art. 9).',
    explanationSimple: 'Fotos von Menschen brauchen deren Erlaubnis. Gesichtserkennung hat noch strengere Regeln.',
  },

  audio: {
    id: 'audio',
    label: 'Sprachaufnahmen',
    labelSimple: 'Gespräche, Telefonate, Sprachnachrichten',
    legalRefs: [
      { article: 'Art. 4(1) DSGVO', title: 'Personenbezogene Daten', relevance: 'Stimme ermöglicht Identifikation' },
      { article: '§ 201 StGB', title: 'Vertraulichkeit des Wortes', relevance: 'Heimliche Aufnahmen sind strafbar' },
    ],
    riskScore: 15,
    severity: 'WARN',
    requiredControls: ['explicit_consent', 'transparency'],
    explanation: 'Sprachaufnahmen sind personenbezogene Daten. Heimliche Aufnahmen können strafbar sein.',
    explanationSimple: 'Gespräche aufzunehmen erfordert die Zustimmung aller Beteiligten.',
    userHint: '🎤 Aufnahme nur mit Wissen der Betroffenen',
  },

  location_data: {
    id: 'location_data',
    label: 'Standortdaten',
    labelSimple: 'GPS, Aufenthaltsorte, Bewegungsdaten',
    legalRefs: [
      { article: 'Art. 4(1) DSGVO', title: 'Personenbezogene Daten', relevance: 'Standorte ermöglichen Profilbildung' },
      { article: 'ErwGr. 75', title: 'Risiken für Betroffene', relevance: 'Bewegungsprofile sind risikobehaftet' },
    ],
    riskScore: 20,
    severity: 'WARN',
    requiredControls: ['explicit_consent', 'data_minimization', 'retention_policy'],
    explanation: 'Standortdaten ermöglichen detaillierte Bewegungsprofile. Hohes Risiko für Betroffene.',
    explanationSimple: 'Standortdaten zeigen, wo jemand wann war. Das ist sehr persönlich.',
  },

  biometric_data: {
    id: 'biometric_data',
    label: 'Biometrische Daten',
    labelSimple: 'Fingerabdrücke, Gesichtserkennung',
    legalRefs: [
      { article: 'Art. 9(1) DSGVO', title: 'Besondere Kategorien', relevance: 'Biometrische Daten zur Identifikation' },
      { article: 'Art. 4(14) DSGVO', title: 'Definition biometrischer Daten', relevance: 'Technische Verarbeitung physischer Merkmale' },
    ],
    riskScore: 30,
    severity: 'WARN',
    requiredControls: ['explicit_consent', 'dsfa', 'encryption', 'access_logging'],
    explanation: 'Biometrische Daten zur eindeutigen Identifikation fallen unter Art. 9 DSGVO.',
    explanationSimple: 'Fingerabdrücke und Gesichtserkennung sind besonders geschützt.',
    userHint: '⚠️ Art. 9 DSGVO - Besondere Kategorie',
  },

  financial_data: {
    id: 'financial_data',
    label: 'Finanzdaten',
    labelSimple: 'Gehälter, Kontodaten, Kreditwürdigkeit',
    legalRefs: [
      { article: 'Art. 6 DSGVO', title: 'Rechtmäßigkeit', relevance: 'Rechtsgrundlage erforderlich' },
      { article: '§ 31 BDSG', title: 'Schutz des Wirtschaftsverkehrs', relevance: 'Scoring-Regelungen' },
    ],
    riskScore: 15,
    severity: 'INFO',
    requiredControls: ['encryption', 'access_logging', 'purpose_limitation'],
    explanation: 'Finanzdaten erfordern besondere Sicherheitsmaßnahmen.',
    explanationSimple: 'Kontodaten und Gehälter müssen besonders geschützt werden.',
  },

  employee_data: {
    id: 'employee_data',
    label: 'Mitarbeiterdaten',
    labelSimple: 'Personalakten, Bewertungen, Gehälter',
    legalRefs: [
      { article: '§ 26 BDSG', title: 'Beschäftigtendatenschutz', relevance: 'Besondere Regelungen für Arbeitsverhältnisse' },
      { article: 'Art. 88 DSGVO', title: 'Datenverarbeitung im Beschäftigungskontext', relevance: 'Nationale Regelungen möglich' },
    ],
    riskScore: 15,
    severity: 'INFO',
    requiredControls: ['purpose_limitation', 'access_logging', 'transparency'],
    explanation: 'Beschäftigtendaten unterliegen dem § 26 BDSG. Betriebsrat ggf. einzubinden.',
    explanationSimple: 'Bei Mitarbeiterdaten gelten besondere Regeln. Der Betriebsrat hat Mitspracherecht.',
    userHint: '👔 Betriebsrat einbinden',
  },

  customer_data: {
    id: 'customer_data',
    label: 'Kundendaten',
    labelSimple: 'Bestellungen, Kontaktdaten, Kaufhistorie',
    legalRefs: [
      { article: 'Art. 6(1)(b) DSGVO', title: 'Vertragserfüllung', relevance: 'Oft Rechtsgrundlage für Kundendaten' },
    ],
    riskScore: 10,
    severity: 'INFO',
    requiredControls: ['transparency', 'retention_policy'],
    explanation: 'Kundendaten können oft auf Basis der Vertragserfüllung verarbeitet werden.',
    explanationSimple: 'Kundendaten brauchen Sie für Bestellungen - das ist meist erlaubt.',
  },

  public_data: {
    id: 'public_data',
    label: 'Nur öffentliche Daten',
    labelSimple: 'Keine personenbezogenen Daten',
    legalRefs: [
      { article: 'ErwGr. 26', title: 'Anonyme Informationen', relevance: 'DSGVO gilt nicht für anonyme Daten' },
    ],
    riskScore: 0,
    severity: 'INFO',
    requiredControls: [],
    explanation: 'Wenn keine personenbezogenen Daten verarbeitet werden, ist die DSGVO nicht anwendbar.',
    explanationSimple: 'Ohne persönliche Daten gelten die strengen Regeln nicht.',
    userHint: '✅ Geringes Risiko',
  },
}

// ============================================================================
// Feld-Metadaten: Automatisierung
// ============================================================================

export const AUTOMATION_METADATA: Record<string, FieldMetadata> = {
  assistive: {
    id: 'assistive',
    label: 'Assistierend (KI macht Vorschläge)',
    labelSimple: 'KI macht Vorschläge, Mensch entscheidet',
    legalRefs: [],
    riskScore: 0,
    severity: 'INFO',
    requiredControls: [],
    explanation: 'Bei assistierender KI bleibt der Mensch Entscheider. Art. 22 DSGVO nicht betroffen.',
    explanationSimple: 'Die KI schlägt vor, Sie entscheiden. Das ist die sicherste Variante.',
    userHint: '✅ Empfohlen',
  },

  semi_automated: {
    id: 'semi_automated',
    label: 'Teilautomatisiert (Mensch prüft)',
    labelSimple: 'KI filtert vor, Mensch prüft',
    legalRefs: [
      { article: 'ErwGr. 71', title: 'Profiling und automatisierte Entscheidungen', relevance: 'Menschliche Überprüfung empfohlen' },
    ],
    riskScore: 10,
    severity: 'INFO',
    requiredControls: ['human_in_the_loop'],
    explanation: 'Teilautomatisierung mit menschlicher Kontrolle ist meist unproblematisch.',
    explanationSimple: 'Die KI arbeitet vor, aber ein Mensch schaut drüber.',
  },

  fully_automated: {
    id: 'fully_automated',
    label: 'Vollautomatisiert (keine menschliche Prüfung)',
    labelSimple: 'KI entscheidet alleine',
    legalRefs: [
      { article: 'Art. 22(1) DSGVO', title: 'Automatisierte Einzelentscheidungen', relevance: 'Grundsätzliches Verbot bei rechtlicher Wirkung' },
      { article: 'Art. 22(2) DSGVO', title: 'Ausnahmen', relevance: 'Erlaubt bei Vertrag, Gesetz oder Einwilligung' },
    ],
    riskScore: 25,
    severity: 'WARN',
    requiredControls: ['human_in_the_loop', 'contestation_right', 'transparency'],
    explanation: 'Vollautomatisierte Entscheidungen mit rechtlicher Wirkung sind nach Art. 22 DSGVO grundsätzlich verboten.',
    explanationSimple: 'Wenn die KI alleine entscheidet und das Auswirkungen auf Menschen hat, ist das problematisch.',
    userHint: '⚠️ Art. 22 DSGVO beachten',
  },
}

// ============================================================================
// Feld-Metadaten: Zweck
// ============================================================================

export const PURPOSE_METADATA: Record<string, FieldMetadata> = {
  customer_support: {
    id: 'customer_support',
    label: 'Kundenservice',
    labelSimple: 'Fragen beantworten, Hilfe anbieten',
    legalRefs: [
      { article: 'Art. 6(1)(b) DSGVO', title: 'Vertragserfüllung', relevance: 'Oft Rechtsgrundlage' },
    ],
    riskScore: 5,
    severity: 'INFO',
    requiredControls: ['transparency'],
    explanation: 'Kundenservice kann meist auf Vertragserfüllung gestützt werden.',
    explanationSimple: 'Kunden zu helfen ist meist erlaubt.',
  },

  evaluation_scoring: {
    id: 'evaluation_scoring',
    label: 'Bewertung/Scoring von Personen',
    labelSimple: 'Personen bewerten, Punkte vergeben, einstufen',
    legalRefs: [
      { article: 'Art. 22 DSGVO', title: 'Automatisierte Einzelentscheidungen', relevance: 'Bei automatischem Scoring relevant' },
      { article: '§ 31 BDSG', title: 'Scoring', relevance: 'Besondere Regelungen für Scoring' },
    ],
    riskScore: 20,
    severity: 'WARN',
    requiredControls: ['transparency', 'contestation_right', 'dsfa'],
    explanation: 'Scoring von Personen unterliegt strengen Anforderungen. Bei automatisierten Entscheidungen: Art. 22.',
    explanationSimple: 'Menschen zu bewerten oder einzustufen ist sensibel. Betroffene müssen das anfechten können.',
    userHint: '⚠️ Scoring ist risikobehaftet',
  },

  decision_making: {
    id: 'decision_making',
    label: 'Automatisierte Entscheidungen',
    labelSimple: 'Genehmigungen, Ablehnungen, Zugang',
    legalRefs: [
      { article: 'Art. 22 DSGVO', title: 'Automatisierte Einzelentscheidungen', relevance: 'Kernartikel für automatisierte Entscheidungen' },
    ],
    riskScore: 25,
    severity: 'WARN',
    requiredControls: ['human_in_the_loop', 'contestation_right', 'transparency'],
    explanation: 'Automatisierte Entscheidungen mit rechtlicher Wirkung erfordern besondere Schutzmaßnahmen.',
    explanationSimple: 'Wenn die KI über Menschen entscheidet (Kredit, Bewerbung, etc.), gelten strenge Regeln.',
    userHint: '⚠️ Art. 22 DSGVO prüfen',
  },

  profiling: {
    id: 'profiling',
    label: 'Profiling',
    labelSimple: 'Personenprofile erstellen, Verhalten analysieren',
    legalRefs: [
      { article: 'Art. 4(4) DSGVO', title: 'Definition Profiling', relevance: 'Automatisierte Verarbeitung zur Bewertung' },
      { article: 'Art. 22 DSGVO', title: 'Automatisierte Entscheidungen einschl. Profiling', relevance: 'Bei Entscheidungen aufgrund von Profiling' },
    ],
    riskScore: 20,
    severity: 'WARN',
    requiredControls: ['transparency', 'dsfa'],
    explanation: 'Profiling ist die automatisierte Bewertung persönlicher Aspekte. Erfordert Transparenz und oft DSFA.',
    explanationSimple: 'Profile über Menschen zu erstellen erfordert besondere Vorsicht.',
  },

  marketing: {
    id: 'marketing',
    label: 'Marketing/Werbung',
    labelSimple: 'Werbung, Newsletter, Kampagnen',
    legalRefs: [
      { article: 'Art. 6(1)(f) DSGVO', title: 'Berechtigte Interessen', relevance: 'Direktwerbung kann berechtigtes Interesse sein' },
      { article: '§ 7 UWG', title: 'Unzumutbare Belästigung', relevance: 'E-Mail-Werbung nur mit Einwilligung' },
    ],
    riskScore: 10,
    severity: 'INFO',
    requiredControls: ['explicit_consent', 'transparency'],
    explanation: 'E-Mail-Marketing erfordert i.d.R. Einwilligung (Opt-in).',
    explanationSimple: 'Für Werbe-E-Mails brauchen Sie die Erlaubnis der Empfänger.',
  },

  analytics: {
    id: 'analytics',
    label: 'Analyse/Statistik',
    labelSimple: 'Auswertungen, Berichte, Trends',
    legalRefs: [
      { article: 'Art. 6(1)(f) DSGVO', title: 'Berechtigte Interessen', relevance: 'Analysen oft auf berechtigtes Interesse stützbar' },
    ],
    riskScore: 5,
    severity: 'INFO',
    requiredControls: ['data_minimization'],
    explanation: 'Statistische Analysen sind oft auf berechtigtes Interesse stützbar, wenn datenminimiert.',
    explanationSimple: 'Auswertungen für interne Zwecke sind meist unproblematisch.',
  },

  research: {
    id: 'research',
    label: 'Forschung',
    labelSimple: 'Wissenschaftliche Untersuchungen',
    legalRefs: [
      { article: 'Art. 89 DSGVO', title: 'Garantien für Forschungszwecke', relevance: 'Privilegierung von Forschung' },
    ],
    riskScore: 5,
    severity: 'INFO',
    requiredControls: ['data_minimization', 'pseudonymization'],
    explanation: 'Forschung genießt gewisse Privilegien, erfordert aber Schutzmaßnahmen.',
    explanationSimple: 'Forschung hat Sonderregeln, wenn die Daten geschützt werden.',
  },
}

// ============================================================================
// Feld-Metadaten: Hosting
// ============================================================================

export const HOSTING_METADATA: Record<string, FieldMetadata> = {
  eu: {
    id: 'eu',
    label: 'EU/EWR',
    labelSimple: 'In Deutschland oder EU',
    legalRefs: [],
    riskScore: 0,
    severity: 'INFO',
    requiredControls: [],
    explanation: 'Hosting in der EU ist datenschutzrechtlich unproblematisch.',
    explanationSimple: 'Daten in Europa zu speichern ist die einfachste Lösung.',
    userHint: '✅ Empfohlen',
  },

  third_country: {
    id: 'third_country',
    label: 'Drittland (außerhalb EU)',
    labelSimple: 'USA, Schweiz, UK, andere',
    legalRefs: [
      { article: 'Art. 44 DSGVO', title: 'Grundsatz für Übermittlung', relevance: 'Besondere Anforderungen an Drittlandtransfer' },
      { article: 'Art. 46 DSGVO', title: 'Geeignete Garantien', relevance: 'SCC oder andere Garantien erforderlich' },
    ],
    riskScore: 15,
    severity: 'WARN',
    requiredControls: ['scc', 'tia'],
    explanation: 'Drittlandtransfer erfordert zusätzliche Garantien (z.B. SCC) und ein Transfer Impact Assessment.',
    explanationSimple: 'Daten außerhalb der EU zu speichern braucht extra Verträge und Prüfungen.',
    userHint: '⚠️ Zusätzliche Maßnahmen erforderlich',
  },

  on_prem: {
    id: 'on_prem',
    label: 'On-Premise (eigene Server)',
    labelSimple: 'Auf unseren eigenen Servern',
    legalRefs: [],
    riskScore: 0,
    severity: 'INFO',
    requiredControls: ['encryption'],
    explanation: 'On-Premise bietet volle Kontrolle, erfordert aber eigene Sicherheitsmaßnahmen.',
    explanationSimple: 'Eigene Server geben volle Kontrolle, aber Sie sind für die Sicherheit verantwortlich.',
  },
}

// ============================================================================
// Feld-Metadaten: Modell-Nutzung
// ============================================================================

export const MODEL_USAGE_METADATA: Record<string, FieldMetadata> = {
  rag: {
    id: 'rag',
    label: 'RAG (Dokumentensuche)',
    labelSimple: 'KI durchsucht meine Dokumente',
    legalRefs: [],
    riskScore: 5,
    severity: 'INFO',
    requiredControls: [],
    explanation: 'RAG-Ansätze sind datenschutzfreundlich, da keine Daten ins Modell fließen.',
    explanationSimple: 'Die KI sucht in Ihren Dokumenten, lernt aber nicht daraus. Das ist sicher.',
    userHint: '✅ Datenschutzfreundlich',
  },

  inference: {
    id: 'inference',
    label: 'Nur Inferenz',
    labelSimple: 'KI nur nutzen, ohne eigene Daten',
    legalRefs: [],
    riskScore: 0,
    severity: 'INFO',
    requiredControls: [],
    explanation: 'Reine Inferenz ohne Datenspeicherung ist unproblematisch.',
    explanationSimple: 'Die KI nutzen ohne eigene Daten einzugeben ist sicher.',
    userHint: '✅ Geringes Risiko',
  },

  finetune: {
    id: 'finetune',
    label: 'Fine-Tuning',
    labelSimple: 'KI mit meinen Daten anpassen',
    legalRefs: [
      { article: 'Art. 5(1)(b) DSGVO', title: 'Zweckbindung', relevance: 'Training ist neuer Zweck' },
    ],
    riskScore: 20,
    severity: 'WARN',
    requiredControls: ['explicit_consent', 'purpose_limitation', 'no_training'],
    explanation: 'Fine-Tuning mit personenbezogenen Daten erfordert eigene Rechtsgrundlage.',
    explanationSimple: 'Wenn die KI aus Ihren Daten lernt, ist das ein eigener Verarbeitungsschritt.',
    userHint: '⚠️ Eigene Rechtsgrundlage erforderlich',
  },

  training: {
    id: 'training',
    label: 'Vollständiges Training',
    labelSimple: 'KI komplett mit meinen Daten trainieren',
    legalRefs: [
      { article: 'Art. 5(1)(b) DSGVO', title: 'Zweckbindung', relevance: 'Training ist neuer Zweck' },
      { article: 'Art. 6 DSGVO', title: 'Rechtmäßigkeit', relevance: 'Eigene Rechtsgrundlage erforderlich' },
    ],
    riskScore: 25,
    severity: 'WARN',
    requiredControls: ['explicit_consent', 'dsfa', 'purpose_limitation'],
    explanation: 'KI-Training mit personenbezogenen Daten ist ein eigenständiger Verarbeitungszweck.',
    explanationSimple: 'Die KI komplett mit Ihren Daten zu trainieren braucht klare Einwilligung.',
    userHint: '⚠️ Hohes Risiko',
  },
}

// ============================================================================
// Probleme & Lösungen
// ============================================================================

export const PROBLEMS: Problem[] = [
  // KFZ-Kennzeichen ohne Einwilligung
  {
    id: 'license_plates_no_consent',
    title: 'KFZ-Kennzeichen ohne Einwilligung',
    description: 'Sie möchten KFZ-Kennzeichen verarbeiten, aber haben keine Einwilligung der Fahrzeughalter.',
    severity: 'BLOCK',
    triggered_by: {
      all_of: ['license_plates'],
      none_of: ['explicit_consent_obtained'],
    },
    legalRefs: [
      { article: 'Art. 6 DSGVO', title: 'Rechtmäßigkeit', relevance: 'Keine Rechtsgrundlage vorhanden' },
    ],
    solutions: [
      {
        id: 'pixelize_plates',
        title: 'Kennzeichen automatisch verpixeln',
        description: 'Die Kennzeichen werden vor der Speicherung automatisch unkenntlich gemacht. Dadurch sind es keine personenbezogenen Daten mehr.',
        removes_fields: ['license_plates'],
        adds_controls: ['pixelization'],
        new_risk_score: 0,
        effort: 'medium',
        team_question: 'Ist das Projekt auch mit verpixelten Kennzeichen (nicht lesbar) sinnvoll?',
      },
      {
        id: 'obtain_consent',
        title: 'Einwilligung einholen',
        description: 'Die Fahrzeughalter um Einwilligung bitten (z.B. bei Parkhausbetreibern mit Dauerparker-Verträgen).',
        adds_controls: ['explicit_consent'],
        new_risk_score: 10,
        effort: 'high',
        team_question: 'Können Sie die Einwilligung der Fahrzeughalter einholen?',
      },
    ],
  },

  // Gesichtserkennung ohne Einwilligung
  {
    id: 'biometrics_no_consent',
    title: 'Biometrische Daten ohne Einwilligung',
    description: 'Sie möchten biometrische Daten (z.B. Gesichtserkennung) verarbeiten, aber haben keine ausdrückliche Einwilligung.',
    severity: 'BLOCK',
    triggered_by: {
      all_of: ['biometric_data'],
      none_of: ['explicit_consent_obtained'],
    },
    legalRefs: [
      { article: 'Art. 9(1) DSGVO', title: 'Verarbeitungsverbot', relevance: 'Biometrische Daten sind besondere Kategorie' },
      { article: 'Art. 9(2)(a) DSGVO', title: 'Ausdrückliche Einwilligung', relevance: 'Einwilligung als Ausnahme' },
    ],
    solutions: [
      {
        id: 'anonymize_faces',
        title: 'Gesichter automatisch verpixeln/anonymisieren',
        description: 'Gesichter werden vor der Speicherung automatisch unkenntlich gemacht.',
        removes_fields: ['biometric_data'],
        adds_controls: ['pixelization'],
        new_risk_score: 0,
        effort: 'medium',
        team_question: 'Funktioniert Ihr Projekt auch ohne erkennbare Gesichter?',
      },
      {
        id: 'explicit_biometric_consent',
        title: 'Ausdrückliche Einwilligung einholen',
        description: 'Betroffene müssen aktiv und informiert in die Gesichtserkennung einwilligen.',
        adds_controls: ['explicit_consent', 'dsfa'],
        new_risk_score: 20,
        effort: 'high',
        team_question: 'Können Sie eine ausdrückliche Einwilligung aller Betroffenen sicherstellen?',
      },
    ],
  },

  // Minderjährige + automatisiertes Scoring
  {
    id: 'minor_automated_scoring',
    title: 'Automatisiertes Scoring von Minderjährigen',
    description: 'Sie möchten Minderjährige automatisiert bewerten oder einstufen. Das ist besonders problematisch.',
    severity: 'BLOCK',
    triggered_by: {
      all_of: ['minor_data', 'evaluation_scoring', 'fully_automated'],
    },
    legalRefs: [
      { article: 'Art. 22(1) DSGVO', title: 'Verbot automatisierter Entscheidungen', relevance: 'Grundsätzliches Verbot' },
      { article: 'Art. 8 DSGVO', title: 'Schutz von Kindern', relevance: 'Besonderer Schutz für Minderjährige' },
    ],
    solutions: [
      {
        id: 'add_human_review',
        title: 'Menschliche Überprüfung einführen',
        description: 'Jede Bewertung wird von einem Menschen geprüft bevor sie wirksam wird.',
        removes_fields: ['fully_automated'],
        adds_controls: ['human_in_the_loop'],
        new_risk_score: 15,
        effort: 'medium',
        team_question: 'Können Sie sicherstellen, dass ein Mensch jede Bewertung prüft?',
      },
      {
        id: 'remove_scoring',
        title: 'Auf Scoring verzichten',
        description: 'Statt Scoring nur informative Auswertungen ohne Entscheidungscharakter.',
        removes_fields: ['evaluation_scoring'],
        new_risk_score: 10,
        effort: 'low',
        team_question: 'Funktioniert Ihr Projekt auch ohne Bewertung/Scoring der Minderjährigen?',
      },
    ],
  },

  // Drittland + sensible Daten
  {
    id: 'third_country_sensitive',
    title: 'Sensible Daten im Drittland',
    description: 'Sie möchten besonders sensible Daten außerhalb der EU verarbeiten. Das erfordert umfangreiche Schutzmaßnahmen.',
    severity: 'WARN',
    triggered_by: {
      all_of: ['third_country'],
      any_of: ['article_9_data', 'biometric_data', 'minor_data'],
    },
    legalRefs: [
      { article: 'Art. 44 DSGVO', title: 'Drittlandtransfer', relevance: 'Besondere Anforderungen' },
      { article: 'Art. 9 DSGVO', title: 'Sensible Daten', relevance: 'Zusätzlicher Schutz erforderlich' },
    ],
    solutions: [
      {
        id: 'move_to_eu',
        title: 'Hosting in der EU',
        description: 'Wählen Sie einen Anbieter mit Rechenzentren in der EU.',
        removes_fields: ['third_country'],
        new_risk_score: 0,
        effort: 'medium',
        team_question: 'Können Sie zu einem EU-Anbieter wechseln?',
      },
      {
        id: 'implement_safeguards',
        title: 'Umfangreiche Schutzmaßnahmen implementieren',
        description: 'SCC, TIA, zusätzliche technische Maßnahmen implementieren.',
        adds_controls: ['scc', 'tia', 'encryption'],
        new_risk_score: 15,
        effort: 'high',
        team_question: 'Können Sie die erforderlichen Verträge und Maßnahmen umsetzen?',
      },
    ],
  },

  // KI-Training mit personenbezogenen Daten
  {
    id: 'training_with_pii',
    title: 'KI-Training mit personenbezogenen Daten',
    description: 'Sie möchten ein KI-Modell mit personenbezogenen Daten trainieren. Das erfordert besondere Rechtsgrundlagen.',
    severity: 'WARN',
    triggered_by: {
      all_of: ['training'],
      any_of: ['personal_data', 'article_9_data', 'employee_data', 'customer_data'],
    },
    legalRefs: [
      { article: 'Art. 5(1)(b) DSGVO', title: 'Zweckbindung', relevance: 'Training ist eigener Zweck' },
      { article: 'Art. 6 DSGVO', title: 'Rechtmäßigkeit', relevance: 'Eigene Rechtsgrundlage erforderlich' },
    ],
    solutions: [
      {
        id: 'use_rag_instead',
        title: 'RAG statt Training verwenden',
        description: 'Statt Training: Dokumente in Vektordatenbank ablegen und bei Anfragen durchsuchen.',
        removes_fields: ['training'],
        new_risk_score: 5,
        effort: 'low',
        team_question: 'Reicht es, wenn die KI Ihre Dokumente durchsuchen kann statt daraus zu lernen?',
      },
      {
        id: 'anonymize_training_data',
        title: 'Trainingsdaten anonymisieren',
        description: 'Personenbezogene Daten vor dem Training vollständig anonymisieren.',
        adds_controls: ['anonymization'],
        new_risk_score: 5,
        effort: 'high',
        team_question: 'Können die Trainingsdaten vor dem Training anonymisiert werden?',
      },
      {
        id: 'get_training_consent',
        title: 'Einwilligung für Training einholen',
        description: 'Betroffene explizit um Einwilligung für das KI-Training bitten.',
        adds_controls: ['explicit_consent', 'dsfa'],
        new_risk_score: 15,
        effort: 'high',
        team_question: 'Können Sie die Einwilligung aller Betroffenen für das KI-Training einholen?',
      },
    ],
  },
]

// ============================================================================
// Hilfsfunktionen
// ============================================================================

/**
 * Aggregiert alle ausgewählten Felder und berechnet das Ergebnis
 */
export function evaluateSelection(selection: {
  dataTypes: string[]
  automation: string
  purposes: string[]
  hosting: string
  modelUsage: string[]
  acceptedSolutions: string[]
}): {
  totalRiskScore: number
  allLegalRefs: LegalReference[]
  allRequiredControls: string[]
  problems: Problem[]
  severity: 'INFO' | 'WARN' | 'BLOCK'
} {
  const allLegalRefs: LegalReference[] = []
  const allRequiredControls: Set<string> = new Set()
  let totalRiskScore = 0
  let maxSeverity: 'INFO' | 'WARN' | 'BLOCK' = 'INFO'

  // Aggregiere Datentypen
  for (const dt of selection.dataTypes) {
    const meta = DATA_TYPE_METADATA[dt]
    if (meta) {
      totalRiskScore += meta.riskScore
      allLegalRefs.push(...meta.legalRefs)
      meta.requiredControls.forEach(c => allRequiredControls.add(c))
      if (meta.severity === 'BLOCK') maxSeverity = 'BLOCK'
      else if (meta.severity === 'WARN' && maxSeverity !== 'BLOCK') maxSeverity = 'WARN'
    }
  }

  // Aggregiere Automatisierung
  const autoMeta = AUTOMATION_METADATA[selection.automation]
  if (autoMeta) {
    totalRiskScore += autoMeta.riskScore
    allLegalRefs.push(...autoMeta.legalRefs)
    autoMeta.requiredControls.forEach(c => allRequiredControls.add(c))
    if (autoMeta.severity === 'BLOCK') maxSeverity = 'BLOCK'
    else if (autoMeta.severity === 'WARN' && maxSeverity !== 'BLOCK') maxSeverity = 'WARN'
  }

  // Aggregiere Zwecke
  for (const p of selection.purposes) {
    const meta = PURPOSE_METADATA[p]
    if (meta) {
      totalRiskScore += meta.riskScore
      allLegalRefs.push(...meta.legalRefs)
      meta.requiredControls.forEach(c => allRequiredControls.add(c))
      if (meta.severity === 'BLOCK') maxSeverity = 'BLOCK'
      else if (meta.severity === 'WARN' && maxSeverity !== 'BLOCK') maxSeverity = 'WARN'
    }
  }

  // Aggregiere Hosting
  const hostMeta = HOSTING_METADATA[selection.hosting]
  if (hostMeta) {
    totalRiskScore += hostMeta.riskScore
    allLegalRefs.push(...hostMeta.legalRefs)
    hostMeta.requiredControls.forEach(c => allRequiredControls.add(c))
    if (hostMeta.severity === 'BLOCK') maxSeverity = 'BLOCK'
    else if (hostMeta.severity === 'WARN' && maxSeverity !== 'BLOCK') maxSeverity = 'WARN'
  }

  // Aggregiere Model Usage
  for (const mu of selection.modelUsage) {
    const meta = MODEL_USAGE_METADATA[mu]
    if (meta) {
      totalRiskScore += meta.riskScore
      allLegalRefs.push(...meta.legalRefs)
      meta.requiredControls.forEach(c => allRequiredControls.add(c))
      if (meta.severity === 'BLOCK') maxSeverity = 'BLOCK'
      else if (meta.severity === 'WARN' && maxSeverity !== 'BLOCK') maxSeverity = 'WARN'
    }
  }

  // Finde zutreffende Probleme
  const allSelectedFields = [
    ...selection.dataTypes,
    selection.automation,
    ...selection.purposes,
    selection.hosting,
    ...selection.modelUsage,
  ]

  const triggeredProblems = PROBLEMS.filter(problem => {
    // Prüfe all_of: alle müssen ausgewählt sein
    if (problem.triggered_by.all_of) {
      if (!problem.triggered_by.all_of.every(f => allSelectedFields.includes(f))) {
        return false
      }
    }

    // Prüfe any_of: mindestens eins muss ausgewählt sein
    if (problem.triggered_by.any_of) {
      if (!problem.triggered_by.any_of.some(f => allSelectedFields.includes(f))) {
        return false
      }
    }

    // Prüfe none_of: keins darf ausgewählt sein (außer durch Lösung)
    if (problem.triggered_by.none_of) {
      const hasNoneOf = problem.triggered_by.none_of.some(f =>
        allSelectedFields.includes(f) || selection.acceptedSolutions.includes(f)
      )
      if (hasNoneOf) {
        return false
      }
    }

    // Prüfe ob Problem durch akzeptierte Lösung gelöst wurde
    const isSolved = problem.solutions.some(solution =>
      selection.acceptedSolutions.includes(solution.id)
    )

    return !isSolved
  })

  // Probleme beeinflussen Severity
  for (const problem of triggeredProblems) {
    if (problem.severity === 'BLOCK') maxSeverity = 'BLOCK'
    else if (problem.severity === 'WARN' && maxSeverity !== 'BLOCK') maxSeverity = 'WARN'
  }

  // Dedupliziere Legal Refs
  const uniqueLegalRefs = allLegalRefs.filter((ref, index, self) =>
    index === self.findIndex(r => r.article === ref.article)
  )

  return {
    totalRiskScore: Math.min(totalRiskScore, 100),
    allLegalRefs: uniqueLegalRefs,
    allRequiredControls: Array.from(allRequiredControls),
    problems: triggeredProblems,
    severity: maxSeverity,
  }
}
