package ucca

import (
	"fmt"
	"strings"
)

// generateSummary creates a human-readable summary
func (e *PolicyEngine) generateSummary(result *AssessmentResult, intake *UseCaseIntake) string {
	var parts []string

	switch result.Feasibility {
	case FeasibilityYES:
		parts = append(parts, "Der Use Case ist aus DSGVO-Sicht grundsätzlich umsetzbar.")
	case FeasibilityCONDITIONAL:
		parts = append(parts, "Der Use Case ist unter Auflagen umsetzbar.")
	case FeasibilityNO:
		parts = append(parts, "Der Use Case ist in der aktuellen Form nicht DSGVO-konform umsetzbar.")
	}

	blockCount := 0
	warnCount := 0
	for _, r := range result.TriggeredRules {
		if r.Severity == SeverityBLOCK {
			blockCount++
		} else if r.Severity == SeverityWARN {
			warnCount++
		}
	}

	if blockCount > 0 {
		parts = append(parts, fmt.Sprintf("%d kritische Regelverletzung(en) identifiziert.", blockCount))
	}
	if warnCount > 0 {
		parts = append(parts, fmt.Sprintf("%d Warnungen erfordern Aufmerksamkeit.", warnCount))
	}

	if result.DSFARecommended {
		parts = append(parts, "Eine Datenschutz-Folgenabschätzung (DSFA) wird empfohlen.")
	}

	return strings.Join(parts, " ")
}

// generateRecommendation creates actionable recommendations
func (e *PolicyEngine) generateRecommendation(result *AssessmentResult, intake *UseCaseIntake) string {
	if result.Feasibility == FeasibilityYES {
		return "Fahren Sie mit der Implementierung fort. Beachten Sie die empfohlenen Architektur-Patterns für optimale DSGVO-Konformität."
	}

	if result.Feasibility == FeasibilityCONDITIONAL {
		if len(result.RequiredControls) > 0 {
			return fmt.Sprintf("Implementieren Sie die %d erforderlichen Kontrollen vor dem Go-Live. Dokumentieren Sie alle Maßnahmen für den Nachweis der Rechenschaftspflicht (Art. 5 DSGVO).", len(result.RequiredControls))
		}
		return "Prüfen Sie die ausgelösten Warnungen und implementieren Sie entsprechende Schutzmaßnahmen."
	}

	return "Der Use Case erfordert grundlegende Änderungen. Prüfen Sie die Lösungsvorschläge."
}

// generateAlternative creates alternative approach suggestions
func (e *PolicyEngine) generateAlternative(result *AssessmentResult, intake *UseCaseIntake, triggeredRules map[string]bool) string {
	var suggestions []string

	for _, ps := range e.config.ProblemSolutions {
		for _, trigger := range ps.Triggers {
			if triggeredRules[trigger.Rule] {
				if trigger.WithoutControl != "" {
					hasControl := false
					for _, ctrl := range result.RequiredControls {
						if ctrl.ID == trigger.WithoutControl {
							hasControl = true
							break
						}
					}
					if hasControl {
						continue
					}
				}
				if len(ps.Solutions) > 0 {
					sol := ps.Solutions[0]
					suggestions = append(suggestions, fmt.Sprintf("%s: %s", sol.Title, sol.TeamQuestion))
				}
			}
		}
	}

	if len(suggestions) == 0 {
		if intake.ModelUsage.Training && intake.DataTypes.PersonalData {
			suggestions = append(suggestions, "Nutzen Sie nur RAG statt Training mit personenbezogenen Daten")
		}
		if intake.Automation == AutomationFullyAutomated && intake.Outputs.LegalEffects {
			suggestions = append(suggestions, "Implementieren Sie Human-in-the-Loop für Entscheidungen mit rechtlichen Auswirkungen")
		}
		if intake.DataTypes.MinorData && intake.Purpose.EvaluationScoring {
			suggestions = append(suggestions, "Verzichten Sie auf automatisches Scoring von Minderjährigen")
		}
	}

	if len(suggestions) == 0 {
		return "Überarbeiten Sie den Use Case unter Berücksichtigung der ausgelösten Regeln."
	}

	return strings.Join(suggestions, " | ")
}

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

func parseSeverity(s string) Severity {
	switch strings.ToUpper(s) {
	case "BLOCK":
		return SeverityBLOCK
	case "WARN":
		return SeverityWARN
	default:
		return SeverityINFO
	}
}

func categorizeControl(id string) string {
	technical := map[string]bool{
		"C_ENCRYPTION": true, "C_ACCESS_LOGGING": true,
	}
	if technical[id] {
		return "technical"
	}
	return "organizational"
}
