/**
 * DSFA Risk Helpers - Risk matrix, calculation functions, and utility helpers
 *
 * Risk matrix cells, risk level calculation, WP248 checks,
 * Art. 36 consultation, authority lookups, review helpers, AI triggers.
 */

import type { DSFARiskLevel } from './types-core'
import type { DSFAConsultationRequirement, DSFAReviewTrigger, DSFAReviewSchedule } from './types-assessment'
import { DSFA_AUTHORITY_RESOURCES } from './types-authorities'
import type { DSFAAuthorityResource } from './types-authorities'
import { WP248_CRITERIA, ART35_ABS3_CASES, AI_DSFA_TRIGGERS } from './types-wp248'

// =============================================================================
// RISK MATRIX HELPERS
// =============================================================================

export interface RiskMatrixCell {
  likelihood: 'low' | 'medium' | 'high'
  impact: 'low' | 'medium' | 'high'
  level: DSFARiskLevel
  score: number
}

export const RISK_MATRIX: RiskMatrixCell[] = [
  // Low likelihood
  { likelihood: 'low', impact: 'low', level: 'low', score: 10 },
  { likelihood: 'low', impact: 'medium', level: 'low', score: 20 },
  { likelihood: 'low', impact: 'high', level: 'medium', score: 40 },
  // Medium likelihood
  { likelihood: 'medium', impact: 'low', level: 'low', score: 20 },
  { likelihood: 'medium', impact: 'medium', level: 'medium', score: 50 },
  { likelihood: 'medium', impact: 'high', level: 'high', score: 70 },
  // High likelihood
  { likelihood: 'high', impact: 'low', level: 'medium', score: 40 },
  { likelihood: 'high', impact: 'medium', level: 'high', score: 70 },
  { likelihood: 'high', impact: 'high', level: 'very_high', score: 90 },
]

export function calculateRiskLevel(
  likelihood: 'low' | 'medium' | 'high',
  impact: 'low' | 'medium' | 'high'
): { level: DSFARiskLevel; score: number } {
  const cell = RISK_MATRIX.find(c => c.likelihood === likelihood && c.impact === impact)
  return cell ? { level: cell.level, score: cell.score } : { level: 'medium', score: 50 }
}

// =============================================================================
// HELPER FUNCTIONS
// =============================================================================

/**
 * Prüft anhand der WP248-Kriterien, ob eine DSFA erforderlich ist.
 * Regel: Bei >= 2 erfüllten Kriterien ist DSFA in den meisten Fällen erforderlich.
 * @param criteriaIds Array der erfüllten Kriterien-IDs (z.B. ['K1', 'K4'])
 * @returns Objekt mit Ergebnis und Begründung
 */
export function checkDSFARequiredByWP248(criteriaIds: string[]): {
  required: boolean
  confidence: 'definite' | 'likely' | 'possible' | 'unlikely'
  reason: string
} {
  const count = criteriaIds.length

  if (count >= 2) {
    return {
      required: true,
      confidence: 'definite',
      reason: `${count} WP248-Kriterien erfüllt (>= 2). DSFA ist in den meisten Fällen erforderlich.`,
    }
  }

  if (count === 1) {
    return {
      required: false,
      confidence: 'possible',
      reason: '1 WP248-Kriterium erfüllt. DSFA kann je nach Risiko dennoch erforderlich sein. Einzelfallprüfung empfohlen.',
    }
  }

  return {
    required: false,
    confidence: 'unlikely',
    reason: 'Keine WP248-Kriterien erfüllt. DSFA wahrscheinlich nicht erforderlich, sofern kein Art. 35 Abs. 3 Fall vorliegt.',
  }
}

/**
 * Prüft, ob eine Konsultation der Aufsichtsbehörde gem. Art. 36 DSGVO erforderlich ist.
 * Erforderlich wenn: Hohes Restrisiko trotz geplanter Maßnahmen.
 */
export function checkArt36ConsultationRequired(
  residualRiskLevel: DSFARiskLevel,
  mitigationsImplemented: boolean
): DSFAConsultationRequirement {
  const highResidual = residualRiskLevel === 'high' || residualRiskLevel === 'very_high'
  const consultationRequired = highResidual && mitigationsImplemented

  return {
    high_residual_risk: highResidual,
    consultation_required: consultationRequired,
    consultation_reason: consultationRequired
      ? 'Trotz geplanter Maßnahmen verbleibt ein hohes Restrisiko. Gem. Art. 36 Abs. 1 DSGVO ist vor der Verarbeitung die Aufsichtsbehörde zu konsultieren.'
      : highResidual
        ? 'Hohes Restrisiko festgestellt, aber Maßnahmen noch nicht vollständig umgesetzt.'
        : undefined,
    authority_notified: false,
    waiting_period_observed: false,
  }
}

/**
 * Gibt die zuständige Aufsichtsbehörde für ein Bundesland zurück.
 */
export function getAuthorityResource(stateId: string): DSFAAuthorityResource | undefined {
  return DSFA_AUTHORITY_RESOURCES.find(r => r.id === stateId)
}

/**
 * Gibt alle Bundesländer als Auswahlliste zurück.
 */
export function getFederalStateOptions(): Array<{ value: string; label: string }> {
  return DSFA_AUTHORITY_RESOURCES.map(r => ({
    value: r.id,
    label: r.state,
  }))
}

/**
 * Prüft, ob ein Review-Trigger eine Aktualisierung der DSFA erfordert.
 */
export function checkReviewRequired(triggers: DSFAReviewTrigger[]): {
  required: boolean
  pendingTriggers: DSFAReviewTrigger[]
} {
  const pendingTriggers = triggers.filter(t => t.review_required && !t.review_completed)
  return {
    required: pendingTriggers.length > 0,
    pendingTriggers,
  }
}

/**
 * Berechnet das nächste Review-Datum basierend auf dem Schedule.
 */
export function calculateNextReviewDate(schedule: DSFAReviewSchedule): Date {
  const lastReview = schedule.last_review_date
    ? new Date(schedule.last_review_date)
    : new Date()

  const nextReview = new Date(lastReview)
  nextReview.setMonth(nextReview.getMonth() + schedule.review_frequency_months)
  return nextReview
}

/**
 * Prüft, ob KI-spezifische DSFA-Trigger erfüllt sind.
 */
export function checkAIDSFATriggers(
  aiTriggerIds: string[]
): { triggered: boolean; triggers: typeof AI_DSFA_TRIGGERS } {
  const triggered = AI_DSFA_TRIGGERS.filter(t => aiTriggerIds.includes(t.id))
  return {
    triggered: triggered.length > 0,
    triggers: triggered,
  }
}

/**
 * Generiert eine Checkliste für die Schwellwertanalyse.
 */
export function generateThresholdAnalysisChecklist(): Array<{
  category: string
  items: Array<{ id: string; label: string; description: string }>
}> {
  return [
    {
      category: 'WP248 Kriterien (Art.-29-Datenschutzgruppe)',
      items: WP248_CRITERIA.map(c => ({
        id: c.id,
        label: `${c.code}: ${c.title}`,
        description: c.description,
      })),
    },
    {
      category: 'Art. 35 Abs. 3 DSGVO Regelbeispiele',
      items: ART35_ABS3_CASES.map(c => ({
        id: c.id,
        label: `lit. ${c.lit}: ${c.title}`,
        description: c.description,
      })),
    },
    {
      category: 'KI-spezifische Trigger (Deutsche DSFA-Liste)',
      items: AI_DSFA_TRIGGERS.map(t => ({
        id: t.id,
        label: t.title,
        description: t.description,
      })),
    },
  ]
}
