// src/collections/FormSubmissionsOverrides.ts

import type { CollectionConfig, Field } from 'payload'

/**
 * FormSubmissions Overrides
 *
 * Erweitert die vom formBuilderPlugin erstellte FormSubmissions Collection um:
 * - Tenant-Zuweisung (automatisch vom Formular)
 * - Status-Workflow (neu → in Bearbeitung → erledigt)
 * - Interne Notizen
 * - Zuständigkeits-Zuweisung
 * - Verbesserte Admin-Ansicht
 *
 * WICHTIG: fields MUSS eine Funktion sein, da das formBuilderPlugin
 * ein Array stillschweigend ignoriert und nur defaultFields verwendet.
 */

const customFields: Field[] = [
    // Tenant (automatisch vom Formular übernommen via setSubmissionTenant Hook)
    {
      name: 'tenant',
      type: 'relationship',
      relationTo: 'tenants',
      admin: {
        position: 'sidebar',
        readOnly: true,
        description: 'Wird automatisch vom Formular übernommen',
      },
    },
    // Status-Workflow
    {
      name: 'status',
      type: 'select',
      defaultValue: 'new',
      label: 'Status',
      options: [
        { label: '🆕 Neu', value: 'new' },
        { label: '👀 Gelesen', value: 'read' },
        { label: '🔄 In Bearbeitung', value: 'in-progress' },
        { label: '⏳ Warten auf Rückmeldung', value: 'waiting' },
        { label: '✅ Erledigt', value: 'completed' },
        { label: '🗑️ Spam/Archiviert', value: 'archived' },
      ],
      admin: {
        position: 'sidebar',
      },
    },
    // Priorität
    {
      name: 'priority',
      type: 'select',
      defaultValue: 'normal',
      label: 'Priorität',
      options: [
        { label: '🔴 Hoch', value: 'high' },
        { label: '🟡 Normal', value: 'normal' },
        { label: '🟢 Niedrig', value: 'low' },
      ],
      admin: {
        position: 'sidebar',
      },
    },
    // Zuständigkeit
    {
      name: 'assignedTo',
      type: 'relationship',
      relationTo: 'users',
      label: 'Zuständig',
      admin: {
        position: 'sidebar',
        description: 'Wer bearbeitet diese Anfrage?',
      },
    },
    // Interne Notizen
    {
      name: 'internalNotes',
      type: 'array',
      label: 'Interne Notizen',
      admin: {
        description: 'Interne Kommunikation zur Anfrage (nicht für Kunden sichtbar)',
        initCollapsed: false,
      },
      fields: [
        {
          name: 'note',
          type: 'textarea',
          required: true,
          label: 'Notiz',
        },
        {
          name: 'author',
          type: 'relationship',
          relationTo: 'users',
          label: 'Autor',
          admin: {
            readOnly: true,
            description: 'Wird automatisch gesetzt',
          },
        },
        {
          name: 'createdAt',
          type: 'date',
          label: 'Erstellt am',
          admin: {
            readOnly: true,
            date: {
              pickerAppearance: 'dayAndTime',
              displayFormat: 'dd.MM.yyyy HH:mm',
            },
          },
        },
      ],
    },
    // Antwort-Tracking
    {
      name: 'responseTracking',
      type: 'group',
      label: 'Antwort-Tracking',
      admin: {
        description: 'Tracking der Kommunikation mit dem Absender',
      },
      fields: [
        {
          name: 'responded',
          type: 'checkbox',
          defaultValue: false,
          label: 'Antwort gesendet',
        },
        {
          name: 'respondedAt',
          type: 'date',
          label: 'Antwort gesendet am',
          admin: {
            condition: (data, siblingData) => siblingData?.responded,
            date: {
              pickerAppearance: 'dayAndTime',
              displayFormat: 'dd.MM.yyyy HH:mm',
            },
          },
        },
        {
          name: 'respondedBy',
          type: 'relationship',
          relationTo: 'users',
          label: 'Antwort gesendet von',
          admin: {
            condition: (data, siblingData) => siblingData?.responded,
          },
        },
        {
          name: 'responseMethod',
          type: 'select',
          label: 'Antwort-Methode',
          options: [
            { label: 'E-Mail', value: 'email' },
            { label: 'Telefon', value: 'phone' },
            { label: 'Persönlich', value: 'in-person' },
            { label: 'Brief', value: 'letter' },
          ],
          admin: {
            condition: (data, siblingData) => siblingData?.responded,
          },
        },
        {
          name: 'responseSummary',
          type: 'textarea',
          label: 'Zusammenfassung der Antwort',
          admin: {
            condition: (data, siblingData) => siblingData?.responded,
            description: 'Kurze Zusammenfassung was geantwortet wurde',
          },
        },
      ],
    },
    // Tags für Kategorisierung
    {
      name: 'tags',
      type: 'array',
      label: 'Tags',
      admin: {
        description: 'Tags zur Kategorisierung (z.B. "Preisanfrage", "Support")',
        initCollapsed: true,
      },
      fields: [
        {
          name: 'tag',
          type: 'text',
          required: true,
          label: 'Tag',
        },
      ],
    },
    // Gelesen-Markierung
    {
      name: 'readAt',
      type: 'date',
      label: 'Gelesen am',
      admin: {
        position: 'sidebar',
        readOnly: true,
        date: {
          pickerAppearance: 'dayAndTime',
          displayFormat: 'dd.MM.yyyy HH:mm',
        },
      },
    },
    {
      name: 'readBy',
      type: 'relationship',
      relationTo: 'users',
      label: 'Gelesen von',
      admin: {
        position: 'sidebar',
        readOnly: true,
      },
    },
]

export const formSubmissionOverrides: Partial<CollectionConfig> = {
  admin: {
    useAsTitle: 'id',
    group: 'Formulare',
    defaultColumns: ['id', 'form', 'tenant', 'status', 'assignedTo', 'createdAt'],
    description: 'Eingegangene Formular-Einsendungen',
    listSearchableFields: ['id', 'status'],
  },
  labels: {
    singular: 'Formular-Einsendung',
    plural: 'Formular-Einsendungen',
  },
  fields: (({ defaultFields }: { defaultFields: Field[] }) => [
    ...defaultFields,
    ...customFields,
  ]) as unknown as Field[],
}
