import type { CollectionConfig, Access, FieldAccess } from 'payload'
import { auditUserAfterChange, auditUserAfterDelete } from '../hooks/auditUserChanges'
import {
  auditAfterLogin,
  auditAfterLogout,
  auditAfterForgotPassword,
} from '../hooks/auditAuthEvents'

// Users können ihren eigenen Account bearbeiten
const canUpdateOwnAccount: Access = ({ req: { user }, id }) => {
  // Super Admins können alle User bearbeiten
  if (user?.isSuperAdmin) {
    return true
  }
  // User können ihren eigenen Account bearbeiten
  if (user?.id && id && String(user.id) === String(id)) {
    return true
  }
  // Ansonsten kein Zugriff
  return false
}

const superAdminFieldAccess: FieldAccess = ({ req: { user } }) => {
  return Boolean(user?.isSuperAdmin)
}

export const Users: CollectionConfig = {
  slug: 'users',
  admin: {
    useAsTitle: 'email',
  },
  access: {
    // Erlaubt Benutzern, ihren eigenen Account zu aktualisieren
    update: canUpdateOwnAccount,
  },
  auth: {
    // Cookie-Konfiguration für Production hinter Reverse-Proxy (Cloudflare/Caddy)
    cookies: {
      sameSite: 'Lax',
      secure: process.env.NODE_ENV === 'production',
      domain: undefined, // Automatisch vom Browser gesetzt
    },
    // Sicherheitseinstellungen
    lockTime: 10 * 60 * 1000, // 10 Minuten Lock nach max. Fehlversuchen
    maxLoginAttempts: 5,
    tokenExpiration: 7200, // 2 Stunden
  },
  hooks: {
    afterChange: [auditUserAfterChange],
    afterDelete: [auditUserAfterDelete],
    afterLogin: [auditAfterLogin],
    afterLogout: [auditAfterLogout],
    afterForgotPassword: [auditAfterForgotPassword],
  },
  fields: [
    {
      name: 'isSuperAdmin',
      type: 'checkbox',
      label: 'Super Admin',
      defaultValue: false,
      access: {
        read: superAdminFieldAccess,
        create: superAdminFieldAccess,
        update: superAdminFieldAccess,
      },
      admin: {
        description: 'Super Admins haben Zugriff auf alle Tenants und können neue Tenants erstellen.',
        position: 'sidebar',
      },
    },
    // YouTube Operations Hub Felder
    {
      name: 'youtubeRole',
      type: 'select',
      label: 'YouTube-Rolle',
      admin: {
        position: 'sidebar',
        description: 'Rolle im YouTube Operations Hub',
      },
      options: [
        { label: 'Kein Zugriff', value: 'none' },
        { label: 'Viewer (nur Lesen)', value: 'viewer' },
        { label: 'Editor (Schnitt)', value: 'editor' },
        { label: 'Producer (Produktion)', value: 'producer' },
        { label: 'Creator (Inhalte)', value: 'creator' },
        { label: 'Manager (Vollzugriff)', value: 'manager' },
      ],
      defaultValue: 'none',
    },
    {
      name: 'youtubeChannels',
      type: 'relationship',
      relationTo: 'youtube-channels',
      hasMany: true,
      label: 'YouTube-Kanäle',
      admin: {
        position: 'sidebar',
        description: 'Zugewiesene YouTube-Kanäle',
        condition: (data) => data?.youtubeRole && data.youtubeRole !== 'none',
      },
    },
    // Community Management Felder
    {
      name: 'communityRole',
      type: 'select',
      label: 'Community-Rolle',
      defaultValue: 'none',
      options: [
        { label: 'Kein Zugriff', value: 'none' },
        { label: 'Viewer (nur Lesen)', value: 'viewer' },
        { label: 'Moderator', value: 'moderator' },
        { label: 'Manager (Vollzugriff)', value: 'manager' },
      ],
      admin: {
        position: 'sidebar',
        description: 'Zugriff auf Community Management Features',
      },
    },
  ],
}
