/**
 * DSFA AI Use Case Types
 *
 * Type definitions, constants, and helpers for Section 8 "KI-Anwendungsfälle"
 * of the DSFA module. Covers Art. 22 DSGVO, EU AI Act risk classification,
 * and WP248-based risk criteria for AI/ML processing activities.
 */

import type { DSFARiskLevel } from './types'

// =============================================================================
// ENUMS & UNION TYPES
// =============================================================================

export type AIUseCaseType =
  | 'chatbot_nlp'
  | 'recommendation'
  | 'adm_scoring'
  | 'video_image'
  | 'biometrics'
  | 'iot_sensors'
  | 'generative_ai'
  | 'custom'

export type AIActRiskClass =
  | 'unacceptable'
  | 'high_risk'
  | 'limited'
  | 'minimal'

export type Art22ExceptionType =
  | 'contract'      // Art. 22 Abs. 2 lit. a – Vertragserfüllung
  | 'legal'         // Art. 22 Abs. 2 lit. b – gesetzliche Verpflichtung
  | 'consent'       // Art. 22 Abs. 2 lit. c – explizite Einwilligung

export type PrivacyByDesignCategory =
  | 'data_minimisation'
  | 'pseudonymisation'
  | 'encryption'
  | 'purpose_limitation'
  | 'access_control'
  | 'audit_logging'
  | 'explainability'
  | 'human_oversight'
  | 'fairness_testing'
  | 'model_governance'

export type AIModuleReviewTriggerType =
  | 'model_update'
  | 'data_drift'
  | 'accuracy_drop'
  | 'new_use_case'
  | 'regulatory_change'
  | 'incident'
  | 'periodic'

// =============================================================================
// INTERFACES
// =============================================================================

export interface Art22Assessment {
  applies: boolean
  justification?: string
  exception_type?: Art22ExceptionType
  safeguards: Art22Safeguard[]
}

export interface Art22Safeguard {
  id: string
  label: string
  implemented: boolean
  description?: string
}

export interface AIUseCaseRiskCriterion {
  id: string
  applies: boolean
  justification?: string
  severity: 'low' | 'medium' | 'high'
}

export interface PrivacyByDesignMeasure {
  category: PrivacyByDesignCategory
  description: string
  implemented: boolean
  implementation_date?: string
}

export interface AIModuleReviewTrigger {
  type: AIModuleReviewTriggerType
  description: string
  threshold?: string    // e.g. "accuracy < 80%"
  monitoring_interval?: string  // e.g. "weekly"
}

export interface AIUseCaseModuleRisk {
  risk_id: string      // Reference to DSFA risk catalog entry
  description: string
  likelihood: 'low' | 'medium' | 'high'
  impact: 'low' | 'medium' | 'high'
  mitigation_ids: string[]
}

export interface AIUseCaseModuleMitigation {
  mitigation_id: string  // Reference to DSFA mitigation library
  description: string
  status: 'planned' | 'in_progress' | 'implemented'
}

export interface AIUseCaseModule {
  id: string
  use_case_type: AIUseCaseType
  created_at: string
  updated_at: string

  // Tab 1: Systembeschreibung
  name: string
  model_description: string         // Art und Weise des KI-Systems
  model_type?: string               // z.B. "Random Forest", "GPT-based LLM"
  data_flow_description?: string    // Datenfluss-Beschreibung
  provider?: string                 // Anbieter / Dienstleister
  provider_country?: string         // Datenübermittlung Drittland?
  third_country_transfer: boolean

  // Tab 2: Daten & Betroffene
  input_data_categories: string[]
  output_data_categories: string[]
  involves_special_categories: boolean
  special_categories_justification?: string
  data_subjects: string[]
  estimated_volume?: string         // z.B. ">10.000 Personen"
  data_retention_months?: number

  // Tab 3: Zweck & Rechtsgrundlage
  processing_purpose: string
  legal_basis: string
  legal_basis_details?: string
  art22_assessment: Art22Assessment

  // Tab 4: KI-Kriterien & AI Act
  risk_criteria: AIUseCaseRiskCriterion[]
  ai_act_risk_class: AIActRiskClass
  ai_act_justification?: string
  wp248_criteria_met: string[]      // IDs der relevanten WP248-Kriterien

  // Tab 5: Risikoanalyse
  risks: AIUseCaseModuleRisk[]

  // Tab 6: Maßnahmen & Privacy by Design
  mitigations: AIUseCaseModuleMitigation[]
  privacy_by_design_measures: PrivacyByDesignMeasure[]

  // Tab 7: Review-Trigger & Monitoring
  review_triggers: AIModuleReviewTrigger[]
  monitoring_description?: string
  last_reviewed_at?: string
  next_review_date?: string
}

// =============================================================================
// CONSTANTS
// =============================================================================

export const AI_USE_CASE_TYPES: Record<AIUseCaseType, {
  label: string
  icon: string
  description: string
  typical_risks: string[]
  wp248_criteria: string[]
}> = {
  chatbot_nlp: {
    label: 'Chatbot / NLP',
    icon: '💬',
    description: 'Natürliche Sprachverarbeitung, Konversationssysteme, automatisierte Kundenkommunikation',
    typical_risks: ['Fehlinformation', 'Datenpersistenz im Verlauf', 'Unbeabsichtigte Datenoffenbarung'],
    wp248_criteria: ['K1', 'K4'],
  },
  recommendation: {
    label: 'Empfehlungssystem',
    icon: '🎯',
    description: 'Personalisierung, Inhaltsempfehlungen, Produktvorschläge basierend auf Nutzerverhalten',
    typical_risks: ['Profiling', 'Verhaltensmanipulation', 'Filterblasen'],
    wp248_criteria: ['K1', 'K3', 'K6'],
  },
  adm_scoring: {
    label: 'ADM / Scoring',
    icon: '⚖️',
    description: 'Automatisierte Entscheidungsfindung mit Rechtswirkung, Bonitätsprüfung, HR-Scoring',
    typical_risks: ['Diskriminierung', 'Fehlende Erklärbarkeit', 'Art. 22-Verletzung'],
    wp248_criteria: ['K1', 'K2', 'K3', 'K5'],
  },
  video_image: {
    label: 'Video / Bildanalyse',
    icon: '📹',
    description: 'Videoüberwachung, Bildklassifikation, Objekterkennung, Verhaltensanalyse',
    typical_risks: ['Systematische Überwachung', 'Verdeckte Verarbeitung', 'Biometrische Ableitung'],
    wp248_criteria: ['K2', 'K3', 'K6', 'K7'],
  },
  biometrics: {
    label: 'Biometrische Daten',
    icon: '👁️',
    description: 'Gesichtserkennung, Fingerabdruck, Stimmerkennung, biometrische Authentifizierung',
    typical_risks: ['Art. 9-Daten', 'Unwiderruflichkeit biometrischer Merkmale', 'Identitätsdiebstahl'],
    wp248_criteria: ['K2', 'K3', 'K4', 'K7'],
  },
  iot_sensors: {
    label: 'IoT / Sensordaten',
    icon: '📡',
    description: 'Standortverfolgung, Verhaltenssensoren, Smart Home, Wearables',
    typical_risks: ['Lückenlose Überwachung', 'Kontextinferenz', 'Datenmenge'],
    wp248_criteria: ['K2', 'K3', 'K5'],
  },
  generative_ai: {
    label: 'Generative KI',
    icon: '🤖',
    description: 'LLMs, Bildgenerierung, Code-Generierung, synthetische Daten, RAG-Systeme',
    typical_risks: ['Halluzinationen', 'Datenleckage im Prompt', 'Urheberrecht', 'Deepfakes'],
    wp248_criteria: ['K1', 'K4', 'K6', 'K9'],
  },
  custom: {
    label: 'Sonstige KI',
    icon: '⚙️',
    description: 'Sonstige KI-gestützte Verarbeitung personenbezogener Daten',
    typical_risks: ['Unbekannte Nebenwirkungen', 'Datenschutz durch Design fehlt'],
    wp248_criteria: [],
  },
}

export const AI_RISK_CRITERIA: Array<{
  id: string
  label: string
  description: string
  gdpr_ref: string
  default_severity: 'low' | 'medium' | 'high'
}> = [
  {
    id: 'adm_profiling',
    label: 'ADM / Profiling',
    description: 'Automatisierte Entscheidungen oder systematisches Profiling mit Auswirkungen auf Personen',
    gdpr_ref: 'Art. 22 DSGVO, Erwägungsgrund 71, WP248 K1',
    default_severity: 'high',
  },
  {
    id: 'systematic_monitoring',
    label: 'Systematische Überwachung',
    description: 'Überwachung öffentlicher Bereiche oder systematische Beobachtung von Personen',
    gdpr_ref: 'Art. 35 Abs. 3 lit. c DSGVO, WP248 K2',
    default_severity: 'high',
  },
  {
    id: 'large_scale',
    label: 'Großflächige Verarbeitung',
    description: 'Verarbeitung in großem Umfang nach Art. 9 oder Strafverfolgungsdaten',
    gdpr_ref: 'Art. 35 Abs. 3 lit. b DSGVO, WP248 K3',
    default_severity: 'medium',
  },
  {
    id: 'innovative_tech',
    label: 'Innovative Technologie',
    description: 'Einsatz neuer Technologien mit unbekannten Risiken für die betroffenen Personen',
    gdpr_ref: 'Art. 35 Abs. 1 DSGVO, Erwägungsgrund 89, WP248 K9',
    default_severity: 'medium',
  },
  {
    id: 'change_trigger',
    label: 'Wesentliche Änderung',
    description: 'Änderung des Verarbeitungszwecks, Datenbasis oder Modells seit letzter DSFA',
    gdpr_ref: 'Art. 35 Abs. 11 DSGVO',
    default_severity: 'low',
  },
  {
    id: 'dpo_consultation',
    label: 'DSB-Konsultation empfohlen',
    description: 'KI-System fällt in die Blacklist der Aufsichtsbehörde oder hat >= 2 Risikopunkte',
    gdpr_ref: 'Art. 35 Abs. 4 DSGVO, DSK-Blacklist',
    default_severity: 'high',
  },
]

export const AI_ACT_RISK_CLASSES: Record<AIActRiskClass, {
  label: string
  labelDE: string
  color: string
  description: string
  requirements: string[]
}> = {
  unacceptable: {
    label: 'Unacceptable Risk',
    labelDE: 'Unannehmbares Risiko',
    color: 'red',
    description: 'KI-Systeme mit unannehmbarem Risiko sind vollständig verboten (z.B. Social Scoring, subliminale Manipulation)',
    requirements: ['VERBOTEN – Betrieb nicht gestattet'],
  },
  high_risk: {
    label: 'High Risk',
    labelDE: 'Hochrisiko-KI',
    color: 'orange',
    description: 'Hochrisiko-KI in Anhang III EU AI Act (z.B. Bildung, Beschäftigung, kritische Infrastruktur)',
    requirements: [
      'Risikomanagementsystem (Art. 9 AI Act)',
      'Datenverwaltung und -qualität (Art. 10)',
      'Technische Dokumentation (Art. 11)',
      'Aufzeichnungspflicht / Logging (Art. 12)',
      'Transparenz gegenüber Nutzern (Art. 13)',
      'Menschliche Aufsicht (Art. 14)',
      'Genauigkeit, Robustheit, Cybersicherheit (Art. 15)',
    ],
  },
  limited: {
    label: 'Limited Risk',
    labelDE: 'Begrenztes Risiko',
    color: 'yellow',
    description: 'Transparenzpflichten: Nutzer müssen wissen, dass sie mit KI interagieren',
    requirements: [
      'Offenlegungspflicht bei KI-Interaktion (Art. 52 AI Act)',
      'Kennzeichnung KI-generierter Inhalte',
    ],
  },
  minimal: {
    label: 'Minimal Risk',
    labelDE: 'Minimales Risiko',
    color: 'green',
    description: 'KI mit minimalem Risiko (Spam-Filter, Empfehlungssysteme ohne wesentliche Auswirkung)',
    requirements: ['Keine spezifischen Anforderungen aus AI Act'],
  },
}

export const PRIVACY_BY_DESIGN_CATEGORIES: Record<PrivacyByDesignCategory, {
  label: string
  icon: string
  description: string
}> = {
  data_minimisation: { label: 'Datenminimierung', icon: '✂️', description: 'Nur notwendige Daten verarbeiten' },
  pseudonymisation: { label: 'Pseudonymisierung', icon: '🔒', description: 'Personenbezug auflösen' },
  encryption: { label: 'Verschlüsselung', icon: '🔐', description: 'Daten in Ruhe und in Übertragung verschlüsseln' },
  purpose_limitation: { label: 'Zweckbindung', icon: '🎯', description: 'Strikte Zweckbegrenzung durchsetzen' },
  access_control: { label: 'Zugriffssteuerung', icon: '👥', description: 'Least Privilege für Modell und Daten' },
  audit_logging: { label: 'Audit-Logging', icon: '📋', description: 'Alle Modellentscheidungen protokollieren' },
  explainability: { label: 'Erklärbarkeit', icon: '💡', description: 'Entscheidungen nachvollziehbar machen' },
  human_oversight: { label: 'Menschliche Kontrolle', icon: '👤', description: 'Human-in-the-Loop / Human-on-the-Loop' },
  fairness_testing: { label: 'Fairness-Tests', icon: '⚖️', description: 'Diskriminierung erkennen und vermeiden' },
  model_governance: { label: 'Modell-Governance', icon: '📊', description: 'Versionierung, Drift-Monitoring, Re-Training' },
}

export const ART22_SAFEGUARDS: Art22Safeguard[] = [
  {
    id: 'human_review',
    label: 'Recht auf menschliche Überprüfung',
    implemented: false,
    description: 'Betroffene können verlangen, dass die Entscheidung von einem Menschen überprüft wird',
  },
  {
    id: 'contestation_right',
    label: 'Anfechtungsrecht',
    implemented: false,
    description: 'Betroffene können die automatisierte Entscheidung anfechten',
  },
  {
    id: 'explanation_duty',
    label: 'Erklärungspflicht',
    implemented: false,
    description: 'Betroffene werden über die Logik und Auswirkung der Entscheidung informiert',
  },
  {
    id: 'prior_information',
    label: 'Vorabinformation',
    implemented: false,
    description: 'Betroffene werden über ADM informiert, bevor es angewandt wird',
  },
]

// =============================================================================
// HELPER FUNCTIONS
// =============================================================================

export function createEmptyModule(type: AIUseCaseType): AIUseCaseModule {
  const typeInfo = AI_USE_CASE_TYPES[type]
  const now = new Date().toISOString()

  return {
    id: crypto.randomUUID(),
    use_case_type: type,
    created_at: now,
    updated_at: now,

    name: typeInfo.label,
    model_description: '',
    third_country_transfer: false,

    input_data_categories: [],
    output_data_categories: [],
    involves_special_categories: false,
    data_subjects: [],

    processing_purpose: '',
    legal_basis: '',
    art22_assessment: {
      applies: false,
      safeguards: ART22_SAFEGUARDS.map(s => ({ ...s })),
    },

    risk_criteria: AI_RISK_CRITERIA.map(c => ({
      id: c.id,
      applies: false,
      severity: c.default_severity,
    })),
    ai_act_risk_class: 'minimal',
    wp248_criteria_met: typeInfo.wp248_criteria,

    risks: [],
    mitigations: [],
    privacy_by_design_measures: [],
    review_triggers: [],
  }
}

export function calculateModuleRiskLevel(module: AIUseCaseModule): DSFARiskLevel {
  const appliedCriteria = module.risk_criteria.filter(c => c.applies)
  const highCount = appliedCriteria.filter(c => c.severity === 'high').length
  const mediumCount = appliedCriteria.filter(c => c.severity === 'medium').length

  if (module.ai_act_risk_class === 'unacceptable') return 'very_high'
  if (module.ai_act_risk_class === 'high_risk' || highCount >= 2) return 'high'
  if (highCount === 1 || mediumCount >= 2) return 'medium'
  if (mediumCount === 1 || appliedCriteria.length > 0) return 'low'
  return 'low'
}

export function checkArt22Applicability(module: AIUseCaseModule): boolean {
  return module.use_case_type === 'adm_scoring' ||
    module.risk_criteria.some(c => c.id === 'adm_profiling' && c.applies)
}

export function getModuleCompletionPercentage(module: AIUseCaseModule): number {
  const checks = [
    !!module.name,
    !!module.model_description,
    module.input_data_categories.length > 0,
    module.data_subjects.length > 0,
    !!module.processing_purpose,
    !!module.legal_basis,
    module.risk_criteria.some(c => c.applies !== undefined),
    !!module.ai_act_risk_class,
    module.risks.length > 0,
    module.privacy_by_design_measures.length > 0,
  ]
  return Math.round((checks.filter(Boolean).length / checks.length) * 100)
}
