package api

import (
	"net/http"

	"github.com/breakpilot/ai-compliance-sdk/internal/llm"
	"github.com/breakpilot/ai-compliance-sdk/internal/rag"
	"github.com/gin-gonic/gin"
)

// GenerateHandler handles document generation requests
type GenerateHandler struct {
	llmService *llm.Service
	ragService *rag.Service
}

// NewGenerateHandler creates a new generate handler
func NewGenerateHandler(llmService *llm.Service, ragService *rag.Service) *GenerateHandler {
	return &GenerateHandler{
		llmService: llmService,
		ragService: ragService,
	}
}

// GenerateDSFA generates a Data Protection Impact Assessment
func (h *GenerateHandler) GenerateDSFA(c *gin.Context) {
	var req GenerateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		ErrorResponse(c, http.StatusBadRequest, err.Error(), "INVALID_REQUEST")
		return
	}

	// Get RAG context if requested
	var ragSources []SearchResult
	if req.UseRAG && h.ragService != nil {
		query := req.RAGQuery
		if query == "" {
			query = "DSFA Datenschutz-Folgenabschätzung Anforderungen"
		}
		results, _ := h.ragService.Search(c.Request.Context(), query, 5, "legal_corpus", "regulation:DSGVO")
		for _, r := range results {
			ragSources = append(ragSources, SearchResult{
				ID:       r.ID,
				Content:  r.Content,
				Source:   r.Source,
				Score:    r.Score,
				Metadata: r.Metadata,
			})
		}
	}

	// Generate DSFA content
	content, tokensUsed, err := h.llmService.GenerateDSFA(c.Request.Context(), req.Context, ragSources)
	if err != nil {
		// Return mock content if LLM fails
		content = h.getMockDSFA(req.Context)
		tokensUsed = 0
	}

	SuccessResponse(c, GenerateResponse{
		Content:     content,
		GeneratedAt: now(),
		Model:       h.llmService.GetModel(),
		TokensUsed:  tokensUsed,
		RAGSources:  ragSources,
		Confidence:  0.85,
	})
}

// GenerateTOM generates Technical and Organizational Measures
func (h *GenerateHandler) GenerateTOM(c *gin.Context) {
	var req GenerateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		ErrorResponse(c, http.StatusBadRequest, err.Error(), "INVALID_REQUEST")
		return
	}

	// Get RAG context if requested
	var ragSources []SearchResult
	if req.UseRAG && h.ragService != nil {
		query := req.RAGQuery
		if query == "" {
			query = "technische organisatorische Maßnahmen TOM Datenschutz"
		}
		results, _ := h.ragService.Search(c.Request.Context(), query, 5, "legal_corpus", "")
		for _, r := range results {
			ragSources = append(ragSources, SearchResult{
				ID:       r.ID,
				Content:  r.Content,
				Source:   r.Source,
				Score:    r.Score,
				Metadata: r.Metadata,
			})
		}
	}

	// Generate TOM content
	content, tokensUsed, err := h.llmService.GenerateTOM(c.Request.Context(), req.Context, ragSources)
	if err != nil {
		content = h.getMockTOM(req.Context)
		tokensUsed = 0
	}

	SuccessResponse(c, GenerateResponse{
		Content:     content,
		GeneratedAt: now(),
		Model:       h.llmService.GetModel(),
		TokensUsed:  tokensUsed,
		RAGSources:  ragSources,
		Confidence:  0.82,
	})
}

// GenerateVVT generates Processing Activity Register
func (h *GenerateHandler) GenerateVVT(c *gin.Context) {
	var req GenerateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		ErrorResponse(c, http.StatusBadRequest, err.Error(), "INVALID_REQUEST")
		return
	}

	// Get RAG context if requested
	var ragSources []SearchResult
	if req.UseRAG && h.ragService != nil {
		query := req.RAGQuery
		if query == "" {
			query = "Verarbeitungsverzeichnis Art. 30 DSGVO"
		}
		results, _ := h.ragService.Search(c.Request.Context(), query, 5, "legal_corpus", "regulation:DSGVO")
		for _, r := range results {
			ragSources = append(ragSources, SearchResult{
				ID:       r.ID,
				Content:  r.Content,
				Source:   r.Source,
				Score:    r.Score,
				Metadata: r.Metadata,
			})
		}
	}

	// Generate VVT content
	content, tokensUsed, err := h.llmService.GenerateVVT(c.Request.Context(), req.Context, ragSources)
	if err != nil {
		content = h.getMockVVT(req.Context)
		tokensUsed = 0
	}

	SuccessResponse(c, GenerateResponse{
		Content:     content,
		GeneratedAt: now(),
		Model:       h.llmService.GetModel(),
		TokensUsed:  tokensUsed,
		RAGSources:  ragSources,
		Confidence:  0.88,
	})
}

// GenerateGutachten generates an expert opinion/assessment
func (h *GenerateHandler) GenerateGutachten(c *gin.Context) {
	var req GenerateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		ErrorResponse(c, http.StatusBadRequest, err.Error(), "INVALID_REQUEST")
		return
	}

	// Get RAG context if requested
	var ragSources []SearchResult
	if req.UseRAG && h.ragService != nil {
		query := req.RAGQuery
		if query == "" {
			query = "Compliance Bewertung Gutachten"
		}
		results, _ := h.ragService.Search(c.Request.Context(), query, 5, "legal_corpus", "")
		for _, r := range results {
			ragSources = append(ragSources, SearchResult{
				ID:       r.ID,
				Content:  r.Content,
				Source:   r.Source,
				Score:    r.Score,
				Metadata: r.Metadata,
			})
		}
	}

	// Generate Gutachten content
	content, tokensUsed, err := h.llmService.GenerateGutachten(c.Request.Context(), req.Context, ragSources)
	if err != nil {
		content = h.getMockGutachten(req.Context)
		tokensUsed = 0
	}

	SuccessResponse(c, GenerateResponse{
		Content:     content,
		GeneratedAt: now(),
		Model:       h.llmService.GetModel(),
		TokensUsed:  tokensUsed,
		RAGSources:  ragSources,
		Confidence:  0.80,
	})
}

// Mock content generators for when LLM is not available
func (h *GenerateHandler) getMockDSFA(context map[string]interface{}) string {
	return `# Datenschutz-Folgenabschätzung (DSFA)

## 1. Systematische Beschreibung der Verarbeitungsvorgänge

Die geplante Verarbeitung umfasst die Analyse von Kundendaten mittels KI-gestützter Systeme zur Verbesserung der Servicequalität und Personalisierung von Angeboten.

### Verarbeitungszwecke:
- Kundensegmentierung und Analyse des Nutzerverhaltens
- Personalisierte Empfehlungen
- Optimierung von Geschäftsprozessen

### Rechtsgrundlage:
- Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse)
- Alternativ: Art. 6 Abs. 1 lit. a DSGVO (Einwilligung)

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

Die Verarbeitung ist für die genannten Zwecke erforderlich und verhältnismäßig. Alternative Maßnahmen wurden geprüft, jedoch sind diese weniger effektiv.

## 3. Risikobewertung

### Identifizierte Risiken:
| Risiko | Eintrittswahrscheinlichkeit | Schwere | Maßnahmen |
|--------|---------------------------|---------|-----------|
| Unbefugter Zugriff | Mittel | Hoch | Verschlüsselung, Zugangskontrolle |
| Profilbildung | Hoch | Mittel | Anonymisierung, Einwilligung |
| Datenverlust | Niedrig | Hoch | Backup, Redundanz |

## 4. Maßnahmen zur Risikominderung

- Implementierung von Verschlüsselung (AES-256)
- Strenge Zugriffskontrollen nach dem Least-Privilege-Prinzip
- Regelmäßige Datenschutz-Schulungen
- Audit-Logging aller Zugriffe

## 5. Stellungnahme des Datenschutzbeauftragten

[Hier Stellungnahme einfügen]

## 6. Dokumentation der Konsultation

Erstellt am: ${new Date().toISOString()}
Status: ENTWURF
`
}

func (h *GenerateHandler) getMockTOM(context map[string]interface{}) string {
	return `# Technische und Organisatorische Maßnahmen (TOMs)

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

### 1.1 Zutrittskontrolle
- Alarmanlage
- Chipkarten-/Transponder-System
- Videoüberwachung der Eingänge
- Besuchererfassung und -begleitung

### 1.2 Zugangskontrolle
- Passwort-Richtlinie (min. 12 Zeichen, Komplexitätsanforderungen)
- Multi-Faktor-Authentifizierung
- Automatische Bildschirmsperre
- VPN für Remote-Zugriffe

### 1.3 Zugriffskontrolle
- Rollenbasiertes Berechtigungskonzept
- Need-to-know-Prinzip
- Regelmäßige Überprüfung der Zugriffsrechte
- Protokollierung aller Zugriffe

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

### 2.1 Weitergabekontrolle
- Transportverschlüsselung (TLS 1.3)
- Ende-zu-Ende-Verschlüsselung für sensible Daten
- Sichere E-Mail-Kommunikation (S/MIME)

### 2.2 Eingabekontrolle
- Protokollierung aller Datenänderungen
- Benutzeridentifikation bei Änderungen
- Audit-Trail für alle Transaktionen

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

### 3.1 Verfügbarkeitskontrolle
- Tägliche Backups
- Georedundante Datenspeicherung
- USV-Anlage
- Notfallplan

### 3.2 Wiederherstellung
- Dokumentierte Wiederherstellungsverfahren
- Regelmäßige Backup-Tests
- Maximale Wiederherstellungszeit: 4 Stunden

## 4. Belastbarkeit (Art. 32 Abs. 1 lit. b DSGVO)

- Lastverteilung
- DDoS-Schutz
- Skalierbare Infrastruktur
`
}

func (h *GenerateHandler) getMockVVT(context map[string]interface{}) string {
	return `# Verzeichnis der Verarbeitungstätigkeiten (Art. 30 DSGVO)

## Verarbeitungstätigkeit: Kundenanalyse und Personalisierung

### Angaben nach Art. 30 Abs. 1 DSGVO:

| Feld | Inhalt |
|------|--------|
| **Name des Verantwortlichen** | [Unternehmensname] |
| **Kontaktdaten** | [Adresse, E-Mail, Telefon] |
| **Datenschutzbeauftragter** | [Name, Kontakt] |
| **Zweck der Verarbeitung** | Kundensegmentierung, Personalisierung, Serviceoptimierung |
| **Kategorien betroffener Personen** | Kunden, Interessenten |
| **Kategorien personenbezogener Daten** | Kontaktdaten, Nutzungsdaten, Transaktionsdaten |
| **Kategorien von Empfängern** | Interne Abteilungen, IT-Dienstleister |
| **Drittlandtransfer** | Nein / Ja (mit Angabe der Garantien) |
| **Löschfristen** | 3 Jahre nach letzter Aktivität |
| **TOM-Referenz** | Siehe TOM-Dokument v1.0 |

### Rechtsgrundlage:
Art. 6 Abs. 1 lit. f DSGVO - Berechtigtes Interesse

### Dokumentation:
- Erstellt: ${new Date().toISOString()}
- Letzte Aktualisierung: ${new Date().toISOString()}
- Version: 1.0
`
}

func (h *GenerateHandler) getMockGutachten(context map[string]interface{}) string {
	return `# Compliance-Gutachten

## Zusammenfassung

Das geprüfte KI-System erfüllt die wesentlichen Anforderungen der DSGVO und des AI Acts. Es wurden jedoch Optimierungspotenziale identifiziert.

## Prüfungsumfang

- DSGVO-Konformität
- AI Act Compliance
- NIS2-Anforderungen

## Bewertungsergebnis

| Bereich | Bewertung | Handlungsbedarf |
|---------|-----------|-----------------|
| Datenschutz | Gut | Gering |
| KI-Risikoeinstufung | Erfüllt | Keiner |
| Cybersicherheit | Befriedigend | Mittel |

## Empfehlungen

1. Verstärkung der Dokumentation
2. Regelmäßige Audits einplanen
3. Schulungsmaßnahmen erweitern

Erstellt am: ${new Date().toISOString()}
`
}
