/**
 * DSGVO-Bussgeldentscheidungen und Durchsetzungsfaelle
 *
 * Strukturierter Katalog relevanter Bussgelder und Gerichtsentscheidungen
 * als Referenz fuer DSFA-Risikobewertung und Compliance-Beratung.
 *
 * Quellen: Amtliche Entscheidungen/Bescheide (§5 UrhG), EDPB-Mitteilungen (CC-BY-4.0)
 */

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

export type GDPRViolationType =
  | 'data_minimization'      // Art. 5 — Datenminimierung/Zweckbindung
  | 'security'               // Art. 32 — Technische/Org. Massnahmen
  | 'special_categories'     // Art. 9 — Besondere Kategorien
  | 'transparency'           // Art. 12-14 — Informationspflichten
  | 'lawfulness'             // Art. 6 — Rechtsmaessigkeit
  | 'data_subject_rights'    // Art. 15-22 — Betroffenenrechte
  | 'dpo_conflict'           // Art. 38 — DSB-Interessenkonflikt
  | 'accountability'         // Art. 5 Abs. 2 — Rechenschaftspflicht
  | 'international_transfer' // Art. 44-49 — Drittlandtransfer

export type EnforcementOutcome = 'final' | 'reduced_on_appeal' | 'pending' | 'overturned'

export interface GDPREnforcementCase {
  id: string
  company: string
  country: string
  authority: string
  year: number
  fineOriginal: number         // Urspruengliches Bussgeld in Euro
  fineAfterAppeal?: number     // Nach Berufung (falls reduziert)
  outcome: EnforcementOutcome
  violationTypes: GDPRViolationType[]
  gdprArticles: string[]       // Verletzte Artikel
  description: string
  keyFacts: string[]           // Wesentliche Tatbestandsmerkmale
  lessons: string[]            // Lehren fuer Unternehmen
  /** Nur amtliche Quellen (Bescheide, Urteile, EDPB) */
  officialSources: OfficialSource[]
}

export interface OfficialSource {
  type: 'court_decision' | 'dsb_decision' | 'edpb_news' | 'bfdi_press'
  title: string
  reference?: string           // Aktenzeichen
  date?: string
  url?: string
  licenseNote: string          // Lizenzhinweis
}

export interface GDPRLesson {
  id: string
  gdprArticles: string[]
  title: string
  description: string
  relatedCaseIds: string[]
  severity: 'critical' | 'high' | 'medium'
}

// =============================================================================
// Enforcement Cases
// =============================================================================

export const GDPR_ENFORCEMENT_CASES: GDPREnforcementCase[] = [
  {
    id: 'CASE-HM-2020',
    company: 'H&M (Nuernberg)',
    country: 'DE',
    authority: 'Hamburger Datenschutzbehoerde (HmbBfDI)',
    year: 2020,
    fineOriginal: 35_300_000,
    outcome: 'final',
    violationTypes: ['special_categories', 'lawfulness'],
    gdprArticles: ['Art. 6 DSGVO', 'Art. 9 DSGVO'],
    description:
      'Systematische Ausspaeung von Beschaeftigtendaten. In sog. "Welcome-Back-Talks" nach ' +
      'Krankheit wurden private Informationen zu Gesundheit, Familie und Religion erfasst und ' +
      'in einer Datenbank gespeichert. Die Daten waren fuer Fuehrungskraefte zugaenglich.',
    keyFacts: [
      'Erfassung und Auswertung privater Gesundheitsinformationen',
      'Systematische Dokumentation in Datenbank',
      'Zugang fuer breiten Kreis von Fuehrungskraeften',
      'Verarbeitung besonderer Kategorien (Art. 9) ohne Rechtsgrundlage',
    ],
    lessons: [
      'Gesundheitsdaten duerfen nur mit strenger Rechtsgrundlage verarbeitet werden',
      'Mitarbeiter-Gespraeche duerfen nicht zur verdeckten Datenerhebung missbraucht werden',
      'Besondere Kategorien (Art. 9) erfordern besondere Schutzmassnahmen',
    ],
    officialSources: [
      {
        type: 'dsb_decision',
        title: 'HmbBfDI Bussgeld gegen H&M Servicecenter',
        date: '2020-10-01',
        licenseNote: 'Amtlicher Bescheid gem. §5 UrhG',
      },
    ],
  },
  {
    id: 'CASE-DW-2019',
    company: 'Deutsche Wohnen SE (Berlin)',
    country: 'DE',
    authority: 'Berliner Beauftragte fuer Datenschutz (BlnBDI)',
    year: 2019,
    fineOriginal: 14_500_000,
    outcome: 'final',
    violationTypes: ['data_minimization', 'accountability'],
    gdprArticles: ['Art. 5 DSGVO', 'Art. 25 DSGVO'],
    description:
      'Langjaehrige Speicherung von Mieterdaten ohne Rechtsgrundlage. Das Archivsystem erlaubte ' +
      'keine Loeschung veralteter Daten (Gehaltsabrechnungen, Kontodaten, Mietvertraege). ' +
      'Trotz vorheriger Beanstandung keine technischen Massnahmen zur Loeschung umgesetzt.',
    keyFacts: [
      'Archivsystem ohne Loeschmoeglichkeit fuer veraltete Daten',
      'Vorherige Beanstandung durch Aufsichtsbehoerde ohne Abhilfe',
      'Verstoss gegen Datenminimierung und Speicherbegrenzung',
      'Keine Privacy-by-Design-Massnahmen (Art. 25)',
    ],
    lessons: [
      'Loeschkonzepte muessen technisch umsetzbar sein',
      'Vorherige Beanstandungen erhoehen das Bussgeld erheblich',
      'Art. 25 (Privacy by Design) betrifft auch bestehende Systeme',
    ],
    officialSources: [
      {
        type: 'edpb_news',
        title: 'Berlin Commissioner for Data Protection Imposes Fine on Real Estate Company',
        url: 'https://www.edpb.europa.eu/news/national-news/2019/berlin-commissioner-data-protection-imposes-fine-real-estate-company_en',
        licenseNote: 'EDPB Nachricht, CC-BY-4.0',
      },
    ],
  },
  {
    id: 'CASE-1U1-2019',
    company: '1&1 Telecom GmbH',
    country: 'DE',
    authority: 'BfDI (Bundesbeauftragter)',
    year: 2019,
    fineOriginal: 9_550_000,
    fineAfterAppeal: 900_000,
    outcome: 'reduced_on_appeal',
    violationTypes: ['security'],
    gdprArticles: ['Art. 32 DSGVO'],
    description:
      'Unzureichende Kunden-Authentifizierung: Allein Name und Geburtsdatum genuegten fuer ' +
      'telefonische Auskuenfte. Das LG Bonn bestaetigte den Verstoss, reduzierte das Bussgeld ' +
      'jedoch auf 900.000 Euro, da kein massiver Datenskandal vorlag und das Unternehmen kooperativ war.',
    keyFacts: [
      'Nur Name und Geburtsdatum als Authentifizierung',
      'Verstoesse gegen Art. 32 (technisch-organisatorische Massnahmen)',
      'LG Bonn reduzierte Bussgeld von 9,55 Mio. auf 0,9 Mio. Euro',
      'Kooperatives Verhalten als mildernder Umstand',
    ],
    lessons: [
      'Starke Authentifizierung ist Pflicht bei Kundenkontakt',
      'Art. 32 verlangt dem Risiko angemessene Sicherheit',
      'Kooperation mit der Aufsichtsbehoerde kann Bussgelder deutlich reduzieren',
    ],
    officialSources: [
      {
        type: 'bfdi_press',
        title: 'BfDI verhaengt Geldbusse gegen Telekommunikationsdienstleister',
        date: '2019-12-09',
        url: 'https://www.bfdi.bund.de/SharedDocs/Pressemitteilungen/DE/2019/30_BfDIverh%C3%A4ngtGeldbu%C3%9Fe1u1.html',
        licenseNote: 'Amtliche Pressemitteilung gem. §5 UrhG',
      },
      {
        type: 'court_decision',
        title: 'LG Bonn, Urteil v. 11.11.2020 — Reduzierung auf 900.000 Euro',
        reference: 'LG Bonn, 2020',
        date: '2020-11-11',
        licenseNote: 'Amtliches Werk gem. §5 UrhG',
      },
    ],
  },
  {
    id: 'CASE-WA-2021',
    company: 'WhatsApp Ireland Ltd.',
    country: 'IE',
    authority: 'Irish Data Protection Commission (DPC)',
    year: 2021,
    fineOriginal: 225_000_000,
    outcome: 'final',
    violationTypes: ['transparency'],
    gdprArticles: ['Art. 5 DSGVO', 'Art. 12 DSGVO', 'Art. 13 DSGVO', 'Art. 14 DSGVO'],
    description:
      'Verletzung der Transparenzpflichten: Unvollstaendige Information ueber Datenweitergabe ' +
      'innerhalb der Meta/Facebook-Unternehmensgruppe. Betroffene wurden nicht ausreichend darueber ' +
      'informiert, welche Daten zu welchen Zwecken mit welchen Empfaengern geteilt wurden.',
    keyFacts: [
      'Mangelnde Transparenz bei konzerninterner Datenweitergabe',
      'Unzureichende Datenschutzhinweise (Art. 12-14)',
      'EDPB-Streitbeilegung erhoehte das Bussgeld erheblich',
      'Hoechstes Bussgeld gegen ein Unternehmen in der EU zum damaligen Zeitpunkt',
    ],
    lessons: [
      'Datenschutzhinweise muessen vollstaendig und verstaendlich sein',
      'Konzerninterne Datenweitergabe muss transparent dokumentiert werden',
      'Art. 12 verlangt klare, einfache Sprache',
    ],
    officialSources: [
      {
        type: 'dsb_decision',
        title: 'DPC Decision re WhatsApp Ireland Limited',
        date: '2021-09-02',
        licenseNote: 'Amtliche Entscheidung der irischen Aufsichtsbehoerde',
      },
    ],
  },
  {
    id: 'CASE-GOOGLE-2019',
    company: 'Google LLC',
    country: 'FR',
    authority: 'CNIL (Franzoesische Datenschutzbehoerde)',
    year: 2019,
    fineOriginal: 50_000_000,
    outcome: 'final',
    violationTypes: ['transparency', 'lawfulness'],
    gdprArticles: ['Art. 6 DSGVO', 'Art. 12 DSGVO', 'Art. 13 DSGVO'],
    description:
      'Maengel bei Einwilligung und Transparenz: Informationen zur Datenverarbeitung waren ueber ' +
      'mehrere Seiten verstreut und schwer verstaendlich. Einwilligung fuer personalisierte Werbung ' +
      'war vorausgewaehlt und nicht hinreichend spezifisch.',
    keyFacts: [
      'Informationen ueber 5-6 Klicks verstreut',
      'Vorausgewaehlte Einwilligung (kein aktives Opt-in)',
      'Einwilligung nicht granular genug',
      'Erstes grosses DSGVO-Bussgeld gegen US-Tech-Konzern',
    ],
    lessons: [
      'Einwilligung muss aktiv, informiert und spezifisch sein',
      'Datenschutzinformationen muessen leicht zugaenglich sein',
      'Vorausgewaehlte Checkboxen sind keine gueltige Einwilligung',
    ],
    officialSources: [
      {
        type: 'dsb_decision',
        title: 'CNIL Deliberation No. SAN-2019-001 v. 21.01.2019',
        date: '2019-01-21',
        licenseNote: 'Amtliche Entscheidung der CNIL',
      },
    ],
  },
  {
    id: 'CASE-OLG-DD-2021',
    company: 'GmbH-Geschaeftsfuehrer (Detektiveinsatz)',
    country: 'DE',
    authority: 'OLG Dresden',
    year: 2021,
    fineOriginal: 5_000, // Schadensersatz, kein Bussgeld
    outcome: 'final',
    violationTypes: ['lawfulness'],
    gdprArticles: ['Art. 6 DSGVO', 'Art. 10 DSGVO', 'Art. 82 DSGVO'],
    description:
      'Persoenliche Haftung des Geschaeftsfuehrers: Ein GmbH-GF liess eine Privatperson durch ' +
      'einen Detektiv ausspionieren. Das OLG Dresden sprach dem Betroffenen 5.000 Euro Schadensersatz ' +
      'zu — gegen GmbH und Geschaeftsfuehrer als Gesamtschuldner. Begruendung: Der GF entscheide ' +
      'selbst ueber die Datenverarbeitung und sei daher Verantwortlicher i.S.d. Art. 4 Nr. 7 DSGVO.',
    keyFacts: [
      'Geschaeftsfuehrer als Verantwortlicher (Art. 4 Nr. 7)',
      'Persoenliche Haftung neben der GmbH (Gesamtschuldner)',
      'Schadensersatz nach Art. 82 DSGVO',
      'Ausspionierung durch Detektiv = Verstoss gegen Art. 6, 10',
    ],
    lessons: [
      'Geschaeftsfuehrer koennen persoenlich fuer DSGVO-Verstoesse haften',
      'Art. 82 DSGVO ermoeglicht Schadensersatz gegen natuerliche Personen',
      'Verantwortlichkeit i.S.d. Art. 4 Nr. 7 kann auch den GF persoenlich treffen',
    ],
    officialSources: [
      {
        type: 'court_decision',
        title: 'OLG Dresden, Urteil 2021 — Persoenliche GF-Haftung bei DSGVO-Verstoss',
        reference: 'OLG Dresden, 2021',
        date: '2021',
        licenseNote: 'Amtliches Werk gem. §5 UrhG',
      },
    ],
  },
]

// =============================================================================
// Lessons Learned (aggregiert)
// =============================================================================

export const GDPR_LESSONS: GDPRLesson[] = [
  {
    id: 'LESSON-01',
    gdprArticles: ['Art. 5 DSGVO', 'Art. 25 DSGVO'],
    title: 'Datenminimierung und Loeschkonzepte sind Pflicht',
    description:
      'Personenbezogene Daten duerfen nur so lange gespeichert werden, wie es fuer den Zweck ' +
      'notwendig ist. Technische Loeschmechanismen muessen implementiert sein. Archivsysteme ' +
      'ohne Loeschfunktion verstoessen gegen Art. 5 und Art. 25 DSGVO.',
    relatedCaseIds: ['CASE-DW-2019'],
    severity: 'critical',
  },
  {
    id: 'LESSON-02',
    gdprArticles: ['Art. 32 DSGVO'],
    title: 'Angemessene IT-Sicherheit (Art. 32) ist unverzichtbar',
    description:
      'Technisch-organisatorische Massnahmen muessen dem Risiko angemessen sein. ' +
      'Schwache Authentifizierung (z.B. nur Name/Geburtsdatum) reicht nicht aus. ' +
      'Verschluesselung, Zugriffskontrollen und starke Authentifizierung sind Pflicht.',
    relatedCaseIds: ['CASE-1U1-2019'],
    severity: 'critical',
  },
  {
    id: 'LESSON-03',
    gdprArticles: ['Art. 9 DSGVO'],
    title: 'Besondere Kategorien erfordern besondere Vorsicht',
    description:
      'Gesundheitsdaten, religioese Ueberzeugungen und andere besondere Kategorien (Art. 9) ' +
      'duerfen nur mit expliziter Rechtsgrundlage verarbeitet werden. Informelle Gespraeche ' +
      'duerfen nicht zur verdeckten Erhebung solcher Daten missbraucht werden.',
    relatedCaseIds: ['CASE-HM-2020'],
    severity: 'critical',
  },
  {
    id: 'LESSON-04',
    gdprArticles: ['Art. 12 DSGVO', 'Art. 13 DSGVO', 'Art. 14 DSGVO'],
    title: 'Transparenz und vollstaendige Datenschutzhinweise',
    description:
      'Betroffene muessen klar, verstaendlich und vollstaendig informiert werden. ' +
      'Konzerninterne Datenweitergabe muss dokumentiert sein. Informationen duerfen ' +
      'nicht ueber zahlreiche Unterseiten verstreut werden.',
    relatedCaseIds: ['CASE-WA-2021', 'CASE-GOOGLE-2019'],
    severity: 'high',
  },
  {
    id: 'LESSON-05',
    gdprArticles: ['Art. 82 DSGVO', 'Art. 4 Nr. 7 DSGVO'],
    title: 'Persoenliche Haftung von Geschaeftsfuehrern moeglich',
    description:
      'Geschaeftsfuehrer koennen neben dem Unternehmen persoenlich fuer DSGVO-Verstoesse ' +
      'haften, wenn sie die Datenverarbeitung selbst veranlassen. Dies gilt insbesondere ' +
      'bei vorsaetzlichen Verstoessen.',
    relatedCaseIds: ['CASE-OLG-DD-2021'],
    severity: 'high',
  },
  {
    id: 'LESSON-06',
    gdprArticles: ['Art. 83 DSGVO'],
    title: 'Kooperation kann Bussgelder deutlich reduzieren',
    description:
      'Kooperatives Verhalten und zeitnahe Massnahmen zur Abhilfe werden von Aufsichtsbehoerden ' +
      'und Gerichten als mildernde Umstaende anerkannt. Im 1&1-Fall wurde das Bussgeld um ueber ' +
      '90% reduziert.',
    relatedCaseIds: ['CASE-1U1-2019'],
    severity: 'medium',
  },
]

// =============================================================================
// Violation Type Labels
// =============================================================================

export const VIOLATION_TYPE_LABELS: Record<GDPRViolationType, string> = {
  data_minimization: 'Datenminimierung / Speicherbegrenzung',
  security: 'IT-Sicherheit (Art. 32)',
  special_categories: 'Besondere Kategorien (Art. 9)',
  transparency: 'Transparenz / Informationspflichten',
  lawfulness: 'Rechtsmaessigkeit (Art. 6)',
  data_subject_rights: 'Betroffenenrechte',
  dpo_conflict: 'DSB-Interessenkonflikt',
  accountability: 'Rechenschaftspflicht',
  international_transfer: 'Drittlandtransfer',
}

// =============================================================================
// Helper Functions
// =============================================================================

/**
 * Gibt Enforcement Cases zurueck, die fuer bestimmte DSGVO-Artikel relevant sind.
 */
export function getEnforcementCasesForArticle(article: string): GDPREnforcementCase[] {
  return GDPR_ENFORCEMENT_CASES.filter(c =>
    c.gdprArticles.some(a => a.toLowerCase().includes(article.toLowerCase()))
  )
}

/**
 * Gibt Enforcement Cases zurueck, die fuer einen bestimmten Verstosstyp relevant sind.
 */
export function getEnforcementCasesForViolationType(type: GDPRViolationType): GDPREnforcementCase[] {
  return GDPR_ENFORCEMENT_CASES.filter(c => c.violationTypes.includes(type))
}

/**
 * Gibt Lessons zurueck, die fuer bestimmte DSGVO-Artikel relevant sind.
 */
export function getLessonsForArticle(article: string): GDPRLesson[] {
  return GDPR_LESSONS.filter(l =>
    l.gdprArticles.some(a => a.toLowerCase().includes(article.toLowerCase()))
  )
}

/**
 * Gibt das hoechste bekannte Bussgeld fuer einen Verstosstyp zurueck.
 */
export function getMaxFineForViolationType(type: GDPRViolationType): {
  amount: number
  company: string
  year: number
} | null {
  const cases = getEnforcementCasesForViolationType(type)
  if (cases.length === 0) return null

  const sorted = [...cases].sort((a, b) => b.fineOriginal - a.fineOriginal)
  return {
    amount: sorted[0].fineOriginal,
    company: sorted[0].company,
    year: sorted[0].year,
  }
}

/**
 * Formatiert einen Euro-Betrag fuer die Anzeige.
 */
export function formatFineAmount(amount: number): string {
  if (amount >= 1_000_000) {
    return `${(amount / 1_000_000).toFixed(1)} Mio. Euro`
  }
  if (amount >= 1_000) {
    return `${(amount / 1_000).toFixed(0)}.000 Euro`
  }
  return `${amount.toLocaleString('de-DE')} Euro`
}
