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

import type { DSFARiskLevel } from './enums-constants'
import type { DSFAConsultationRequirement, DSFAReviewTrigger, DSFAReviewSchedule } from './sub-types'
import type { DSFAAuthorityResource } from './authority-resources'
import { DSFA_AUTHORITY_RESOURCES } from './authority-resources'
import { WP248_CRITERIA } from './wp248-criteria'
import { ART35_ABS3_CASES, AI_DSFA_TRIGGERS } from './dsk-references'

/**
 * 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,
      })),
    },
  ]
}
