import type { CollectionConfig } from 'payload'

/**
 * Workflows Collection
 *
 * Komplexe Prozess- und Workflow-Darstellungen mit:
 * - Phasen und Schritten
 * - Abhängigkeiten zwischen Schritten
 * - Verzweigungen und Bedingungen
 * - Status-Tracking
 * - Checklisten und Dokumente
 * - Verantwortlichkeiten und Zeitschätzungen
 *
 * Ideal für:
 * - Projektabläufe
 * - Komplexe Geschäftsprozesse
 * - Genehmigungs-Workflows
 * - Produktentwicklungs-Pipelines
 *
 * Multi-Tenant-fähig
 */
export const Workflows: CollectionConfig = {
  slug: 'workflows',
  labels: {
    singular: 'Workflow',
    plural: 'Workflows',
  },
  admin: {
    useAsTitle: 'name',
    group: 'Inhalte',
    defaultColumns: ['name', 'type', 'status', 'updatedAt'],
    description: 'Komplexe Prozesse und Workflows mit Phasen, Abhängigkeiten und Status-Tracking',
  },
  access: {
    read: () => true, // Öffentlich lesbar
  },
  fields: [
    // Workflow-Metadaten
    {
      name: 'name',
      type: 'text',
      required: true,
      label: 'Workflow-Name',
      localized: true,
      admin: {
        description: 'Name des Workflows (z.B. "Projektablauf Webentwicklung")',
      },
    },
    {
      name: 'slug',
      type: 'text',
      required: true,
      unique: true,
      label: 'Slug',
      admin: {
        description: 'URL-freundlicher Identifier',
      },
    },
    {
      name: 'description',
      type: 'richText',
      label: 'Beschreibung',
      localized: true,
      admin: {
        description: 'Ausführliche Beschreibung des Workflows',
      },
    },
    {
      name: 'shortDescription',
      type: 'textarea',
      label: 'Kurzbeschreibung',
      localized: true,
      admin: {
        description: 'Kurze Zusammenfassung für Übersichten',
      },
    },
    {
      name: 'type',
      type: 'select',
      required: true,
      defaultValue: 'project',
      label: 'Workflow-Typ',
      options: [
        { label: 'Projektablauf', value: 'project' },
        { label: 'Geschäftsprozess', value: 'business' },
        { label: 'Genehmigung', value: 'approval' },
        { label: 'Onboarding', value: 'onboarding' },
        { label: 'Support/Service', value: 'support' },
        { label: 'Entwicklung', value: 'development' },
        { label: 'Marketing', value: 'marketing' },
        { label: 'Sonstiges', value: 'other' },
      ],
    },
    {
      name: 'status',
      type: 'select',
      required: true,
      defaultValue: 'draft',
      label: 'Status',
      options: [
        { label: 'Entwurf', value: 'draft' },
        { label: 'Veröffentlicht', value: 'published' },
        { label: 'Archiviert', value: 'archived' },
      ],
      admin: {
        position: 'sidebar',
      },
    },
    {
      name: 'image',
      type: 'upload',
      relationTo: 'media',
      label: 'Vorschaubild',
      admin: {
        description: 'Optionales Bild für den Workflow',
      },
    },

    // Workflow-Eigenschaften
    {
      name: 'properties',
      type: 'group',
      label: 'Workflow-Eigenschaften',
      fields: [
        {
          name: 'estimatedDuration',
          type: 'text',
          label: 'Geschätzte Gesamtdauer',
          localized: true,
          admin: {
            description: 'z.B. "4-6 Wochen", "3 Monate"',
          },
        },
        {
          name: 'complexity',
          type: 'select',
          label: 'Komplexität',
          options: [
            { label: 'Einfach', value: 'simple' },
            { label: 'Mittel', value: 'medium' },
            { label: 'Komplex', value: 'complex' },
            { label: 'Sehr komplex', value: 'very_complex' },
          ],
        },
        {
          name: 'isIterative',
          type: 'checkbox',
          label: 'Iterativer Prozess',
          defaultValue: false,
          admin: {
            description: 'Kann der Workflow wiederholt durchlaufen werden?',
          },
        },
        {
          name: 'allowParallelPhases',
          type: 'checkbox',
          label: 'Parallele Phasen erlaubt',
          defaultValue: false,
          admin: {
            description: 'Können mehrere Phasen gleichzeitig aktiv sein?',
          },
        },
      ],
    },

    // Display-Optionen
    {
      name: 'displayOptions',
      type: 'group',
      label: 'Darstellungsoptionen',
      fields: [
        {
          name: 'layout',
          type: 'select',
          defaultValue: 'vertical',
          label: 'Layout',
          options: [
            { label: 'Vertikal (Schritte untereinander)', value: 'vertical' },
            { label: 'Horizontal (Schritte nebeneinander)', value: 'horizontal' },
            { label: 'Flowchart (mit Verbindungen)', value: 'flowchart' },
            { label: 'Kanban (Spalten)', value: 'kanban' },
            { label: 'Gantt (Zeitstrahl)', value: 'gantt' },
          ],
        },
        {
          name: 'showPhaseNumbers',
          type: 'checkbox',
          defaultValue: true,
          label: 'Phasen-Nummern anzeigen',
        },
        {
          name: 'showStepNumbers',
          type: 'checkbox',
          defaultValue: true,
          label: 'Schritt-Nummern anzeigen',
        },
        {
          name: 'showDurations',
          type: 'checkbox',
          defaultValue: true,
          label: 'Zeitangaben anzeigen',
        },
        {
          name: 'showResponsible',
          type: 'checkbox',
          defaultValue: true,
          label: 'Verantwortliche anzeigen',
        },
        {
          name: 'showProgress',
          type: 'checkbox',
          defaultValue: false,
          label: 'Fortschrittsanzeige',
          admin: {
            description: 'Zeigt Fortschrittsbalken basierend auf abgeschlossenen Schritten',
          },
        },
        {
          name: 'colorScheme',
          type: 'select',
          defaultValue: 'phase',
          label: 'Farbschema',
          options: [
            { label: 'Nach Phase', value: 'phase' },
            { label: 'Nach Status', value: 'status' },
            { label: 'Nach Priorität', value: 'priority' },
            { label: 'Einheitlich (Brand)', value: 'brand' },
          ],
        },
      ],
    },

    // Phasen (Hauptabschnitte des Workflows)
    {
      name: 'phases',
      type: 'array',
      required: true,
      minRows: 1,
      label: 'Phasen',
      admin: {
        description: 'Hauptabschnitte des Workflows',
        initCollapsed: false,
      },
      fields: [
        {
          name: 'name',
          type: 'text',
          required: true,
          label: 'Phasen-Name',
          localized: true,
        },
        {
          name: 'description',
          type: 'textarea',
          label: 'Beschreibung',
          localized: true,
        },
        {
          name: 'icon',
          type: 'text',
          label: 'Icon',
          admin: {
            description: 'Lucide Icon-Name (z.B. "rocket", "settings", "check-circle")',
          },
        },
        {
          name: 'color',
          type: 'text',
          label: 'Farbe',
          admin: {
            description: 'HEX-Farbe (z.B. "#3B82F6") oder Tailwind-Klasse',
          },
        },
        {
          name: 'estimatedDuration',
          type: 'text',
          label: 'Geschätzte Dauer',
          localized: true,
          admin: {
            description: 'z.B. "1 Woche", "2-3 Tage"',
          },
        },
        {
          name: 'responsible',
          type: 'text',
          label: 'Verantwortlich',
          localized: true,
          admin: {
            description: 'Rolle oder Person (z.B. "Projektleiter", "Design-Team")',
          },
        },

        // Schritte innerhalb der Phase
        {
          name: 'steps',
          type: 'array',
          required: true,
          minRows: 1,
          label: 'Schritte',
          admin: {
            description: 'Einzelne Schritte in dieser Phase',
          },
          fields: [
            {
              name: 'name',
              type: 'text',
              required: true,
              label: 'Schritt-Name',
              localized: true,
            },
            {
              name: 'description',
              type: 'richText',
              label: 'Beschreibung',
              localized: true,
            },
            {
              name: 'shortDescription',
              type: 'textarea',
              label: 'Kurzbeschreibung',
              localized: true,
              admin: {
                description: 'Für kompakte Ansichten',
              },
            },
            {
              name: 'stepType',
              type: 'select',
              defaultValue: 'task',
              label: 'Schritt-Typ',
              options: [
                { label: 'Aufgabe', value: 'task' },
                { label: 'Entscheidung', value: 'decision' },
                { label: 'Meilenstein', value: 'milestone' },
                { label: 'Genehmigung', value: 'approval' },
                { label: 'Warten/Pause', value: 'wait' },
                { label: 'Automatisch', value: 'automatic' },
              ],
            },
            {
              name: 'priority',
              type: 'select',
              defaultValue: 'normal',
              label: 'Priorität',
              options: [
                { label: 'Kritisch', value: 'critical' },
                { label: 'Hoch', value: 'high' },
                { label: 'Normal', value: 'normal' },
                { label: 'Niedrig', value: 'low' },
                { label: 'Optional', value: 'optional' },
              ],
            },
            {
              name: 'estimatedDuration',
              type: 'text',
              label: 'Geschätzte Dauer',
              localized: true,
              admin: {
                description: 'z.B. "2 Stunden", "1 Tag"',
              },
            },
            {
              name: 'responsible',
              type: 'text',
              label: 'Verantwortlich',
              localized: true,
            },
            {
              name: 'icon',
              type: 'text',
              label: 'Icon',
            },

            // Abhängigkeiten
            {
              name: 'dependencies',
              type: 'group',
              label: 'Abhängigkeiten',
              admin: {
                description: 'Welche Schritte müssen vorher abgeschlossen sein?',
              },
              fields: [
                {
                  name: 'dependsOnSteps',
                  type: 'text',
                  label: 'Abhängig von Schritten',
                  admin: {
                    description:
                      'IDs oder Namen der Vorgänger-Schritte (komma-separiert). Leer = vorheriger Schritt',
                  },
                },
                {
                  name: 'canRunParallel',
                  type: 'checkbox',
                  label: 'Kann parallel laufen',
                  defaultValue: false,
                },
                {
                  name: 'isBlocking',
                  type: 'checkbox',
                  label: 'Blockierend',
                  defaultValue: true,
                  admin: {
                    description: 'Muss abgeschlossen sein, bevor der nächste Schritt beginnt',
                  },
                },
              ],
            },

            // Bedingungen (für Entscheidungen)
            {
              name: 'conditions',
              type: 'array',
              label: 'Bedingungen/Verzweigungen',
              admin: {
                description: 'Für Entscheidungsschritte: Welche Wege gibt es?',
                condition: (_, siblingData) => siblingData?.stepType === 'decision',
              },
              fields: [
                {
                  name: 'condition',
                  type: 'text',
                  required: true,
                  label: 'Bedingung',
                  localized: true,
                  admin: {
                    description: 'z.B. "Wenn genehmigt", "Bei Budget > 10.000€"',
                  },
                },
                {
                  name: 'nextStep',
                  type: 'text',
                  label: 'Nächster Schritt',
                  admin: {
                    description: 'ID oder Name des nächsten Schritts',
                  },
                },
                {
                  name: 'color',
                  type: 'text',
                  label: 'Farbe',
                  admin: {
                    description: 'z.B. "green" für positiv, "red" für negativ',
                  },
                },
              ],
            },

            // Checkliste
            {
              name: 'checklist',
              type: 'array',
              label: 'Checkliste',
              admin: {
                description: 'To-Do-Punkte für diesen Schritt',
              },
              fields: [
                {
                  name: 'item',
                  type: 'text',
                  required: true,
                  label: 'Aufgabe',
                  localized: true,
                },
                {
                  name: 'isRequired',
                  type: 'checkbox',
                  label: 'Pflicht',
                  defaultValue: true,
                },
              ],
            },

            // Dokumente und Ressourcen
            {
              name: 'resources',
              type: 'array',
              label: 'Ressourcen & Dokumente',
              fields: [
                {
                  name: 'name',
                  type: 'text',
                  required: true,
                  label: 'Name',
                  localized: true,
                },
                {
                  name: 'type',
                  type: 'select',
                  defaultValue: 'document',
                  label: 'Typ',
                  options: [
                    { label: 'Dokument', value: 'document' },
                    { label: 'Template', value: 'template' },
                    { label: 'Link', value: 'link' },
                    { label: 'Tool', value: 'tool' },
                    { label: 'Video', value: 'video' },
                  ],
                },
                {
                  name: 'file',
                  type: 'upload',
                  relationTo: 'media',
                  label: 'Datei',
                  admin: {
                    condition: (_, siblingData) =>
                      ['document', 'template'].includes(siblingData?.type),
                  },
                },
                {
                  name: 'url',
                  type: 'text',
                  label: 'URL',
                  admin: {
                    condition: (_, siblingData) =>
                      ['link', 'tool', 'video'].includes(siblingData?.type),
                  },
                },
                {
                  name: 'description',
                  type: 'textarea',
                  label: 'Beschreibung',
                  localized: true,
                },
              ],
            },

            // Outputs/Ergebnisse
            {
              name: 'outputs',
              type: 'array',
              label: 'Ergebnisse/Outputs',
              admin: {
                description: 'Was wird in diesem Schritt produziert?',
              },
              fields: [
                {
                  name: 'name',
                  type: 'text',
                  required: true,
                  label: 'Output',
                  localized: true,
                },
                {
                  name: 'description',
                  type: 'textarea',
                  label: 'Beschreibung',
                  localized: true,
                },
              ],
            },

            // Zusätzliche Daten
            {
              name: 'metadata',
              type: 'json',
              label: 'Zusätzliche Daten (JSON)',
              admin: {
                description: 'Für spezielle Anwendungsfälle',
              },
            },
          ],
        },

        // Phase-Level Outputs
        {
          name: 'deliverables',
          type: 'array',
          label: 'Liefergegenstände der Phase',
          admin: {
            description: 'Was wird am Ende dieser Phase abgeliefert?',
          },
          fields: [
            {
              name: 'name',
              type: 'text',
              required: true,
              label: 'Deliverable',
              localized: true,
            },
            {
              name: 'description',
              type: 'textarea',
              label: 'Beschreibung',
              localized: true,
            },
          ],
        },
      ],
    },

    // Globale Ressourcen
    {
      name: 'globalResources',
      type: 'array',
      label: 'Globale Ressourcen',
      admin: {
        description: 'Ressourcen, die für den gesamten Workflow relevant sind',
      },
      fields: [
        {
          name: 'name',
          type: 'text',
          required: true,
          label: 'Name',
          localized: true,
        },
        {
          name: 'type',
          type: 'select',
          defaultValue: 'document',
          label: 'Typ',
          options: [
            { label: 'Dokument', value: 'document' },
            { label: 'Template', value: 'template' },
            { label: 'Checkliste', value: 'checklist' },
            { label: 'Link', value: 'link' },
            { label: 'Tool', value: 'tool' },
          ],
        },
        {
          name: 'file',
          type: 'upload',
          relationTo: 'media',
          label: 'Datei',
        },
        {
          name: 'url',
          type: 'text',
          label: 'URL',
        },
        {
          name: 'description',
          type: 'textarea',
          label: 'Beschreibung',
          localized: true,
        },
      ],
    },

    // SEO
    {
      name: 'seo',
      type: 'group',
      label: 'SEO',
      admin: {
        position: 'sidebar',
      },
      fields: [
        {
          name: 'metaTitle',
          type: 'text',
          label: 'Meta-Titel',
          localized: true,
        },
        {
          name: 'metaDescription',
          type: 'textarea',
          label: 'Meta-Beschreibung',
          localized: true,
        },
      ],
    },
  ],
  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
      },
    ],
  },
}
