/**
 * Data Retention Configuration
 *
 * Zentrale Konfiguration für Daten-Aufbewahrungsfristen.
 * Alle Werte in Tagen.
 */

export interface RetentionPolicy {
  /** Eindeutiger Name für Logging */
  name: string
  /** Collection-Slug */
  collection: string
  /** Aufbewahrungsfrist in Tagen */
  retentionDays: number
  /** Feld für Datum-Vergleich (Standard: createdAt) */
  dateField?: string
  /** Batch-Größe für Löschung */
  batchSize?: number
  /** Beschreibung für Dokumentation */
  description: string
}

/**
 * Retention Policies für verschiedene Collections
 *
 * Die Werte können via Umgebungsvariablen überschrieben werden.
 */
export const retentionPolicies: RetentionPolicy[] = [
  {
    name: 'email-logs',
    collection: 'email-logs',
    retentionDays: parseInt(process.env.RETENTION_EMAIL_LOGS_DAYS || '90', 10),
    dateField: 'createdAt',
    batchSize: 100,
    description: 'E-Mail-Logs älter als X Tage löschen',
  },
  {
    name: 'audit-logs',
    collection: 'audit-logs',
    retentionDays: parseInt(process.env.RETENTION_AUDIT_LOGS_DAYS || '90', 10),
    dateField: 'createdAt',
    batchSize: 100,
    description: 'Audit-Logs älter als X Tage löschen',
  },
  {
    name: 'consent-logs',
    collection: 'consent-logs',
    retentionDays: parseInt(process.env.RETENTION_CONSENT_LOGS_DAYS || '1095', 10), // 3 Jahre
    dateField: 'expiresAt', // ConsentLogs haben expiresAt statt createdAt-basierter Retention
    batchSize: 50,
    description: 'Consent-Logs nach Ablaufdatum löschen (DSGVO: 3 Jahre)',
  },
  // Monitoring Collections
  {
    name: 'monitoring-snapshots',
    collection: 'monitoring-snapshots',
    retentionDays: parseInt(process.env.RETENTION_MONITORING_SNAPSHOTS_DAYS || '7', 10),
    dateField: 'createdAt',
    batchSize: 500,
    description: 'Monitoring-Snapshots älter als X Tage löschen',
  },
  {
    name: 'monitoring-alert-history',
    collection: 'monitoring-alert-history',
    retentionDays: parseInt(process.env.RETENTION_MONITORING_ALERTS_DAYS || '90', 10),
    dateField: 'createdAt',
    batchSize: 100,
    description: 'Alert-History älter als X Tage löschen',
  },
  {
    name: 'monitoring-logs',
    collection: 'monitoring-logs',
    retentionDays: parseInt(process.env.RETENTION_MONITORING_LOGS_DAYS || '30', 10),
    dateField: 'createdAt',
    batchSize: 200,
    description: 'Monitoring-Logs älter als X Tage löschen',
  },
]

/**
 * Media Orphan Cleanup Konfiguration
 */
export const mediaOrphanConfig = {
  /** Mindestalter in Tagen bevor ein Media als Orphan gilt */
  minAgeDays: parseInt(process.env.RETENTION_MEDIA_ORPHAN_MIN_AGE_DAYS || '30', 10),
  /** Batch-Größe für Löschung */
  batchSize: 50,
  /** Collections, die Media referenzieren können */
  referencingCollections: [
    'pages',
    'posts',
    'portfolios',
    'team',
    'services',
    'testimonials',
    'faqs',
    'tenants',
    'projects',
    'certifications',
    'bookings',
  ],
}

/**
 * Cron-Schedule für Retention Jobs
 * Default: Täglich um 03:00 Uhr
 */
export const retentionSchedule = {
  cron: process.env.RETENTION_CRON_SCHEDULE || '0 3 * * *',
  timezone: process.env.TZ || 'Europe/Berlin',
}

/**
 * Gibt die Retention Policy für eine bestimmte Collection zurück
 */
export function getRetentionPolicy(collectionSlug: string): RetentionPolicy | undefined {
  return retentionPolicies.find((p) => p.collection === collectionSlug)
}

/**
 * Berechnet das Cutoff-Datum basierend auf der Retention Policy
 */
export function getCutoffDate(retentionDays: number): Date {
  const cutoff = new Date()
  cutoff.setDate(cutoff.getDate() - retentionDays)
  cutoff.setHours(0, 0, 0, 0)
  return cutoff
}
