import type { CollectionConfig } from 'payload'
import { auditLogsAccess } from '../lib/access'

/**
 * AuditLogs Collection
 *
 * Protokolliert wichtige System-Aktionen für Compliance und Debugging:
 * - Admin-Logins
 * - Tenant-Änderungen
 * - User-Änderungen (Rollen, Berechtigungen)
 * - Kritische Konfigurationsänderungen
 * - Fehlgeschlagene Authentifizierungsversuche
 */
export const AuditLogs: CollectionConfig = {
  slug: 'audit-logs',
  admin: {
    useAsTitle: 'action',
    group: 'System',
    description: 'Protokoll wichtiger System-Aktionen',
    defaultColumns: ['action', 'entityType', 'user', 'severity', 'createdAt'],
  },
  access: auditLogsAccess,
  fields: [
    {
      name: 'action',
      type: 'select',
      required: true,
      options: [
        { label: 'Login erfolgreich', value: 'login_success' },
        { label: 'Login fehlgeschlagen', value: 'login_failed' },
        { label: 'Logout', value: 'logout' },
        { label: 'Passwort geändert', value: 'password_changed' },
        { label: 'Passwort zurückgesetzt', value: 'password_reset' },
        { label: 'Dokument erstellt', value: 'create' },
        { label: 'Dokument aktualisiert', value: 'update' },
        { label: 'Dokument gelöscht', value: 'delete' },
        { label: 'Konfiguration geändert', value: 'config_changed' },
        { label: 'E-Mail fehlgeschlagen', value: 'email_failed' },
        { label: 'Zugriff verweigert', value: 'access_denied' },
        { label: 'API Rate-Limit erreicht', value: 'rate_limit' },
      ],
      label: 'Aktion',
      admin: {
        readOnly: true,
      },
    },
    {
      name: 'severity',
      type: 'select',
      required: true,
      defaultValue: 'info',
      options: [
        { label: 'Info', value: 'info' },
        { label: 'Warnung', value: 'warning' },
        { label: 'Fehler', value: 'error' },
        { label: 'Kritisch', value: 'critical' },
      ],
      label: 'Schweregrad',
      admin: {
        readOnly: true,
      },
    },
    {
      name: 'entityType',
      type: 'select',
      options: [
        { label: 'Benutzer', value: 'users' },
        { label: 'Tenant', value: 'tenants' },
        { label: 'Seite', value: 'pages' },
        { label: 'Beitrag', value: 'posts' },
        { label: 'Medien', value: 'media' },
        { label: 'Formular', value: 'forms' },
        { label: 'E-Mail', value: 'email' },
        { label: 'Global', value: 'global' },
        { label: 'System', value: 'system' },
      ],
      label: 'Entitätstyp',
      admin: {
        readOnly: true,
      },
    },
    {
      name: 'entityId',
      type: 'text',
      label: 'Entitäts-ID',
      admin: {
        readOnly: true,
        description: 'ID des betroffenen Dokuments',
      },
    },
    {
      name: 'user',
      type: 'relationship',
      relationTo: 'users',
      label: 'Benutzer',
      admin: {
        readOnly: true,
        description: 'Benutzer, der die Aktion ausgeführt hat',
      },
    },
    {
      name: 'userEmail',
      type: 'text',
      label: 'Benutzer-E-Mail',
      admin: {
        readOnly: true,
        description: 'E-Mail zum Zeitpunkt der Aktion (für gelöschte User)',
      },
    },
    {
      name: 'tenant',
      type: 'relationship',
      relationTo: 'tenants',
      label: 'Tenant',
      admin: {
        readOnly: true,
        description: 'Betroffener Tenant (falls zutreffend)',
      },
    },
    {
      name: 'ipAddress',
      type: 'text',
      label: 'IP-Adresse',
      admin: {
        readOnly: true,
      },
    },
    {
      name: 'userAgent',
      type: 'text',
      label: 'User-Agent',
      admin: {
        readOnly: true,
      },
    },
    {
      name: 'description',
      type: 'textarea',
      label: 'Beschreibung',
      admin: {
        readOnly: true,
        description: 'Detaillierte Beschreibung der Aktion',
      },
    },
    {
      name: 'previousValue',
      type: 'json',
      label: 'Vorheriger Wert',
      admin: {
        readOnly: true,
        description: 'Zustand vor der Änderung',
      },
    },
    {
      name: 'newValue',
      type: 'json',
      label: 'Neuer Wert',
      admin: {
        readOnly: true,
        description: 'Zustand nach der Änderung',
      },
    },
    {
      name: 'metadata',
      type: 'json',
      label: 'Zusätzliche Daten',
      admin: {
        readOnly: true,
        description: 'Weitere Kontextinformationen',
      },
    },
  ],
}
