package ucca

import (
	"fmt"
	"os"
	"path/filepath"
	"time"

	"gopkg.in/yaml.v3"
)

// ============================================================================
// DSGVO Module
// ============================================================================
//
// This module implements the GDPR (DSGVO - Datenschutz-Grundverordnung) obligations.
//
// DSGVO applies to:
// - All organizations processing personal data of EU residents
// - Both controllers and processors
//
// Key obligations covered:
// - Processing records (Art. 30)
// - Technical and organizational measures (Art. 32)
// - Data Protection Impact Assessment (Art. 35)
// - Data subject rights (Art. 15-21)
// - Breach notification (Art. 33/34)
// - DPO appointment (Art. 37)
// - Data Processing Agreements (Art. 28)
//
// ============================================================================

// DSGVOModule implements the RegulationModule interface for DSGVO
type DSGVOModule struct {
	obligations       []Obligation
	controls          []ObligationControl
	incidentDeadlines []IncidentDeadline
	decisionTree      *DecisionTree
	loaded            bool
}

// DSGVO special categories that require additional measures
var (
	// Article 9 - Special categories of personal data
	DSGVOSpecialCategories = map[string]bool{
		"racial_ethnic_origin":    true,
		"political_opinions":      true,
		"religious_beliefs":       true,
		"trade_union_membership":  true,
		"genetic_data":            true,
		"biometric_data":          true,
		"health_data":             true,
		"sexual_orientation":      true,
	}

	// High risk processing activities (Art. 35)
	DSGVOHighRiskProcessing = map[string]bool{
		"systematic_monitoring":   true, // Large-scale systematic monitoring
		"automated_decisions":     true, // Automated decision-making with legal effects
		"large_scale_special":     true, // Large-scale processing of special categories
		"public_area_monitoring":  true, // Systematic monitoring of public areas
		"profiling":               true, // Evaluation/scoring of individuals
		"vulnerable_persons":      true, // Processing data of vulnerable persons
	}
)

// NewDSGVOModule creates a new DSGVO module, loading obligations from YAML
func NewDSGVOModule() (*DSGVOModule, error) {
	m := &DSGVOModule{
		obligations:       []Obligation{},
		controls:          []ObligationControl{},
		incidentDeadlines: []IncidentDeadline{},
	}

	// Try to load from YAML, fall back to hardcoded if not found
	if err := m.loadFromYAML(); err != nil {
		// Use hardcoded defaults
		m.loadHardcodedObligations()
	}

	m.buildDecisionTree()
	m.loaded = true

	return m, nil
}

// ID returns the module identifier
func (m *DSGVOModule) ID() string {
	return "dsgvo"
}

// Name returns the human-readable name
func (m *DSGVOModule) Name() string {
	return "DSGVO (Datenschutz-Grundverordnung)"
}

// Description returns a brief description
func (m *DSGVOModule) Description() string {
	return "EU-Datenschutz-Grundverordnung (Verordnung (EU) 2016/679) - Schutz personenbezogener Daten"
}

// IsApplicable checks if DSGVO applies to the organization
func (m *DSGVOModule) IsApplicable(facts *UnifiedFacts) bool {
	// DSGVO applies if:
	// 1. Organization processes personal data
	// 2. Organization is in EU, or
	// 3. Organization offers goods/services to EU, or
	// 4. Organization monitors behavior of EU individuals

	if !facts.DataProtection.ProcessesPersonalData {
		return false
	}

	// Check if organization is in EU
	if facts.Organization.EUMember {
		return true
	}

	// Check if offering to EU
	if facts.DataProtection.OffersToEU {
		return true
	}

	// Check if monitoring EU individuals
	if facts.DataProtection.MonitorsEUIndividuals {
		return true
	}

	// Default: if processes personal data and no explicit EU connection info,
	// assume applicable for safety
	return facts.DataProtection.ProcessesPersonalData
}

// GetClassification returns the DSGVO classification as string
func (m *DSGVOModule) GetClassification(facts *UnifiedFacts) string {
	if !m.IsApplicable(facts) {
		return "nicht_anwendbar"
	}

	// Determine role and risk level
	if m.hasHighRiskProcessing(facts) {
		if facts.DataProtection.IsController {
			return "verantwortlicher_hohes_risiko"
		}
		return "auftragsverarbeiter_hohes_risiko"
	}

	if facts.DataProtection.IsController {
		return "verantwortlicher"
	}
	return "auftragsverarbeiter"
}

// hasHighRiskProcessing checks if organization performs high-risk processing
func (m *DSGVOModule) hasHighRiskProcessing(facts *UnifiedFacts) bool {
	// Check for special categories (Art. 9)
	for _, cat := range facts.DataProtection.SpecialCategories {
		if DSGVOSpecialCategories[cat] {
			return true
		}
	}

	// Check for high-risk activities (Art. 35)
	for _, activity := range facts.DataProtection.HighRiskActivities {
		if DSGVOHighRiskProcessing[activity] {
			return true
		}
	}

	// Large-scale processing
	if facts.DataProtection.DataSubjectCount > 10000 {
		return true
	}

	// Systematic monitoring
	if facts.DataProtection.SystematicMonitoring {
		return true
	}

	// Automated decision-making with legal effects
	if facts.DataProtection.AutomatedDecisions && facts.DataProtection.LegalEffects {
		return true
	}

	return false
}

// requiresDPO checks if a DPO is mandatory
func (m *DSGVOModule) requiresDPO(facts *UnifiedFacts) bool {
	// Art. 37 - DPO mandatory if:
	// 1. Public authority or body
	if facts.Organization.IsPublicAuthority {
		return true
	}

	// 2. Core activities require regular and systematic monitoring at large scale
	if facts.DataProtection.SystematicMonitoring && facts.DataProtection.DataSubjectCount > 10000 {
		return true
	}

	// 3. Core activities consist of processing special categories at large scale
	if len(facts.DataProtection.SpecialCategories) > 0 && facts.DataProtection.DataSubjectCount > 10000 {
		return true
	}

	// German BDSG: >= 20 employees regularly processing personal data
	if facts.Organization.Country == "DE" && facts.Organization.EmployeeCount >= 20 {
		return true
	}

	return false
}

// DeriveObligations derives all applicable DSGVO obligations
func (m *DSGVOModule) DeriveObligations(facts *UnifiedFacts) []Obligation {
	if !m.IsApplicable(facts) {
		return []Obligation{}
	}

	var result []Obligation
	isHighRisk := m.hasHighRiskProcessing(facts)
	needsDPO := m.requiresDPO(facts)
	isController := facts.DataProtection.IsController
	usesProcessors := facts.DataProtection.UsesExternalProcessor

	for _, obl := range m.obligations {
		if m.obligationApplies(obl, isController, isHighRisk, needsDPO, usesProcessors, facts) {
			customized := obl
			customized.RegulationID = m.ID()
			result = append(result, customized)
		}
	}

	return result
}

// obligationApplies checks if a specific obligation applies
func (m *DSGVOModule) obligationApplies(obl Obligation, isController, isHighRisk, needsDPO, usesProcessors bool, facts *UnifiedFacts) bool {
	switch obl.AppliesWhen {
	case "always":
		return true
	case "controller":
		return isController
	case "processor":
		return !isController
	case "high_risk":
		return isHighRisk
	case "needs_dpo":
		return needsDPO
	case "uses_processors":
		return usesProcessors
	case "controller_or_processor":
		return true
	case "special_categories":
		return len(facts.DataProtection.SpecialCategories) > 0
	case "cross_border":
		return facts.DataProtection.CrossBorderProcessing
	case "":
		return true
	default:
		return true
	}
}

// DeriveControls derives all applicable DSGVO controls
func (m *DSGVOModule) DeriveControls(facts *UnifiedFacts) []ObligationControl {
	if !m.IsApplicable(facts) {
		return []ObligationControl{}
	}

	var result []ObligationControl
	for _, ctrl := range m.controls {
		ctrl.RegulationID = m.ID()
		result = append(result, ctrl)
	}

	return result
}

// GetDecisionTree returns the DSGVO applicability decision tree
func (m *DSGVOModule) GetDecisionTree() *DecisionTree {
	return m.decisionTree
}

// GetIncidentDeadlines returns DSGVO breach notification deadlines
func (m *DSGVOModule) GetIncidentDeadlines(facts *UnifiedFacts) []IncidentDeadline {
	if !m.IsApplicable(facts) {
		return []IncidentDeadline{}
	}

	return m.incidentDeadlines
}

// ============================================================================
// YAML Loading
// ============================================================================

// DSGVOObligationsConfig is the YAML structure for DSGVO obligations
type DSGVOObligationsConfig struct {
	Regulation        string                    `yaml:"regulation"`
	Name              string                    `yaml:"name"`
	Obligations       []ObligationYAML          `yaml:"obligations"`
	Controls          []ControlYAML             `yaml:"controls"`
	IncidentDeadlines []IncidentDeadlineYAML    `yaml:"incident_deadlines"`
}

func (m *DSGVOModule) loadFromYAML() error {
	searchPaths := []string{
		"policies/obligations/dsgvo_obligations.yaml",
		filepath.Join(".", "policies", "obligations", "dsgvo_obligations.yaml"),
		filepath.Join("..", "policies", "obligations", "dsgvo_obligations.yaml"),
		filepath.Join("..", "..", "policies", "obligations", "dsgvo_obligations.yaml"),
		"/app/policies/obligations/dsgvo_obligations.yaml",
	}

	var data []byte
	var err error
	for _, path := range searchPaths {
		data, err = os.ReadFile(path)
		if err == nil {
			break
		}
	}

	if err != nil {
		return fmt.Errorf("DSGVO obligations YAML not found: %w", err)
	}

	var config DSGVOObligationsConfig
	if err := yaml.Unmarshal(data, &config); err != nil {
		return fmt.Errorf("failed to parse DSGVO YAML: %w", err)
	}

	m.convertObligations(config.Obligations)
	m.convertControls(config.Controls)
	m.convertIncidentDeadlines(config.IncidentDeadlines)

	return nil
}

func (m *DSGVOModule) convertObligations(yamlObls []ObligationYAML) {
	for _, y := range yamlObls {
		obl := Obligation{
			ID:              y.ID,
			RegulationID:    "dsgvo",
			Title:           y.Title,
			Description:     y.Description,
			AppliesWhen:     y.AppliesWhen,
			Category:        ObligationCategory(y.Category),
			Responsible:     ResponsibleRole(y.Responsible),
			Priority:        ObligationPriority(y.Priority),
			ISO27001Mapping: y.ISO27001,
			HowToImplement:  y.HowTo,
		}

		for _, lb := range y.LegalBasis {
			obl.LegalBasis = append(obl.LegalBasis, LegalReference{
				Norm:    lb.Norm,
				Article: lb.Article,
			})
		}

		if y.Deadline != nil {
			obl.Deadline = &Deadline{
				Type:     DeadlineType(y.Deadline.Type),
				Duration: y.Deadline.Duration,
			}
			if y.Deadline.Date != "" {
				if t, err := time.Parse("2006-01-02", y.Deadline.Date); err == nil {
					obl.Deadline.Date = &t
				}
			}
		}

		if y.Sanctions != nil {
			obl.Sanctions = &SanctionInfo{
				MaxFine:           y.Sanctions.MaxFine,
				PersonalLiability: y.Sanctions.PersonalLiability,
			}
		}

		for _, e := range y.Evidence {
			obl.Evidence = append(obl.Evidence, EvidenceItem{Name: e, Required: true})
		}

		m.obligations = append(m.obligations, obl)
	}
}

func (m *DSGVOModule) convertControls(yamlCtrls []ControlYAML) {
	for _, y := range yamlCtrls {
		ctrl := ObligationControl{
			ID:              y.ID,
			RegulationID:    "dsgvo",
			Name:            y.Name,
			Description:     y.Description,
			Category:        y.Category,
			WhatToDo:        y.WhatToDo,
			ISO27001Mapping: y.ISO27001,
			Priority:        ObligationPriority(y.Priority),
		}
		m.controls = append(m.controls, ctrl)
	}
}

func (m *DSGVOModule) convertIncidentDeadlines(yamlDeadlines []IncidentDeadlineYAML) {
	for _, y := range yamlDeadlines {
		deadline := IncidentDeadline{
			RegulationID: "dsgvo",
			Phase:        y.Phase,
			Deadline:     y.Deadline,
			Content:      y.Content,
			Recipient:    y.Recipient,
		}
		for _, lb := range y.LegalBasis {
			deadline.LegalBasis = append(deadline.LegalBasis, LegalReference{
				Norm:    lb.Norm,
				Article: lb.Article,
			})
		}
		m.incidentDeadlines = append(m.incidentDeadlines, deadline)
	}
}

// ============================================================================
// Hardcoded Fallback
// ============================================================================

func (m *DSGVOModule) loadHardcodedObligations() {
	m.obligations = []Obligation{
		{
			ID:           "DSGVO-OBL-001",
			RegulationID: "dsgvo",
			Title:        "Verarbeitungsverzeichnis führen",
			Description:  "Führung eines Verzeichnisses aller Verarbeitungstätigkeiten mit Angabe der Zwecke, Kategorien betroffener Personen, Empfänger, Übermittlungen in Drittländer und Löschfristen.",
			LegalBasis:   []LegalReference{{Norm: "Art. 30 DSGVO", Article: "Verzeichnis von Verarbeitungstätigkeiten"}},
			Category:     CategoryGovernance,
			Responsible:  RoleDSB,
			Sanctions:    &SanctionInfo{MaxFine: "10 Mio. EUR oder 2% Jahresumsatz"},
			Evidence:     []EvidenceItem{{Name: "Verarbeitungsverzeichnis", Required: true}, {Name: "Regelmäßige Aktualisierung", Required: true}},
			Priority:     PriorityHigh,
			AppliesWhen:  "always",
			ISO27001Mapping: []string{"A.5.1.1"},
		},
		{
			ID:           "DSGVO-OBL-002",
			RegulationID: "dsgvo",
			Title:        "Technische und organisatorische Maßnahmen (TOMs)",
			Description:  "Implementierung geeigneter technischer und organisatorischer Maßnahmen zum Schutz personenbezogener Daten unter Berücksichtigung des Stands der Technik und der Implementierungskosten.",
			LegalBasis:   []LegalReference{{Norm: "Art. 32 DSGVO", Article: "Sicherheit der Verarbeitung"}},
			Category:     CategoryTechnical,
			Responsible:  RoleITLeitung,
			Sanctions:    &SanctionInfo{MaxFine: "10 Mio. EUR oder 2% Jahresumsatz"},
			Evidence:     []EvidenceItem{{Name: "TOM-Dokumentation", Required: true}, {Name: "Risikoanalyse", Required: true}, {Name: "Verschlüsselungskonzept", Required: true}},
			Priority:     PriorityHigh,
			AppliesWhen:  "always",
			ISO27001Mapping: []string{"A.8", "A.10", "A.12", "A.13"},
		},
		{
			ID:           "DSGVO-OBL-003",
			RegulationID: "dsgvo",
			Title:        "Datenschutz-Folgenabschätzung (DSFA)",
			Description:  "Durchführung einer Datenschutz-Folgenabschätzung bei Verarbeitungsvorgängen, die voraussichtlich ein hohes Risiko für die Rechte und Freiheiten natürlicher Personen zur Folge haben.",
			LegalBasis:   []LegalReference{{Norm: "Art. 35 DSGVO", Article: "Datenschutz-Folgenabschätzung"}},
			Category:     CategoryGovernance,
			Responsible:  RoleDSB,
			Sanctions:    &SanctionInfo{MaxFine: "10 Mio. EUR oder 2% Jahresumsatz"},
			Evidence:     []EvidenceItem{{Name: "DSFA-Dokumentation", Required: true}, {Name: "Risikobewertung", Required: true}, {Name: "Abhilfemaßnahmen", Required: true}},
			Priority:     PriorityCritical,
			AppliesWhen:  "high_risk",
			ISO27001Mapping: []string{"A.5.1.1", "A.18.1"},
		},
		{
			ID:           "DSGVO-OBL-004",
			RegulationID: "dsgvo",
			Title:        "Datenschutzbeauftragten benennen",
			Description:  "Benennung eines Datenschutzbeauftragten bei öffentlichen Stellen, systematischer Überwachung im großen Umfang oder Verarbeitung besonderer Kategorien im großen Umfang.",
			LegalBasis:   []LegalReference{{Norm: "Art. 37 DSGVO", Article: "Benennung eines Datenschutzbeauftragten"}, {Norm: "§ 38 BDSG"}},
			Category:     CategoryGovernance,
			Responsible:  RoleManagement,
			Sanctions:    &SanctionInfo{MaxFine: "10 Mio. EUR oder 2% Jahresumsatz"},
			Evidence:     []EvidenceItem{{Name: "DSB-Bestellung", Required: true}, {Name: "Meldung an Aufsichtsbehörde", Required: true}, {Name: "Veröffentlichung Kontaktdaten", Required: true}},
			Priority:     PriorityHigh,
			AppliesWhen:  "needs_dpo",
		},
		{
			ID:           "DSGVO-OBL-005",
			RegulationID: "dsgvo",
			Title:        "Auftragsverarbeitungsvertrag (AVV)",
			Description:  "Abschluss eines Auftragsverarbeitungsvertrags mit allen Auftragsverarbeitern, der die Pflichten gemäß Art. 28 Abs. 3 DSGVO enthält.",
			LegalBasis:   []LegalReference{{Norm: "Art. 28 DSGVO", Article: "Auftragsverarbeiter"}},
			Category:     CategoryOrganizational,
			Responsible:  RoleDSB,
			Sanctions:    &SanctionInfo{MaxFine: "10 Mio. EUR oder 2% Jahresumsatz"},
			Evidence:     []EvidenceItem{{Name: "AVV-Vertrag", Required: true}, {Name: "TOM-Nachweis des Auftragsverarbeiters", Required: true}, {Name: "Verzeichnis der Auftragsverarbeiter", Required: true}},
			Priority:     PriorityHigh,
			AppliesWhen:  "uses_processors",
		},
		{
			ID:           "DSGVO-OBL-006",
			RegulationID: "dsgvo",
			Title:        "Informationspflichten erfüllen",
			Description:  "Information der betroffenen Personen über die Verarbeitung ihrer Daten bei Erhebung (Art. 13) oder nachträglich (Art. 14).",
			LegalBasis:   []LegalReference{{Norm: "Art. 13 DSGVO", Article: "Informationspflicht bei Erhebung"}, {Norm: "Art. 14 DSGVO", Article: "Informationspflicht bei Dritterhebung"}},
			Category:     CategoryOrganizational,
			Responsible:  RoleDSB,
			Sanctions:    &SanctionInfo{MaxFine: "20 Mio. EUR oder 4% Jahresumsatz"},
			Evidence:     []EvidenceItem{{Name: "Datenschutzerklärung", Required: true}, {Name: "Cookie-Banner", Required: true}, {Name: "Informationsblätter", Required: true}},
			Priority:     PriorityHigh,
			AppliesWhen:  "controller",
		},
		{
			ID:           "DSGVO-OBL-007",
			RegulationID: "dsgvo",
			Title:        "Betroffenenrechte umsetzen",
			Description:  "Einrichtung von Prozessen zur Bearbeitung von Betroffenenanfragen: Auskunft (Art. 15), Berichtigung (Art. 16), Löschung (Art. 17), Einschränkung (Art. 18), Datenübertragbarkeit (Art. 20), Widerspruch (Art. 21).",
			LegalBasis:   []LegalReference{{Norm: "Art. 15-21 DSGVO", Article: "Betroffenenrechte"}},
			Category:     CategoryOrganizational,
			Responsible:  RoleDSB,
			Deadline:     &Deadline{Type: DeadlineRelative, Duration: "1 Monat nach Anfrage"},
			Sanctions:    &SanctionInfo{MaxFine: "20 Mio. EUR oder 4% Jahresumsatz"},
			Evidence:     []EvidenceItem{{Name: "DSR-Prozess dokumentiert", Required: true}, {Name: "Anfrageformulare", Required: true}, {Name: "Bearbeitungsprotokolle", Required: true}},
			Priority:     PriorityCritical,
			AppliesWhen:  "controller",
		},
		{
			ID:           "DSGVO-OBL-008",
			RegulationID: "dsgvo",
			Title:        "Einwilligungen dokumentieren",
			Description:  "Nachweis gültiger Einwilligungen: freiwillig, informiert, spezifisch, unmissverständlich, widerrufbar. Bei besonderen Kategorien: ausdrücklich.",
			LegalBasis:   []LegalReference{{Norm: "Art. 7 DSGVO", Article: "Bedingungen für die Einwilligung"}, {Norm: "Art. 9 Abs. 2 lit. a DSGVO"}},
			Category:     CategoryGovernance,
			Responsible:  RoleDSB,
			Sanctions:    &SanctionInfo{MaxFine: "20 Mio. EUR oder 4% Jahresumsatz"},
			Evidence:     []EvidenceItem{{Name: "Consent-Management-System", Required: true}, {Name: "Einwilligungsprotokolle", Required: true}, {Name: "Widerrufsprozess", Required: true}},
			Priority:     PriorityHigh,
			AppliesWhen:  "controller",
		},
		{
			ID:           "DSGVO-OBL-009",
			RegulationID: "dsgvo",
			Title:        "Datenschutz durch Technikgestaltung",
			Description:  "Umsetzung von Datenschutz durch Technikgestaltung (Privacy by Design) und datenschutzfreundliche Voreinstellungen (Privacy by Default).",
			LegalBasis:   []LegalReference{{Norm: "Art. 25 DSGVO", Article: "Datenschutz durch Technikgestaltung"}},
			Category:     CategoryTechnical,
			Responsible:  RoleITLeitung,
			Sanctions:    &SanctionInfo{MaxFine: "10 Mio. EUR oder 2% Jahresumsatz"},
			Evidence:     []EvidenceItem{{Name: "Privacy-by-Design-Konzept", Required: true}, {Name: "Default-Einstellungen dokumentiert", Required: true}},
			Priority:     PriorityMedium,
			AppliesWhen:  "controller",
			ISO27001Mapping: []string{"A.14.1.1"},
		},
		{
			ID:           "DSGVO-OBL-010",
			RegulationID: "dsgvo",
			Title:        "Löschkonzept umsetzen",
			Description:  "Implementierung eines Löschkonzepts mit definierten Aufbewahrungsfristen und automatisierten Löschroutinen.",
			LegalBasis:   []LegalReference{{Norm: "Art. 17 DSGVO", Article: "Recht auf Löschung"}, {Norm: "Art. 5 Abs. 1 lit. e DSGVO", Article: "Speicherbegrenzung"}},
			Category:     CategoryTechnical,
			Responsible:  RoleITLeitung,
			Sanctions:    &SanctionInfo{MaxFine: "20 Mio. EUR oder 4% Jahresumsatz"},
			Evidence:     []EvidenceItem{{Name: "Löschkonzept", Required: true}, {Name: "Aufbewahrungsfristen", Required: true}, {Name: "Löschprotokolle", Required: true}},
			Priority:     PriorityHigh,
			AppliesWhen:  "always",
		},
		{
			ID:           "DSGVO-OBL-011",
			RegulationID: "dsgvo",
			Title:        "Drittlandtransfer absichern",
			Description:  "Bei Übermittlung in Drittländer: Angemessenheitsbeschluss, Standardvertragsklauseln (SCCs), BCRs oder andere Garantien nach Kapitel V DSGVO.",
			LegalBasis:   []LegalReference{{Norm: "Art. 44-49 DSGVO", Article: "Übermittlung in Drittländer"}},
			Category:     CategoryOrganizational,
			Responsible:  RoleDSB,
			Sanctions:    &SanctionInfo{MaxFine: "20 Mio. EUR oder 4% Jahresumsatz"},
			Evidence:     []EvidenceItem{{Name: "SCCs abgeschlossen", Required: true}, {Name: "Transfer Impact Assessment", Required: true}, {Name: "Dokumentation der Garantien", Required: true}},
			Priority:     PriorityCritical,
			AppliesWhen:  "cross_border",
		},
		{
			ID:           "DSGVO-OBL-012",
			RegulationID: "dsgvo",
			Title:        "Meldeprozess für Datenschutzverletzungen",
			Description:  "Etablierung eines Prozesses zur Erkennung, Bewertung und Meldung von Datenschutzverletzungen an die Aufsichtsbehörde und ggf. an betroffene Personen.",
			LegalBasis:   []LegalReference{{Norm: "Art. 33 DSGVO", Article: "Meldung an Aufsichtsbehörde"}, {Norm: "Art. 34 DSGVO", Article: "Benachrichtigung Betroffener"}},
			Category:     CategoryMeldepflicht,
			Responsible:  RoleDSB,
			Sanctions:    &SanctionInfo{MaxFine: "10 Mio. EUR oder 2% Jahresumsatz"},
			Evidence:     []EvidenceItem{{Name: "Breach-Notification-Prozess", Required: true}, {Name: "Meldevorlage", Required: true}, {Name: "Vorfallprotokoll", Required: true}},
			Priority:     PriorityCritical,
			AppliesWhen:  "always",
		},
	}

	// Hardcoded controls
	m.controls = []ObligationControl{
		{
			ID:              "DSGVO-CTRL-001",
			RegulationID:    "dsgvo",
			Name:            "Consent-Management-System",
			Description:     "Implementierung eines Systems zur Verwaltung von Einwilligungen",
			Category:        "Technisch",
			WhatToDo:        "Implementierung einer Consent-Management-Plattform mit Protokollierung, Widerrufsmöglichkeit und Nachweis",
			ISO27001Mapping: []string{"A.18.1"},
			Priority:        PriorityHigh,
		},
		{
			ID:              "DSGVO-CTRL-002",
			RegulationID:    "dsgvo",
			Name:            "Verschlüsselung personenbezogener Daten",
			Description:     "Verschlüsselung ruhender und übertragener Daten",
			Category:        "Technisch",
			WhatToDo:        "Implementierung von TLS 1.3 für Übertragung, AES-256 für Speicherung, Key-Management",
			ISO27001Mapping: []string{"A.10.1"},
			Priority:        PriorityHigh,
		},
		{
			ID:              "DSGVO-CTRL-003",
			RegulationID:    "dsgvo",
			Name:            "Zugriffskontrolle",
			Description:     "Need-to-know-Prinzip für Zugriff auf personenbezogene Daten",
			Category:        "Organisatorisch",
			WhatToDo:        "Rollenbasierte Zugriffssteuerung (RBAC), regelmäßige Überprüfung der Berechtigungen, Protokollierung",
			ISO27001Mapping: []string{"A.9.1", "A.9.2", "A.9.4"},
			Priority:        PriorityHigh,
		},
		{
			ID:              "DSGVO-CTRL-004",
			RegulationID:    "dsgvo",
			Name:            "Pseudonymisierung/Anonymisierung",
			Description:     "Anwendung von Pseudonymisierung wo möglich, Anonymisierung für Analysen",
			Category:        "Technisch",
			WhatToDo:        "Implementierung von Pseudonymisierungsverfahren, getrennte Speicherung von Zuordnungstabellen",
			ISO27001Mapping: []string{"A.8.2"},
			Priority:        PriorityMedium,
		},
		{
			ID:              "DSGVO-CTRL-005",
			RegulationID:    "dsgvo",
			Name:            "Datenschutz-Schulungen",
			Description:     "Regelmäßige Schulung aller Mitarbeiter zu Datenschutzthemen",
			Category:        "Organisatorisch",
			WhatToDo:        "Jährliche Pflichtschulungen, Awareness-Kampagnen, dokumentierte Nachweise",
			ISO27001Mapping: []string{"A.7.2.2"},
			Priority:        PriorityMedium,
		},
	}

	// Hardcoded incident deadlines
	m.incidentDeadlines = []IncidentDeadline{
		{
			RegulationID: "dsgvo",
			Phase:        "Meldung an Aufsichtsbehörde",
			Deadline:     "72 Stunden",
			Content:      "Meldung bei Verletzung des Schutzes personenbezogener Daten, es sei denn, die Verletzung führt voraussichtlich nicht zu einem Risiko für die Rechte und Freiheiten natürlicher Personen.",
			Recipient:    "Zuständige Datenschutz-Aufsichtsbehörde",
			LegalBasis:   []LegalReference{{Norm: "Art. 33 DSGVO"}},
		},
		{
			RegulationID: "dsgvo",
			Phase:        "Benachrichtigung Betroffener",
			Deadline:     "unverzüglich",
			Content:      "Wenn die Verletzung voraussichtlich ein hohes Risiko für die Rechte und Freiheiten natürlicher Personen zur Folge hat, müssen die betroffenen Personen unverzüglich benachrichtigt werden.",
			Recipient:    "Betroffene Personen",
			LegalBasis:   []LegalReference{{Norm: "Art. 34 DSGVO"}},
		},
	}
}

// ============================================================================
// Decision Tree
// ============================================================================

func (m *DSGVOModule) buildDecisionTree() {
	m.decisionTree = &DecisionTree{
		ID:   "dsgvo_applicability",
		Name: "DSGVO Anwendbarkeits-Entscheidungsbaum",
		RootNode: &DecisionNode{
			ID:       "root",
			Question: "Verarbeitet Ihre Organisation personenbezogene Daten?",
			YesNode: &DecisionNode{
				ID:       "eu_check",
				Question: "Ist Ihre Organisation in der EU/EWR ansässig?",
				YesNode: &DecisionNode{
					ID:          "eu_established",
					Result:      "DSGVO anwendbar",
					Explanation: "Die DSGVO gilt für alle in der EU ansässigen Organisationen, die personenbezogene Daten verarbeiten.",
				},
				NoNode: &DecisionNode{
					ID:       "offering_check",
					Question: "Bieten Sie Waren oder Dienstleistungen an Personen in der EU an?",
					YesNode: &DecisionNode{
						ID:          "offering_to_eu",
						Result:      "DSGVO anwendbar",
						Explanation: "Die DSGVO gilt für Organisationen außerhalb der EU, die Waren/Dienstleistungen an EU-Bürger anbieten.",
					},
					NoNode: &DecisionNode{
						ID:       "monitoring_check",
						Question: "Beobachten Sie das Verhalten von Personen in der EU?",
						YesNode: &DecisionNode{
							ID:          "monitoring_eu",
							Result:      "DSGVO anwendbar",
							Explanation: "Die DSGVO gilt für Organisationen, die das Verhalten von Personen in der EU beobachten (z.B. Tracking, Profiling).",
						},
						NoNode: &DecisionNode{
							ID:          "not_applicable",
							Result:      "DSGVO nicht anwendbar",
							Explanation: "Die DSGVO ist nicht anwendbar, da keine der Anknüpfungskriterien erfüllt ist.",
						},
					},
				},
			},
			NoNode: &DecisionNode{
				ID:          "no_personal_data",
				Result:      "DSGVO nicht anwendbar",
				Explanation: "Die DSGVO gilt nur für die Verarbeitung personenbezogener Daten.",
			},
		},
	}
}
