/**
 * Narrative Tags — Deterministische Score-zu-Sprache Ableitung
 *
 * Der Data Layer erzeugt aus berechneten Scores sprachliche Tags.
 * Das LLM darf NUR diese Tags verwenden — niemals echte Scores oder Prozentwerte.
 *
 * Alle Funktionen sind 100% deterministisch: gleiche Eingabe = gleiche Ausgabe.
 */

// ============================================================================
// Types
// ============================================================================

export interface NarrativeTags {
  /** Sprachliche Risiko-Einschaetzung */
  riskSummary: 'niedrig' | 'moderat' | 'erhoht'
  /** Reifegrad der bestehenden Massnahmen */
  maturity: 'ausbaufahig' | 'solide' | 'hoch'
  /** Handlungsprioritaet */
  priority: 'kurzfristig' | 'mittelfristig' | 'langfristig'
  /** Abdeckungsgrad der Controls */
  coverageLevel: 'grundlegend' | 'umfassend' | 'vollstaendig'
  /** Dringlichkeit */
  urgency: 'planbar' | 'zeitnah' | 'dringend'
}

/** Eingabe-Scores fuer die Tag-Ableitung */
export interface NarrativeTagScores {
  /** Gesamt-Risikoscore (0-100) */
  overallRisk: number
  /** Reife-Score (0-100) */
  maturityScore: number
  /** Anzahl identifizierter Luecken */
  gapCount: number
  /** Anzahl kritischer Luecken */
  criticalGaps: number
  /** Control-Abdeckung (0-100) */
  controlCoverage: number
  /** Anzahl kritischer Findings */
  criticalFindings: number
  /** Anzahl hoher Findings */
  highFindings: number
}

// ============================================================================
// Tag Derivation (deterministisch)
// ============================================================================

/**
 * Leitet aus numerischen Scores sprachliche Narrative Tags ab.
 * 100% deterministisch — gleiche Scores = gleiche Tags.
 */
export function deriveNarrativeTags(scores: NarrativeTagScores): NarrativeTags {
  return {
    riskSummary:
      scores.overallRisk <= 30 ? 'niedrig' :
      scores.overallRisk <= 65 ? 'moderat' : 'erhoht',

    maturity:
      scores.maturityScore <= 40 ? 'ausbaufahig' :
      scores.maturityScore <= 75 ? 'solide' : 'hoch',

    priority:
      scores.gapCount === 0 ? 'langfristig' :
      scores.criticalGaps > 0 ? 'kurzfristig' : 'mittelfristig',

    coverageLevel:
      scores.controlCoverage <= 50 ? 'grundlegend' :
      scores.controlCoverage <= 80 ? 'umfassend' : 'vollstaendig',

    urgency:
      scores.criticalFindings > 0 ? 'dringend' :
      scores.highFindings > 0 ? 'zeitnah' : 'planbar',
  }
}

/**
 * Extrahiert NarrativeTagScores aus einem DraftContext.
 * Falls Werte fehlen, werden sichere Defaults (konservativ) verwendet.
 */
export function extractScoresFromDraftContext(context: {
  decisions: {
    scores: {
      risk_score: number
      complexity_score: number
      assurance_score: number
      composite_score: number
    }
  }
  constraints: {
    riskFlags: Array<{ severity: string }>
  }
}): NarrativeTagScores {
  const { scores } = context.decisions
  const riskFlags = context.constraints.riskFlags

  const criticalFindings = riskFlags.filter(f => f.severity === 'critical').length
  const highFindings = riskFlags.filter(f => f.severity === 'high').length

  return {
    overallRisk: scores.risk_score ?? 50,
    maturityScore: scores.assurance_score ?? 50,
    gapCount: riskFlags.length,
    criticalGaps: criticalFindings,
    controlCoverage: scores.assurance_score ?? 50,
    criticalFindings,
    highFindings,
  }
}

// ============================================================================
// Serialization
// ============================================================================

/**
 * Serialisiert NarrativeTags fuer den LLM-Prompt.
 */
export function narrativeTagsToPromptString(tags: NarrativeTags): string {
  return [
    `- Risikoprofil: ${tags.riskSummary}`,
    `- Reifegrad: ${tags.maturity}`,
    `- Prioritaet: ${tags.priority}`,
    `- Abdeckungsgrad: ${tags.coverageLevel}`,
    `- Dringlichkeit: ${tags.urgency}`,
  ].join('\n')
}

/**
 * Gibt die erlaubten Tag-Werte als flache Liste zurueck (fuer Validierung).
 */
export function getAllAllowedTagValues(): string[] {
  return [
    'niedrig', 'moderat', 'erhoht',
    'ausbaufahig', 'solide', 'hoch',
    'kurzfristig', 'mittelfristig', 'langfristig',
    'grundlegend', 'umfassend', 'vollstaendig',
    'planbar', 'zeitnah', 'dringend',
  ]
}
