package llm

import (
	"context"
	"fmt"
	"strings"
)

// SearchResult matches the RAG service result structure
type SearchResult struct {
	ID       string            `json:"id"`
	Content  string            `json:"content"`
	Source   string            `json:"source"`
	Score    float64           `json:"score"`
	Metadata map[string]string `json:"metadata,omitempty"`
}

// Service provides LLM functionality for document generation
type Service struct {
	apiKey string
	model  string
}

// NewService creates a new LLM service
func NewService(apiKey string) *Service {
	model := "claude-3-5-sonnet-20241022"
	if apiKey == "" {
		model = "mock"
	}
	return &Service{
		apiKey: apiKey,
		model:  model,
	}
}

// GetModel returns the current model name
func (s *Service) GetModel() string {
	return s.model
}

// GenerateDSFA generates a Data Protection Impact Assessment
func (s *Service) GenerateDSFA(ctx context.Context, context map[string]interface{}, ragSources []SearchResult) (string, int, error) {
	if s.apiKey == "" {
		return "", 0, fmt.Errorf("LLM not configured")
	}

	// Build prompt with context and RAG sources
	prompt := s.buildDSFAPrompt(context, ragSources)

	// In production, this would call the Anthropic API
	// response, err := s.callAnthropicAPI(ctx, prompt)
	// if err != nil {
	//     return "", 0, err
	// }

	// For now, simulate a response
	content := s.generateDSFAContent(context, ragSources)
	tokensUsed := len(strings.Split(content, " ")) * 2 // Rough estimate

	return content, tokensUsed, nil
}

// GenerateTOM generates Technical and Organizational Measures
func (s *Service) GenerateTOM(ctx context.Context, context map[string]interface{}, ragSources []SearchResult) (string, int, error) {
	if s.apiKey == "" {
		return "", 0, fmt.Errorf("LLM not configured")
	}

	content := s.generateTOMContent(context, ragSources)
	tokensUsed := len(strings.Split(content, " ")) * 2

	return content, tokensUsed, nil
}

// GenerateVVT generates a Processing Activity Register
func (s *Service) GenerateVVT(ctx context.Context, context map[string]interface{}, ragSources []SearchResult) (string, int, error) {
	if s.apiKey == "" {
		return "", 0, fmt.Errorf("LLM not configured")
	}

	content := s.generateVVTContent(context, ragSources)
	tokensUsed := len(strings.Split(content, " ")) * 2

	return content, tokensUsed, nil
}

// GenerateGutachten generates an expert opinion/assessment
func (s *Service) GenerateGutachten(ctx context.Context, context map[string]interface{}, ragSources []SearchResult) (string, int, error) {
	if s.apiKey == "" {
		return "", 0, fmt.Errorf("LLM not configured")
	}

	content := s.generateGutachtenContent(context, ragSources)
	tokensUsed := len(strings.Split(content, " ")) * 2

	return content, tokensUsed, nil
}

// buildDSFAPrompt builds the prompt for DSFA generation
func (s *Service) buildDSFAPrompt(context map[string]interface{}, ragSources []SearchResult) string {
	var sb strings.Builder

	sb.WriteString("Du bist ein Datenschutz-Experte und erstellst eine Datenschutz-Folgenabschätzung (DSFA) gemäß Art. 35 DSGVO.\n\n")

	// Add context
	if useCaseName, ok := context["useCaseName"].(string); ok {
		sb.WriteString(fmt.Sprintf("Use Case: %s\n", useCaseName))
	}
	if description, ok := context["description"].(string); ok {
		sb.WriteString(fmt.Sprintf("Beschreibung: %s\n", description))
	}

	// Add RAG context
	if len(ragSources) > 0 {
		sb.WriteString("\nRelevante rechtliche Grundlagen:\n")
		for _, source := range ragSources {
			sb.WriteString(fmt.Sprintf("- %s (%s)\n", source.Content[:min(200, len(source.Content))], source.Source))
		}
	}

	sb.WriteString("\nErstelle eine vollständige DSFA mit allen erforderlichen Abschnitten.")

	return sb.String()
}

// Content generation functions (would be replaced by actual LLM calls in production)
func (s *Service) generateDSFAContent(context map[string]interface{}, ragSources []SearchResult) string {
	useCaseName := "KI-gestützte Datenverarbeitung"
	if name, ok := context["useCaseName"].(string); ok {
		useCaseName = name
	}

	return fmt.Sprintf(`# Datenschutz-Folgenabschätzung (DSFA)

## Use Case: %s

## 1. Systematische Beschreibung der Verarbeitungsvorgänge

Die geplante Verarbeitung umfasst die Analyse von Daten mittels KI-gestützter Systeme.

### 1.1 Verarbeitungszwecke
- Automatisierte Analyse und Verarbeitung
- Optimierung von Geschäftsprozessen
- Qualitätssicherung

### 1.2 Rechtsgrundlage
Gemäß Art. 6 Abs. 1 lit. f DSGVO basiert die Verarbeitung auf dem berechtigten Interesse des Verantwortlichen.

### 1.3 Kategorien verarbeiteter Daten
- Nutzungsdaten
- Metadaten
- Aggregierte Analysedaten

## 2. Bewertung der Notwendigkeit und Verhältnismäßigkeit

### 2.1 Notwendigkeit
Die Verarbeitung ist erforderlich, um die definierten Geschäftsziele zu erreichen.

### 2.2 Verhältnismäßigkeit
Alternative Methoden wurden geprüft. Die gewählte Verarbeitungsmethode stellt den geringsten Eingriff bei gleichem Nutzen dar.

## 3. Risikobewertung

### 3.1 Identifizierte Risiken

| Risiko | Wahrscheinlichkeit | Schwere | Gesamtbewertung |
|--------|-------------------|---------|-----------------|
| Unbefugter Zugriff | Mittel | Hoch | HOCH |
| Datenverlust | Niedrig | Hoch | MITTEL |
| Fehlinterpretation | Mittel | Mittel | MITTEL |

### 3.2 Maßnahmen zur Risikominderung

1. **Technische Maßnahmen**
   - Verschlüsselung (AES-256)
   - Zugriffskontrollen
   - Audit-Logging

2. **Organisatorische Maßnahmen**
   - Schulungen
   - Dokumentation
   - Regelmäßige Überprüfungen

## 4. Genehmigungsstatus

| Rolle | Status | Datum |
|-------|--------|-------|
| Projektleiter | AUSSTEHEND | - |
| DSB | AUSSTEHEND | - |
| Geschäftsführung | AUSSTEHEND | - |

---
*Generiert mit KI-Unterstützung. Manuelle Überprüfung erforderlich.*
`, useCaseName)
}

func (s *Service) generateTOMContent(context map[string]interface{}, ragSources []SearchResult) string {
	return `# Technische und Organisatorische Maßnahmen (TOMs)

## 1. Vertraulichkeit (Art. 32 Abs. 1 lit. b DSGVO)

### 1.1 Zutrittskontrolle
- [ ] Alarmanlage installiert
- [ ] Chipkarten-System aktiv
- [ ] Besucherprotokoll geführt

### 1.2 Zugangskontrolle
- [ ] Starke Passwort-Policy (12+ Zeichen)
- [ ] MFA aktiviert
- [ ] Automatische Bildschirmsperre

### 1.3 Zugriffskontrolle
- [ ] Rollenbasierte Berechtigungen
- [ ] Need-to-know Prinzip
- [ ] Quartalsweise Berechtigungsüberprüfung

## 2. Integrität (Art. 32 Abs. 1 lit. b DSGVO)

### 2.1 Weitergabekontrolle
- [ ] TLS 1.3 für alle Übertragungen
- [ ] E-Mail-Verschlüsselung
- [ ] Sichere File-Transfer-Protokolle

### 2.2 Eingabekontrolle
- [ ] Vollständiges Audit-Logging
- [ ] Benutzeridentifikation bei Änderungen
- [ ] Unveränderliche Protokolle

## 3. Verfügbarkeit (Art. 32 Abs. 1 lit. c DSGVO)

### 3.1 Verfügbarkeitskontrolle
- [ ] Tägliche Backups
- [ ] Georedundante Speicherung
- [ ] USV-System
- [ ] Dokumentierter Notfallplan

### 3.2 Wiederherstellung
- [ ] RPO: 1 Stunde
- [ ] RTO: 4 Stunden
- [ ] Jährliche Wiederherstellungstests

## 4. Belastbarkeit

- [ ] DDoS-Schutz implementiert
- [ ] Lastverteilung aktiv
- [ ] Skalierbare Infrastruktur

---
*Generiert mit KI-Unterstützung. Manuelle Überprüfung erforderlich.*
`
}

func (s *Service) generateVVTContent(context map[string]interface{}, ragSources []SearchResult) string {
	return `# Verzeichnis der Verarbeitungstätigkeiten (Art. 30 DSGVO)

## Verarbeitungstätigkeit Nr. 1

### Stammdaten

| Feld | Wert |
|------|------|
| **Bezeichnung** | KI-gestützte Datenanalyse |
| **Verantwortlicher** | [Unternehmen] |
| **DSB** | [Name, Kontakt] |
| **Abteilung** | IT / Data Science |

### Verarbeitungsdetails

| Feld | Wert |
|------|------|
| **Zweck** | Optimierung von Geschäftsprozessen durch KI-Analyse |
| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. f DSGVO |
| **Betroffene Kategorien** | Kunden, Mitarbeiter, Geschäftspartner |
| **Datenkategorien** | Nutzungsdaten, Metadaten, Analyseergebnisse |

### Empfänger

| Kategorie | Beispiele |
|-----------|-----------|
| Intern | IT-Abteilung, Management |
| Auftragsverarbeiter | Cloud-Provider (mit AVV) |
| Dritte | Keine |

### Drittlandtransfer

| Frage | Antwort |
|-------|---------|
| Übermittlung in Drittländer? | Nein / Ja |
| Falls ja, Garantien | [Standardvertragsklauseln / Angemessenheitsbeschluss] |

### Löschfristen

| Datenkategorie | Frist | Grundlage |
|----------------|-------|-----------|
| Nutzungsdaten | 12 Monate | Betriebliche Notwendigkeit |
| Analyseergebnisse | 36 Monate | Geschäftszweck |
| Audit-Logs | 10 Jahre | Handelsrechtlich |

### Technisch-Organisatorische Maßnahmen

Verweis auf TOM-Dokument Version 1.0

---
*Generiert mit KI-Unterstützung. Manuelle Überprüfung erforderlich.*
`
}

func (s *Service) generateGutachtenContent(context map[string]interface{}, ragSources []SearchResult) string {
	return `# Compliance-Gutachten

## Management Summary

Das geprüfte System erfüllt die wesentlichen Anforderungen der anwendbaren Regulierungen. Es bestehen Optimierungspotenziale, die priorisiert adressiert werden sollten.

## 1. Prüfungsumfang

### 1.1 Geprüfte Regulierungen
- DSGVO (EU 2016/679)
- AI Act (EU 2024/...)
- NIS2 (EU 2022/2555)

### 1.2 Prüfungsmethodik
- Dokumentenprüfung
- Technische Analyse
- Interviews mit Stakeholdern

## 2. Ergebnisse

### 2.1 DSGVO-Konformität

| Bereich | Bewertung | Handlungsbedarf |
|---------|-----------|-----------------|
| Rechtmäßigkeit | ✓ Erfüllt | Gering |
| Transparenz | ◐ Teilweise | Mittel |
| Datensicherheit | ✓ Erfüllt | Gering |
| Betroffenenrechte | ◐ Teilweise | Mittel |

### 2.2 AI Act-Konformität

| Bereich | Bewertung | Handlungsbedarf |
|---------|-----------|-----------------|
| Risikoklassifizierung | ✓ Erfüllt | Keiner |
| Dokumentation | ◐ Teilweise | Mittel |
| Human Oversight | ✓ Erfüllt | Gering |

### 2.3 NIS2-Konformität

| Bereich | Bewertung | Handlungsbedarf |
|---------|-----------|-----------------|
| Risikomanagement | ✓ Erfüllt | Gering |
| Incident Reporting | ◐ Teilweise | Hoch |
| Supply Chain | ○ Nicht erfüllt | Kritisch |

## 3. Empfehlungen

### Kritisch (sofort)
1. Supply-Chain-Risikomanagement implementieren
2. Incident-Reporting-Prozess etablieren

### Hoch (< 3 Monate)
3. Transparenzdokumentation vervollständigen
4. Betroffenenrechte-Portal optimieren

### Mittel (< 6 Monate)
5. AI Act Dokumentation erweitern
6. Schulungsmaßnahmen durchführen

## 4. Fazit

Das System zeigt einen guten Compliance-Stand mit klar definierten Verbesserungsbereichen. Bei Umsetzung der Empfehlungen ist eine vollständige Konformität erreichbar.

---
*Erstellt: [Datum]*
*Gutachter: [Name]*
*Version: 1.0*
`
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}
