/**
 * Retention Period Catalog
 *
 * Standard GDPR/German-law retention periods and helper functions.
 * Split from legal-basis.ts for the 500 LOC hard cap.
 */

import type { LocalizedText } from '../types'

export interface RetentionPeriodInfo {
  id: string
  name: LocalizedText
  legalBasis: string
  duration: {
    value: number
    unit: 'DAYS' | 'MONTHS' | 'YEARS'
  }
  description: LocalizedText
  applicableTo: string[]
}

// ==========================================
// RETENTION PERIODS
// ==========================================

export const STANDARD_RETENTION_PERIODS: RetentionPeriodInfo[] = [
  // Handelsrechtliche Aufbewahrung
  {
    id: 'hgb-257',
    name: { de: 'Handelsbücher und Buchungsbelege', en: 'Commercial Books and Vouchers' },
    legalBasis: '§ 257 HGB',
    duration: { value: 10, unit: 'YEARS' },
    description: {
      de: 'Handelsbücher, Inventare, Eröffnungsbilanzen, Jahresabschlüsse, Lageberichte, Konzernabschlüsse, Buchungsbelege',
      en: 'Commercial books, inventories, opening balance sheets, annual financial statements, management reports, consolidated financial statements, accounting vouchers',
    },
    applicableTo: ['Buchhaltung', 'Jahresabschlüsse', 'Rechnungen', 'Verträge'],
  },
  {
    id: 'hgb-257-6',
    name: { de: 'Handels- und Geschäftsbriefe', en: 'Commercial and Business Correspondence' },
    legalBasis: '§ 257 Abs. 1 Nr. 2, 3 HGB',
    duration: { value: 6, unit: 'YEARS' },
    description: {
      de: 'Empfangene Handels- und Geschäftsbriefe, Wiedergaben der abgesandten Handels- und Geschäftsbriefe',
      en: 'Received commercial and business correspondence, copies of sent correspondence',
    },
    applicableTo: ['Geschäftskorrespondenz', 'Angebote', 'Auftragsbestätigungen'],
  },
  // Steuerrechtliche Aufbewahrung
  {
    id: 'ao-147',
    name: { de: 'Steuerrechtliche Unterlagen', en: 'Tax Documents' },
    legalBasis: '§ 147 AO',
    duration: { value: 10, unit: 'YEARS' },
    description: {
      de: 'Bücher und Aufzeichnungen, Inventare, Jahresabschlüsse, Buchungsbelege, steuerrelevante Unterlagen',
      en: 'Books and records, inventories, annual financial statements, accounting vouchers, tax-relevant documents',
    },
    applicableTo: ['Steuererklärungen', 'Buchhaltung', 'Belege'],
  },
  // Arbeitsrechtliche Aufbewahrung
  {
    id: 'arbeitsrecht-personal',
    name: { de: 'Personalunterlagen', en: 'Personnel Records' },
    legalBasis: 'Verschiedene (AGG, ArbZG, etc.)',
    duration: { value: 3, unit: 'YEARS' },
    description: {
      de: 'Personalakte nach Beendigung des Arbeitsverhältnisses (Regelverjährung)',
      en: 'Personnel file after termination of employment (standard limitation period)',
    },
    applicableTo: ['Personalakten', 'Arbeitsverträge', 'Zeugnisse'],
  },
  {
    id: 'arbzg',
    name: { de: 'Arbeitszeitaufzeichnungen', en: 'Working Time Records' },
    legalBasis: '§ 16 Abs. 2 ArbZG',
    duration: { value: 2, unit: 'YEARS' },
    description: {
      de: 'Aufzeichnungen über Arbeitszeiten, die über 8 Stunden hinausgehen',
      en: 'Records of working hours exceeding 8 hours',
    },
    applicableTo: ['Zeiterfassung', 'Überstunden'],
  },
  {
    id: 'lohnsteuer',
    name: { de: 'Lohnunterlagen', en: 'Payroll Documents' },
    legalBasis: '§ 41 EStG, § 28f SGB IV',
    duration: { value: 6, unit: 'YEARS' },
    description: {
      de: 'Lohnkonten und Unterlagen für den Lohnsteuerabzug',
      en: 'Payroll accounts and documents for wage tax deduction',
    },
    applicableTo: ['Lohnabrechnungen', 'Lohnsteuerbescheinigungen'],
  },
  {
    id: 'sozialversicherung',
    name: { de: 'Sozialversicherungsunterlagen', en: 'Social Security Documents' },
    legalBasis: '§ 28f SGB IV',
    duration: { value: 5, unit: 'YEARS' },
    description: {
      de: 'Unterlagen zum Gesamtsozialversicherungsbeitrag',
      en: 'Documents for total social security contributions',
    },
    applicableTo: ['Sozialversicherungsmeldungen', 'Beitragsnachweise'],
  },
  // Bewerberdaten
  {
    id: 'bewerbung',
    name: { de: 'Bewerbungsunterlagen', en: 'Application Documents' },
    legalBasis: '§ 15 Abs. 4 AGG',
    duration: { value: 6, unit: 'MONTHS' },
    description: {
      de: 'Bewerbungsunterlagen nach Absage (AGG-Frist)',
      en: 'Application documents after rejection (AGG deadline)',
    },
    applicableTo: ['Bewerbungen', 'Lebensläufe', 'Zeugnisse von Bewerbern'],
  },
  // Datenschutzrechtliche Fristen
  {
    id: 'einwilligung',
    name: { de: 'Einwilligungen', en: 'Consents' },
    legalBasis: 'Art. 7 Abs. 1 DSGVO',
    duration: { value: 3, unit: 'YEARS' },
    description: {
      de: 'Dokumentation der Einwilligung (Regelverjährung)',
      en: 'Documentation of consent (standard limitation period)',
    },
    applicableTo: ['Einwilligungsnachweise', 'Opt-in-Dokumentation'],
  },
  {
    id: 'videoüberwachung',
    name: { de: 'Videoüberwachung', en: 'Video Surveillance' },
    legalBasis: 'Verhältnismäßigkeit',
    duration: { value: 72, unit: 'DAYS' },
    description: {
      de: 'Videoaufnahmen (max. 72 Stunden, sofern kein Vorfall)',
      en: 'Video recordings (max. 72 hours, unless incident occurred)',
    },
    applicableTo: ['CCTV-Aufnahmen', 'Überwachungsvideos'],
  },
  // Löschung nach Vertrag
  {
    id: 'avv-loeschung',
    name: { de: 'AVV-Daten nach Vertragsende', en: 'DPA Data after Contract End' },
    legalBasis: 'Art. 28 Abs. 3 lit. g DSGVO',
    duration: { value: 30, unit: 'DAYS' },
    description: {
      de: 'Löschung oder Rückgabe aller personenbezogenen Daten nach Vertragsende',
      en: 'Deletion or return of all personal data after contract end',
    },
    applicableTo: ['Auftragsverarbeitung', 'Dienstleister-Daten'],
  },
]

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

/**
 * Get retention period by ID
 */
export function getRetentionPeriod(id: string): RetentionPeriodInfo | undefined {
  return STANDARD_RETENTION_PERIODS.find((rp) => rp.id === id)
}

/**
 * Get retention periods applicable to a category
 */
export function getRetentionPeriodsForCategory(category: string): RetentionPeriodInfo[] {
  return STANDARD_RETENTION_PERIODS.filter((rp) =>
    rp.applicableTo.some((a) => a.toLowerCase().includes(category.toLowerCase()))
  )
}

/**
 * Get longest applicable retention period
 */
export function getLongestRetentionPeriod(categories: string[]): RetentionPeriodInfo | undefined {
  const applicable = categories.flatMap((cat) => getRetentionPeriodsForCategory(cat))

  if (applicable.length === 0) return undefined

  return applicable.reduce((longest, current) => {
    const longestMonths = toMonths(longest.duration)
    const currentMonths = toMonths(current.duration)
    return currentMonths > longestMonths ? current : longest
  })
}

function toMonths(duration: { value: number; unit: 'DAYS' | 'MONTHS' | 'YEARS' }): number {
  switch (duration.unit) {
    case 'DAYS':
      return duration.value / 30
    case 'MONTHS':
      return duration.value
    case 'YEARS':
      return duration.value * 12
  }
}

/**
 * Format retention period for display
 */
export function formatRetentionPeriod(
  duration: { value: number; unit: 'DAYS' | 'MONTHS' | 'YEARS' },
  locale: 'de' | 'en' = 'de'
): string {
  const units = {
    de: { DAYS: 'Tage', MONTHS: 'Monate', YEARS: 'Jahre' },
    en: { DAYS: 'days', MONTHS: 'months', YEARS: 'years' },
  }

  return `${duration.value} ${units[locale][duration.unit]}`
}
