/**
 * Incident/Breach Management Types (Datenpannen-Management)
 *
 * TypeScript definitions for DSGVO Art. 33/34 Incident & Data Breach Management
 * 72-Stunden-Meldefrist an die Aufsichtsbehoerde
 */

// =============================================================================
// ENUMS & CONSTANTS
// =============================================================================

export type IncidentSeverity = 'low' | 'medium' | 'high' | 'critical'

export type IncidentStatus =
  | 'detected'                // Erkannt
  | 'assessment'              // Bewertung laeuft
  | 'containment'             // Eindaemmung
  | 'notification_required'   // Meldepflichtig - Meldung steht aus
  | 'notification_sent'       // Gemeldet an Aufsichtsbehoerde
  | 'remediation'             // Behebung laeuft
  | 'closed'                  // Abgeschlossen

export type IncidentCategory =
  | 'data_breach'             // Datenpanne / Datenschutzverletzung
  | 'unauthorized_access'     // Unbefugter Zugriff
  | 'data_loss'               // Datenverlust
  | 'system_compromise'       // Systemkompromittierung
  | 'phishing'                // Phishing-Angriff
  | 'ransomware'              // Ransomware
  | 'insider_threat'          // Insider-Bedrohung
  | 'physical_breach'         // Physischer Sicherheitsvorfall
  | 'other'                   // Sonstiges

// =============================================================================
// SEVERITY METADATA
// =============================================================================

export interface IncidentSeverityInfo {
  label: string
  description: string
  color: string
  bgColor: string
}

export const INCIDENT_SEVERITY_INFO: Record<IncidentSeverity, IncidentSeverityInfo> = {
  low: {
    label: 'Niedrig',
    description: 'Geringes Risiko fuer betroffene Personen, keine Meldepflicht erwartet',
    color: 'text-green-700',
    bgColor: 'bg-green-100'
  },
  medium: {
    label: 'Mittel',
    description: 'Moderates Risiko, Meldepflicht an Aufsichtsbehoerde moeglich',
    color: 'text-yellow-700',
    bgColor: 'bg-yellow-100'
  },
  high: {
    label: 'Hoch',
    description: 'Hohes Risiko, Meldepflicht an Aufsichtsbehoerde wahrscheinlich',
    color: 'text-orange-700',
    bgColor: 'bg-orange-100'
  },
  critical: {
    label: 'Kritisch',
    description: 'Sehr hohes Risiko, Meldepflicht an Aufsichtsbehoerde und Betroffene',
    color: 'text-red-700',
    bgColor: 'bg-red-100'
  }
}

// =============================================================================
// STATUS METADATA
// =============================================================================

export interface IncidentStatusInfo {
  label: string
  description: string
  color: string
  bgColor: string
}

export const INCIDENT_STATUS_INFO: Record<IncidentStatus, IncidentStatusInfo> = {
  detected: {
    label: 'Erkannt',
    description: 'Vorfall wurde erkannt und dokumentiert',
    color: 'text-blue-700',
    bgColor: 'bg-blue-100'
  },
  assessment: {
    label: 'Bewertung',
    description: 'Risikobewertung und Einschaetzung der Meldepflicht',
    color: 'text-yellow-700',
    bgColor: 'bg-yellow-100'
  },
  containment: {
    label: 'Eindaemmung',
    description: 'Sofortmassnahmen zur Eindaemmung werden durchgefuehrt',
    color: 'text-orange-700',
    bgColor: 'bg-orange-100'
  },
  notification_required: {
    label: 'Meldepflichtig',
    description: 'Meldung an Aufsichtsbehoerde erforderlich (Art. 33 DSGVO)',
    color: 'text-red-700',
    bgColor: 'bg-red-100'
  },
  notification_sent: {
    label: 'Gemeldet',
    description: 'Meldung an die Aufsichtsbehoerde wurde eingereicht',
    color: 'text-purple-700',
    bgColor: 'bg-purple-100'
  },
  remediation: {
    label: 'Behebung',
    description: 'Langfristige Behebungs- und Praeventionsmassnahmen',
    color: 'text-indigo-700',
    bgColor: 'bg-indigo-100'
  },
  closed: {
    label: 'Abgeschlossen',
    description: 'Vorfall vollstaendig bearbeitet und dokumentiert',
    color: 'text-green-700',
    bgColor: 'bg-green-100'
  }
}

// =============================================================================
// CATEGORY METADATA
// =============================================================================

export interface IncidentCategoryInfo {
  label: string
  description: string
  icon: string
  color: string
  bgColor: string
}

export const INCIDENT_CATEGORY_INFO: Record<IncidentCategory, IncidentCategoryInfo> = {
  data_breach: {
    label: 'Datenpanne',
    description: 'Allgemeine Datenschutzverletzung mit Offenlegung personenbezogener Daten',
    icon: '\u{1F4C4}',
    color: 'text-red-700',
    bgColor: 'bg-red-100'
  },
  unauthorized_access: {
    label: 'Unbefugter Zugriff',
    description: 'Unberechtigter Zugriff auf Systeme oder Daten',
    icon: '\u{1F6AB}',
    color: 'text-red-700',
    bgColor: 'bg-red-100'
  },
  data_loss: {
    label: 'Datenverlust',
    description: 'Verlust von Daten durch technischen Fehler oder Versehen',
    icon: '\u{1F4BE}',
    color: 'text-orange-700',
    bgColor: 'bg-orange-100'
  },
  system_compromise: {
    label: 'Systemkompromittierung',
    description: 'System wurde durch Angreifer kompromittiert',
    icon: '\u{1F4BB}',
    color: 'text-red-700',
    bgColor: 'bg-red-100'
  },
  phishing: {
    label: 'Phishing-Angriff',
    description: 'Taeuschendes Abfangen von Zugangsdaten oder Daten',
    icon: '\u{1F3A3}',
    color: 'text-orange-700',
    bgColor: 'bg-orange-100'
  },
  ransomware: {
    label: 'Ransomware',
    description: 'Verschluesselung von Daten durch Schadsoftware',
    icon: '\u{1F512}',
    color: 'text-red-700',
    bgColor: 'bg-red-100'
  },
  insider_threat: {
    label: 'Insider-Bedrohung',
    description: 'Vorsaetzlicher oder fahrlaessiger Verstoss durch Mitarbeiter',
    icon: '\u{1F464}',
    color: 'text-purple-700',
    bgColor: 'bg-purple-100'
  },
  physical_breach: {
    label: 'Physischer Sicherheitsvorfall',
    description: 'Einbruch, Diebstahl von Geraeten oder physische Zugriffe',
    icon: '\u{1F3E2}',
    color: 'text-gray-700',
    bgColor: 'bg-gray-100'
  },
  other: {
    label: 'Sonstiges',
    description: 'Sonstiger Datenschutzvorfall',
    icon: '\u{2753}',
    color: 'text-gray-700',
    bgColor: 'bg-gray-100'
  }
}

// =============================================================================
// MAIN INTERFACES
// =============================================================================

export interface RiskAssessment {
  id: string
  assessedBy: string
  assessedAt: string
  likelihoodScore: number       // 1-5 (1 = sehr unwahrscheinlich, 5 = sehr wahrscheinlich)
  impactScore: number           // 1-5 (1 = gering, 5 = katastrophal)
  overallRisk: IncidentSeverity // Berechnetes Gesamtrisiko
  notificationRequired: boolean // Art. 33 Bewertung
  reasoning: string             // Begruendung der Bewertung
}

export interface AuthorityNotification {
  id: string
  authority: string             // z.B. "LfD Niedersachsen"
  deadline72h: string           // 72 Stunden nach Erkennung (Art. 33)
  submittedAt?: string
  status: 'pending' | 'submitted' | 'acknowledged'
  formData: Record<string, unknown>
  pdfUrl?: string
}

export interface DataSubjectNotification {
  id: string
  notificationRequired: boolean // Art. 34 Bewertung
  templateText: string
  sentAt?: string
  recipientCount: number
  method: 'email' | 'letter' | 'portal' | 'public'
}

export interface IncidentMeasure {
  id: string
  incidentId: string
  title: string
  description: string
  type: 'immediate' | 'corrective' | 'preventive'
  status: 'planned' | 'in_progress' | 'completed'
  responsible: string
  dueDate: string
  completedAt?: string
}

export interface TimelineEntry {
  id: string
  incidentId: string
  timestamp: string
  action: string
  description: string
  performedBy: string
}

export interface Incident {
  id: string
  referenceNumber: string       // z.B. "INC-2025-000001"
  title: string
  description: string
  category: IncidentCategory
  severity: IncidentSeverity
  status: IncidentStatus

  // Erkennung
  detectedAt: string
  detectedBy: string

  // Betroffene Systeme & Daten
  affectedSystems: string[]
  affectedDataCategories: string[]
  estimatedAffectedPersons: number

  // Risikobewertung
  riskAssessment: RiskAssessment | null

  // Meldungen
  authorityNotification: AuthorityNotification | null
  dataSubjectNotification: DataSubjectNotification | null

  // Massnahmen & Verlauf
  measures: IncidentMeasure[]
  timeline: TimelineEntry[]

  // Zuweisung
  assignedTo?: string

  // Abschluss
  closedAt?: string
  lessonsLearned?: string
}

// =============================================================================
// STATISTICS
// =============================================================================

export interface IncidentStatistics {
  totalIncidents: number
  openIncidents: number
  notificationsPending: number
  averageResponseTimeHours: number
  bySeverity: Record<IncidentSeverity, number>
  byCategory: Record<IncidentCategory, number>
  byStatus: Record<IncidentStatus, number>
}

// =============================================================================
// API TYPES
// =============================================================================

export interface IncidentFilters {
  status?: IncidentStatus | IncidentStatus[]
  severity?: IncidentSeverity | IncidentSeverity[]
  category?: IncidentCategory | IncidentCategory[]
  assignedTo?: string
  overdue?: boolean
  search?: string
  dateFrom?: string
  dateTo?: string
}

export interface IncidentListResponse {
  incidents: Incident[]
  total: number
  page: number
  pageSize: number
}

export interface IncidentCreateRequest {
  title: string
  description: string
  category: IncidentCategory
  severity: IncidentSeverity
  detectedAt: string
  detectedBy: string
  affectedSystems: string[]
  affectedDataCategories: string[]
  estimatedAffectedPersons: number
  assignedTo?: string
}

export interface IncidentUpdateRequest {
  title?: string
  description?: string
  category?: IncidentCategory
  severity?: IncidentSeverity
  status?: IncidentStatus
  affectedSystems?: string[]
  affectedDataCategories?: string[]
  estimatedAffectedPersons?: number
  assignedTo?: string
}

export interface RiskAssessmentRequest {
  likelihoodScore: number       // 1-5
  impactScore: number           // 1-5
  reasoning: string
}

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

/**
 * Berechnet die verbleibenden Stunden bis zur 72h-Meldefrist (Art. 33 DSGVO)
 */
export function getHoursUntil72hDeadline(detectedAt: string): number {
  const detected = new Date(detectedAt)
  const deadline = new Date(detected.getTime() + 72 * 60 * 60 * 1000)
  const now = new Date()
  const diff = deadline.getTime() - now.getTime()
  return Math.round(diff / (1000 * 60 * 60) * 10) / 10
}

/**
 * Prueft ob die 72-Stunden-Meldefrist abgelaufen ist
 */
export function is72hDeadlineExpired(detectedAt: string): boolean {
  const detected = new Date(detectedAt)
  const deadline = new Date(detected.getTime() + 72 * 60 * 60 * 1000)
  return new Date() > deadline
}

/**
 * Berechnet die Risikostufe basierend auf Eintrittswahrscheinlichkeit und Auswirkung
 * Risiko-Matrix:
 *   likelihood x impact >= 20  -> critical
 *   likelihood x impact >= 12  -> high
 *   likelihood x impact >= 6   -> medium
 *   sonst                      -> low
 */
export function calculateRiskLevel(likelihood: number, impact: number): IncidentSeverity {
  const riskScore = likelihood * impact
  if (riskScore >= 20) return 'critical'
  if (riskScore >= 12) return 'high'
  if (riskScore >= 6) return 'medium'
  return 'low'
}

/**
 * Prueft ob eine Meldung an die Aufsichtsbehoerde erforderlich ist
 * Bei hohem oder kritischem Risiko ist eine Meldung gemaess Art. 33 DSGVO erforderlich
 */
export function isNotificationRequired(riskAssessment: RiskAssessment): boolean {
  return riskAssessment.overallRisk === 'high' || riskAssessment.overallRisk === 'critical'
}

/**
 * Generiert eine Referenznummer fuer einen Vorfall
 */
export function generateIncidentReferenceNumber(year: number, sequence: number): string {
  return `INC-${year}-${String(sequence).padStart(6, '0')}`
}

/**
 * Gibt die 72h-Deadline als Date zurueck
 */
export function get72hDeadline(detectedAt: string): Date {
  const detected = new Date(detectedAt)
  return new Date(detected.getTime() + 72 * 60 * 60 * 1000)
}

/**
 * Gibt die Severity-Info zurueck
 */
export function getSeverityInfo(severity: IncidentSeverity): IncidentSeverityInfo {
  return INCIDENT_SEVERITY_INFO[severity]
}

/**
 * Gibt die Status-Info zurueck
 */
export function getStatusInfo(status: IncidentStatus): IncidentStatusInfo {
  return INCIDENT_STATUS_INFO[status]
}

/**
 * Gibt die Kategorie-Info zurueck
 */
export function getCategoryInfo(category: IncidentCategory): IncidentCategoryInfo {
  return INCIDENT_CATEGORY_INFO[category]
}
