export type Tab = 'config' | 'incidents' | 'templates' | 'exercises'

export type IncidentStatus = 'detected' | 'classified' | 'assessed' | 'reported' | 'not_reportable' | 'closed'
export type IncidentSeverity = 'low' | 'medium' | 'high' | 'critical'

export interface NotfallplanConfig {
  meldewege: MeldeStep[]
  zustaendigkeiten: Zustaendigkeit[]
  aufsichtsbehoerde: {
    name: string
    state: string
    email: string
    phone: string
    url: string
  }
  eskalationsstufen: Eskalationsstufe[]
  sofortmassnahmen: string[]
}

export interface MeldeStep {
  id: string
  order: number
  role: string
  name: string
  action: string
  maxHours: number
}

export interface Zustaendigkeit {
  id: string
  role: string
  name: string
  email: string
  phone: string
}

export interface Eskalationsstufe {
  id: string
  level: number
  label: string
  triggerCondition: string
  actions: string[]
}

export interface Incident {
  id: string
  title: string
  description: string
  detectedAt: string
  detectedBy: string
  status: IncidentStatus
  severity: IncidentSeverity
  affectedDataCategories: string[]
  estimatedAffectedPersons: number
  measures: string[]
  art34Required: boolean
  art34Justification: string
  reportedToAuthorityAt?: string
  notifiedAffectedAt?: string
  closedAt?: string
  closedBy?: string
  lessonsLearned?: string
}

export interface MeldeTemplate {
  id: string
  type: 'art33' | 'art34'
  title: string
  content: string
}

export interface Exercise {
  id: string
  title: string
  type: 'tabletop' | 'simulation' | 'full_drill'
  scenario: string
  scheduledDate: string
  completedDate?: string
  participants: string[]
  lessonsLearned: string
  nextExerciseDate?: string
}

export interface ApiContact {
  id: string
  name: string
  role: string | null
  email: string | null
  phone: string | null
  is_primary: boolean
  available_24h: boolean
  created_at: string | null
}

export interface ApiScenario {
  id: string
  title: string
  category: string | null
  severity: string
  description: string | null
  is_active: boolean
  created_at: string | null
}

export interface ApiExercise {
  id: string
  title: string
  exercise_type: string
  exercise_date: string | null
  outcome: string | null
  notes: string | null
  created_at: string | null
}

export const INCIDENT_STATUS_LABELS: Record<IncidentStatus, string> = {
  detected: 'Erkannt',
  classified: 'Klassifiziert',
  assessed: 'Bewertet',
  reported: 'Gemeldet',
  not_reportable: 'Nicht meldepflichtig',
  closed: 'Abgeschlossen',
}

export const INCIDENT_STATUS_COLORS: Record<IncidentStatus, string> = {
  detected: 'bg-red-100 text-red-800',
  classified: 'bg-yellow-100 text-yellow-800',
  assessed: 'bg-blue-100 text-blue-800',
  reported: 'bg-green-100 text-green-800',
  not_reportable: 'bg-gray-100 text-gray-800',
  closed: 'bg-gray-100 text-gray-600',
}

export const SEVERITY_LABELS: Record<IncidentSeverity, string> = {
  low: 'Niedrig',
  medium: 'Mittel',
  high: 'Hoch',
  critical: 'Kritisch',
}

export const SEVERITY_COLORS: Record<IncidentSeverity, string> = {
  low: 'bg-green-100 text-green-800',
  medium: 'bg-yellow-100 text-yellow-800',
  high: 'bg-orange-100 text-orange-800',
  critical: 'bg-red-100 text-red-800',
}

export const NOTFALLPLAN_API = '/api/sdk/v1/notfallplan'

export const DEFAULT_CONFIG: NotfallplanConfig = {
  meldewege: [
    { id: '1', order: 1, role: 'Entdecker', name: '', action: 'Incident melden an IT-Sicherheit', maxHours: 0 },
    { id: '2', order: 2, role: 'IT-Sicherheit', name: '', action: 'Erstbewertung und Klassifizierung', maxHours: 4 },
    { id: '3', order: 3, role: 'Datenschutzbeauftragter', name: '', action: 'Meldepflicht pruefen (Art. 33)', maxHours: 12 },
    { id: '4', order: 4, role: 'Geschaeftsfuehrung', name: '', action: 'Freigabe der Meldung', maxHours: 24 },
    { id: '5', order: 5, role: 'DSB', name: '', action: 'Meldung an Aufsichtsbehoerde', maxHours: 72 },
  ],
  zustaendigkeiten: [
    { id: '1', role: 'Incident Owner', name: '', email: '', phone: '' },
    { id: '2', role: 'Datenschutzbeauftragter', name: '', email: '', phone: '' },
    { id: '3', role: 'IT-Sicherheit', name: '', email: '', phone: '' },
    { id: '4', role: 'Recht / Legal', name: '', email: '', phone: '' },
    { id: '5', role: 'Kommunikation / PR', name: '', email: '', phone: '' },
  ],
  aufsichtsbehoerde: {
    name: '',
    state: '',
    email: '',
    phone: '',
    url: '',
  },
  eskalationsstufen: [
    { id: '1', level: 1, label: 'Standard', triggerCondition: 'Einzelfall, keine sensiblen Daten', actions: ['IT-Sicherheit informieren', 'DSB benachrichtigen'] },
    { id: '2', level: 2, label: 'Erhoehte Prioritaet', triggerCondition: 'Sensible Daten oder > 100 Betroffene', actions: ['Geschaeftsfuehrung informieren', 'Notfallteam einberufen'] },
    { id: '3', level: 3, label: 'Kritisch', triggerCondition: 'Besondere Kategorien Art. 9 oder > 1000 Betroffene', actions: ['Sofortige Krisensitzung', 'Art. 34 Benachrichtigung vorbereiten', 'PR/Kommunikation einbinden'] },
  ],
  sofortmassnahmen: [
    'Betroffene Systeme isolieren / vom Netz nehmen',
    'Zugriffsrechte pruefen und ggf. sperren',
    'Beweise sichern (Logs, Screenshots)',
    'Zeitleiste der Ereignisse dokumentieren',
    'Erstbewertung: Art der Daten, Anzahl Betroffene, Schaden',
    'DSB unverzueglich informieren',
  ],
}

export const DEFAULT_TEMPLATES: MeldeTemplate[] = [
  {
    id: 'tpl-art33',
    type: 'art33',
    title: 'Meldung an Aufsichtsbehoerde (Art. 33 DSGVO)',
    content: `Meldung einer Verletzung des Schutzes personenbezogener Daten
gemaess Art. 33 DSGVO

1. Beschreibung der Verletzung:
[Art der Verletzung, betroffene Kategorien personenbezogener Daten]

2. Kategorien und ungefaehre Zahl der betroffenen Personen:
[Anzahl und Kategorien der Betroffenen]

3. Kategorien und ungefaehre Zahl der betroffenen Datensaetze:
[Datensatz-Kategorien und Anzahl]

4. Name und Kontaktdaten des Datenschutzbeauftragten:
[Name, E-Mail, Telefon]

5. Beschreibung der wahrscheinlichen Folgen:
[Moegliche Auswirkungen auf die Betroffenen]

6. Beschreibung der ergriffenen/vorgeschlagenen Massnahmen:
[Sofortmassnahmen und geplante Abhilfemassnahmen]

7. Zeitpunkt der Feststellung:
[Datum, Uhrzeit]

8. Begruendung bei verspaeteter Meldung (falls > 72h):
[Begruendung]`,
  },
  {
    id: 'tpl-art34',
    type: 'art34',
    title: 'Benachrichtigung Betroffene (Art. 34 DSGVO)',
    content: `Benachrichtigung ueber eine Verletzung des Schutzes
Ihrer personenbezogenen Daten

Sehr geehrte/r [Name/Betroffene],

wir informieren Sie gemaess Art. 34 DSGVO ueber eine Verletzung
des Schutzes personenbezogener Daten, die Ihre Daten betrifft.

Was ist passiert?
[Beschreibung in klarer, einfacher Sprache]

Welche Daten sind betroffen?
[Betroffene Datenkategorien]

Welche Folgen sind moeglich?
[Moegliche Auswirkungen]

Was haben wir unternommen?
[Ergriffene Massnahmen]

Was koennen Sie tun?
[Empfehlungen fuer Betroffene, z.B. Passwort aendern]

Kontakt:
Unser Datenschutzbeauftragter steht Ihnen fuer Rueckfragen
zur Verfuegung:
[Name, E-Mail, Telefon]

Mit freundlichen Gruessen
[Verantwortlicher]`,
  },
]

const STORAGE_KEY = 'bp_notfallplan'

export function loadFromStorage(): {
  config: NotfallplanConfig
  incidents: Incident[]
  templates: MeldeTemplate[]
  exercises: Exercise[]
} {
  if (typeof window === 'undefined') {
    return { config: DEFAULT_CONFIG, incidents: [], templates: DEFAULT_TEMPLATES, exercises: [] }
  }
  try {
    const stored = localStorage.getItem(STORAGE_KEY)
    if (stored) {
      return JSON.parse(stored)
    }
  } catch {
    // ignore
  }
  return { config: DEFAULT_CONFIG, incidents: [], templates: DEFAULT_TEMPLATES, exercises: [] }
}

export function saveToStorage(data: {
  config: NotfallplanConfig
  incidents: Incident[]
  templates: MeldeTemplate[]
  exercises: Exercise[]
}) {
  if (typeof window === 'undefined') return
  localStorage.setItem(STORAGE_KEY, JSON.stringify(data))
}

export function apiToIncident(raw: any): Incident {
  return {
    id: raw.id,
    title: raw.title,
    description: raw.description || '',
    detectedAt: raw.detected_at,
    detectedBy: raw.detected_by || 'Admin',
    status: raw.status,
    severity: raw.severity,
    affectedDataCategories: raw.affected_data_categories || [],
    estimatedAffectedPersons: raw.estimated_affected_persons || 0,
    measures: raw.measures || [],
    art34Required: raw.art34_required || false,
    art34Justification: raw.art34_justification || '',
    reportedToAuthorityAt: raw.reported_to_authority_at,
    notifiedAffectedAt: raw.notified_affected_at,
    closedAt: raw.closed_at,
    closedBy: raw.closed_by,
    lessonsLearned: raw.lessons_learned,
  }
}
