/**
 * Drafting Engine - Type Definitions
 *
 * Typen fuer die 4 Agent-Rollen: Explain, Ask, Draft, Validate
 * Die Drafting Engine erweitert den Compliance Advisor um aktive Dokumententwurfs-
 * und Validierungsfaehigkeiten, stets unter Beachtung der deterministischen Scope-Engine.
 */

import type {
  ComplianceDepthLevel,
  ComplianceScores,
  ScopeDecision,
  ScopeDocumentType,
  ScopeGap,
  RequiredDocument,
  RiskFlag,
  DocumentDepthRequirement,
  ScopeProfilingQuestion,
} from '../compliance-scope-types'
import type { CompanyProfile } from '../types'

// ============================================================================
// Agent Mode
// ============================================================================

/** Die 4 Agent-Rollen */
export type AgentMode = 'explain' | 'ask' | 'draft' | 'validate'

/** Confidence-Score fuer Intent-Erkennung */
export interface IntentClassification {
  mode: AgentMode
  confidence: number
  matchedPatterns: string[]
  /** Falls Draft oder Validate: erkannter Dokumenttyp */
  detectedDocumentType?: ScopeDocumentType
  /** Vorgeschlagene Antwort fuer Redirect-Szenarien (z.B. Document Generator) */
  suggestedResponse?: string
}

// ============================================================================
// Draft Context (fuer Draft-Mode)
// ============================================================================

/** Projizierter State fuer Draft-Operationen (~1500 Tokens) */
export interface DraftContext {
  /** Scope-Entscheidung (Level, Scores, Hard Triggers) */
  decisions: {
    level: ComplianceDepthLevel
    scores: ComplianceScores
    hardTriggers: Array<{ id: string; label: string; legalReference: string }>
    requiredDocuments: Array<{
      documentType: ScopeDocumentType
      depth: string
      detailItems: string[]
    }>
  }
  /** Firmenprofil-Auszug */
  companyProfile: {
    name: string
    industry: string
    employeeCount: number
    businessModel: string
    isPublicSector: boolean
    dataProtectionOfficer?: { name: string; email: string }
  }
  /** Constraints aus der Scope-Engine */
  constraints: {
    depthRequirements: DocumentDepthRequirement
    riskFlags: Array<{ severity: string; title: string; recommendation: string }>
    boundaries: string[]
  }
  /** Optional: bestehende Dokumentdaten aus dem SDK-State */
  existingDocumentData?: Record<string, unknown>
}

// ============================================================================
// Gap Context (fuer Ask-Mode)
// ============================================================================

/** Projizierter State fuer Ask-Operationen (~600 Tokens) */
export interface GapContext {
  /** Noch unbeantwortete Fragen aus dem Scope-Profiling */
  unansweredQuestions: Array<{
    id: string
    question: string
    type: string
    blockId: string
  }>
  /** Identifizierte Luecken */
  gaps: Array<{
    id: string
    severity: string
    title: string
    description: string
    relatedDocuments: ScopeDocumentType[]
  }>
  /** Fehlende Pflichtdokumente */
  missingDocuments: Array<{
    documentType: ScopeDocumentType
    label: string
    depth: string
    estimatedEffort: string
  }>
}

// ============================================================================
// Validation Context (fuer Validate-Mode)
// ============================================================================

/** Projizierter State fuer Validate-Operationen (~2000 Tokens) */
export interface ValidationContext {
  /** Zu validierende Dokumente */
  documents: Array<{
    type: ScopeDocumentType
    /** Zusammenfassung/Auszug des Inhalts */
    contentSummary: string
    /** Strukturierte Daten falls vorhanden */
    structuredData?: Record<string, unknown>
  }>
  /** Cross-Referenzen zwischen Dokumenten */
  crossReferences: {
    /** VVT Kategorien (Verarbeitungstaetigkeiten) */
    vvtCategories: string[]
    /** DSFA Risiken */
    dsfaRisks: string[]
    /** TOM Controls */
    tomControls: string[]
    /** Loeschfristen-Kategorien */
    retentionCategories: string[]
  }
  /** Scope-Level fuer Tiefenpruefung */
  scopeLevel: ComplianceDepthLevel
  /** Relevante Depth-Requirements */
  depthRequirements: Record<ScopeDocumentType, DocumentDepthRequirement>
}

// ============================================================================
// Validation Result
// ============================================================================

export type ValidationSeverity = 'error' | 'warning' | 'suggestion'

export interface ValidationFinding {
  id: string
  severity: ValidationSeverity
  category: 'scope_violation' | 'inconsistency' | 'missing_content' | 'depth_mismatch' | 'cross_reference'
  title: string
  description: string
  /** Betroffenes Dokument */
  documentType: ScopeDocumentType
  /** Optional: Referenz zu anderem Dokument */
  crossReferenceType?: ScopeDocumentType
  /** Rechtsgrundlage falls relevant */
  legalReference?: string
  /** Vorschlag zur Behebung */
  suggestion?: string
  /** Kann automatisch uebernommen werden */
  autoFixable?: boolean
}

export interface ValidationResult {
  passed: boolean
  timestamp: string
  scopeLevel: ComplianceDepthLevel
  errors: ValidationFinding[]
  warnings: ValidationFinding[]
  suggestions: ValidationFinding[]
}

// ============================================================================
// Draft Session
// ============================================================================

export interface DraftRevision {
  id: string
  content: string
  sections: DraftSection[]
  createdAt: string
  instruction?: string
}

export interface DraftSection {
  id: string
  title: string
  content: string
  /** Mapping zum Dokumentschema (z.B. VVT-Feld) */
  schemaField?: string
}

export interface DraftSession {
  id: string
  mode: AgentMode
  documentType: ScopeDocumentType
  /** Aktueller Draft-Inhalt */
  currentDraft: DraftRevision | null
  /** Alle bisherigen Revisionen */
  revisions: DraftRevision[]
  /** Validierungszustand */
  validationState: ValidationResult | null
  /** Constraint-Check Ergebnis */
  constraintCheck: ConstraintCheckResult | null
  createdAt: string
  updatedAt: string
}

// ============================================================================
// Constraint Check (Hard Gate)
// ============================================================================

export interface ConstraintCheckResult {
  /** Darf der Draft erstellt werden? */
  allowed: boolean
  /** Verletzungen die den Draft blockieren */
  violations: string[]
  /** Anpassungen die vorgenommen werden sollten */
  adjustments: string[]
  /** Gepruefte Regeln */
  checkedRules: string[]
}

// ============================================================================
// Chat / API Types
// ============================================================================

export interface DraftingChatMessage {
  role: 'user' | 'assistant' | 'system'
  content: string
  /** Metadata fuer Agent-Nachrichten */
  metadata?: {
    mode: AgentMode
    documentType?: ScopeDocumentType
    hasDraft?: boolean
    hasValidation?: boolean
  }
}

export interface DraftingChatRequest {
  message: string
  history: DraftingChatMessage[]
  sdkStateProjection: DraftContext | GapContext | ValidationContext
  mode?: AgentMode
  documentType?: ScopeDocumentType
}

export interface DraftRequest {
  documentType: ScopeDocumentType
  draftContext: DraftContext
  instructions?: string
  existingDraft?: DraftRevision
}

export interface DraftResponse {
  draft: DraftRevision
  constraintCheck: ConstraintCheckResult
  tokensUsed: number
}

export interface ValidateRequest {
  documentType: ScopeDocumentType
  draftContent: string
  validationContext: ValidationContext
}

// ============================================================================
// Feature Flag
// ============================================================================

export interface DraftingEngineConfig {
  /** Feature-Flag: Drafting Engine aktiviert */
  enableDraftingEngine: boolean
  /** Verfuegbare Modi (fuer schrittweises Rollout) */
  enabledModes: AgentMode[]
  /** Max Token-Budget fuer State-Projection */
  maxProjectionTokens: number
}

export const DEFAULT_DRAFTING_ENGINE_CONFIG: DraftingEngineConfig = {
  enableDraftingEngine: false,
  enabledModes: ['explain'],
  maxProjectionTokens: 4096,
}
