// src/collections/Team.ts

import type { CollectionConfig } from 'payload'
import { authenticatedOnly, tenantScopedPublicRead } from '../lib/tenantAccess'

/**
 * Team Collection
 *
 * Mitarbeiter und Team-Mitglieder, wiederverwendbar auf allen Seiten.
 * Tenant-scoped für Multi-Tenant-Betrieb.
 */
export const Team: CollectionConfig = {
  slug: 'team',
  admin: {
    useAsTitle: 'name',
    group: 'Content',
    defaultColumns: ['name', 'role', 'department', 'order', 'isActive'],
    description: 'Team-Mitglieder und Mitarbeiter',
  },
  access: {
    read: tenantScopedPublicRead,
    create: authenticatedOnly,
    update: authenticatedOnly,
    delete: authenticatedOnly,
  },
  fields: [
    // Basis-Informationen
    {
      name: 'name',
      type: 'text',
      required: true,
      label: 'Name',
      admin: {
        description: 'Vollständiger Name',
      },
    },
    {
      name: 'slug',
      type: 'text',
      required: true,
      unique: true,
      label: 'Slug',
      admin: {
        description: 'URL-freundlicher Identifier (z.B. "max-mustermann")',
      },
    },
    {
      name: 'role',
      type: 'text',
      required: true,
      label: 'Position/Rolle',
      localized: true,
      admin: {
        description: 'z.B. "Geschäftsführer", "Pflegedienstleitung", "Fotograf"',
      },
    },
    {
      name: 'department',
      type: 'text',
      label: 'Abteilung',
      localized: true,
      admin: {
        description: 'z.B. "Verwaltung", "Pflege", "Marketing"',
      },
    },
    {
      name: 'image',
      type: 'upload',
      relationTo: 'media',
      label: 'Foto',
      admin: {
        description: 'Portrait-Foto (empfohlen: quadratisch, min. 400x400px)',
      },
    },
    {
      name: 'bio',
      type: 'richText',
      label: 'Biografie',
      localized: true,
      admin: {
        description: 'Kurze Beschreibung zur Person',
      },
    },
    {
      name: 'bioShort',
      type: 'textarea',
      label: 'Kurzbiografie',
      localized: true,
      admin: {
        description: 'Ein-Satz-Beschreibung für kompakte Darstellung',
      },
    },
    // Kontaktdaten
    {
      type: 'collapsible',
      label: 'Kontaktdaten',
      admin: {
        initCollapsed: true,
      },
      fields: [
        {
          name: 'email',
          type: 'email',
          label: 'E-Mail',
          admin: {
            description: 'Öffentliche Kontakt-E-Mail (optional)',
          },
        },
        {
          name: 'phone',
          type: 'text',
          label: 'Telefon',
          admin: {
            description: 'Öffentliche Telefonnummer (optional)',
          },
        },
        {
          name: 'showContactInfo',
          type: 'checkbox',
          defaultValue: false,
          label: 'Kontaktdaten öffentlich anzeigen',
        },
      ],
    },
    // Social Links
    {
      name: 'socialLinks',
      type: 'array',
      label: 'Social Media',
      admin: {
        initCollapsed: true,
      },
      fields: [
        {
          name: 'platform',
          type: 'select',
          required: true,
          label: 'Plattform',
          options: [
            { label: 'LinkedIn', value: 'linkedin' },
            { label: 'Xing', value: 'xing' },
            { label: 'Twitter/X', value: 'twitter' },
            { label: 'Instagram', value: 'instagram' },
            { label: 'Facebook', value: 'facebook' },
            { label: 'Website', value: 'website' },
            { label: 'GitHub', value: 'github' },
          ],
        },
        {
          name: 'url',
          type: 'text',
          required: true,
          label: 'URL',
        },
      ],
    },
    // Qualifikationen
    {
      name: 'qualifications',
      type: 'array',
      label: 'Qualifikationen',
      admin: {
        initCollapsed: true,
        description: 'Ausbildungen, Zertifikate, Abschlüsse',
      },
      fields: [
        {
          name: 'title',
          type: 'text',
          required: true,
          label: 'Bezeichnung',
          localized: true,
        },
        {
          name: 'year',
          type: 'number',
          label: 'Jahr',
          min: 1950,
          max: 2100,
        },
        {
          name: 'institution',
          type: 'text',
          label: 'Institution',
        },
      ],
    },
    // Fachgebiete
    {
      name: 'specializations',
      type: 'array',
      label: 'Fachgebiete/Schwerpunkte',
      admin: {
        initCollapsed: true,
      },
      fields: [
        {
          name: 'title',
          type: 'text',
          required: true,
          label: 'Fachgebiet',
          localized: true,
        },
      ],
    },
    // Sprachen (besonders für C2S/Pflege relevant)
    {
      name: 'languages',
      type: 'array',
      label: 'Sprachkenntnisse',
      admin: {
        initCollapsed: true,
      },
      fields: [
        {
          name: 'language',
          type: 'text',
          required: true,
          label: 'Sprache',
          localized: true,
        },
        {
          name: 'level',
          type: 'select',
          label: 'Niveau',
          options: [
            { label: 'Muttersprache', value: 'native' },
            { label: 'Fließend', value: 'fluent' },
            { label: 'Gut', value: 'good' },
            { label: 'Grundkenntnisse', value: 'basic' },
          ],
        },
      ],
    },
    // Verknüpfung mit User (optional)
    {
      name: 'linkedUser',
      type: 'relationship',
      relationTo: 'users',
      label: 'Verknüpfter Benutzer',
      admin: {
        position: 'sidebar',
        description: 'Optional: Verknüpfung mit Login-User (z.B. für Autoren-Zuordnung)',
      },
    },
    // Status & Sortierung
    {
      name: 'isActive',
      type: 'checkbox',
      defaultValue: true,
      label: 'Aktiv/Sichtbar',
      admin: {
        position: 'sidebar',
        description: 'Inaktive Mitglieder werden nicht angezeigt',
      },
    },
    {
      name: 'isFeatured',
      type: 'checkbox',
      defaultValue: false,
      label: 'Hervorgehoben',
      admin: {
        position: 'sidebar',
        description: 'Für Startseiten-Anzeige oder besondere Hervorhebung',
      },
    },
    {
      name: 'order',
      type: 'number',
      defaultValue: 0,
      label: 'Sortierung',
      admin: {
        position: 'sidebar',
        description: 'Niedrigere Zahlen werden zuerst angezeigt',
      },
    },
    {
      name: 'startDate',
      type: 'date',
      label: 'Im Team seit',
      admin: {
        position: 'sidebar',
        description: 'Eintrittsdatum (optional)',
      },
    },
    // Hierarchie für Organigramm
    {
      name: 'reportsTo',
      type: 'relationship',
      relationTo: 'team',
      label: 'Vorgesetzter',
      admin: {
        position: 'sidebar',
        description: 'Direkter Vorgesetzter (für Organigramm)',
      },
    },
    {
      name: 'hierarchyLevel',
      type: 'select',
      label: 'Hierarchie-Ebene',
      options: [
        { label: 'Geschäftsführung', value: 'executive' },
        { label: 'Abteilungsleitung', value: 'department_head' },
        { label: 'Teamleitung', value: 'team_lead' },
        { label: 'Mitarbeiter', value: 'employee' },
        { label: 'Praktikant/Azubi', value: 'trainee' },
      ],
      admin: {
        position: 'sidebar',
        description: 'Für Organigramm-Darstellung',
      },
    },
    // vCard Export erlauben
    {
      name: 'allowVCard',
      type: 'checkbox',
      defaultValue: true,
      label: 'vCard-Export erlauben',
      admin: {
        position: 'sidebar',
        description: 'Kontaktkarte zum Download anbieten',
      },
    },
  ],
  hooks: {
    beforeChange: [
      ({ data }) => {
        // Auto-generate slug from name if not provided
        if (data && !data.slug && data.name) {
          data.slug = data.name
            .toLowerCase()
            .replace(/[äöüß]/g, (match: string) => {
              const map: Record<string, string> = { ä: 'ae', ö: 'oe', ü: 'ue', ß: 'ss' }
              return map[match] || match
            })
            .replace(/[^a-z0-9]+/g, '-')
            .replace(/^-|-$/g, '')
        }
        return data
      },
    ],
  },
}
