import { CollectionConfig } from 'payload'
import { hide, isAdminOrEmployee } from '@/collections/access/admin'
import { regenerateMassesForChurch } from '@/jobs/generateRecurringMasses'

export const Churches: CollectionConfig = {
  slug: 'church',
  labels: {
    singular: {
      de: 'Kirche',
    },
    plural: {
      de: 'Kirchen',
    },
  },
  fields: [
    {
      name: 'name',
      label: {
        de: 'Name',
      },
      type: 'text',
      required: true,
    },
    {
      name: 'address',
      label: {
        de: 'Addresse',
      },
      type: 'textarea',
      required: true,
    },
    {
      name: 'recurringSchedule',
      type: 'array',
      label: {
        de: 'Wiederkehrende Messzeiten',
      },
      labels: {
        singular: {
          de: 'Wiederkehrende Messzeit',
        },
        plural: {
          de: 'Wiederkehrende Messzeiten',
        },
      },
      admin: {
        description:
          'Wiederkehrende Gottesdienste werden automatisch für die nächsten Wochen als Einträge in der Gottesdienstliste angelegt. Einzelne Termine können dort weiterhin manuell bearbeitet (z. B. abgesagt) werden.',
      },
      fields: [
        {
          type: 'row',
          fields: [
            {
              name: 'type',
              label: {
                de: 'Art',
              },
              type: 'select',
              required: true,
              options: [
                { label: 'Heilige Messe', value: 'MASS' },
                { label: 'Familien Messe', value: 'FAMILY' },
                { label: 'Wort-Gottes-Feier', value: 'WORD' },
                { label: 'Fremdsprache', value: 'LANGUAGE' },
                { label: 'Andere', value: 'OTHER' },
              ],
            },
            {
              name: 'frequency',
              label: {
                de: 'Häufigkeit',
              },
              type: 'select',
              required: true,
              defaultValue: 'weekly',
              options: [
                { label: 'Wöchentlich', value: 'weekly' },
                { label: 'Alle 2 Wochen', value: 'biweekly' },
                {
                  label: 'Monatlich (n-ter Wochentag)',
                  value: 'monthlyByWeekday',
                },
              ],
            },
          ],
        },
        {
          type: 'row',
          fields: [
            {
              name: 'day',
              label: {
                de: 'Tag',
              },
              type: 'select',
              required: true,
              options: [
                { label: 'Montag', value: 'monday' },
                { label: 'Dienstag', value: 'tuesday' },
                { label: 'Mittwoch', value: 'wednesday' },
                { label: 'Donnerstag', value: 'thursday' },
                { label: 'Freitag', value: 'friday' },
                { label: 'Samstag', value: 'saturday' },
                { label: 'Sonntag', value: 'sunday' },
              ],
            },
            {
              name: 'time',
              label: {
                de: 'Uhrzeit',
              },
              type: 'date',
              required: true,
              admin: {
                date: {
                  pickerAppearance: 'timeOnly',
                  timeIntervals: 15,
                  timeFormat: 'HH:mm',
                },
              },
            },
          ],
        },
        {
          name: 'weekOfMonth',
          label: {
            de: 'Wochentag im Monat',
          },
          type: 'select',
          options: [
            { label: '1.', value: 'first' },
            { label: '2.', value: 'second' },
            { label: '3.', value: 'third' },
            { label: '4.', value: 'fourth' },
            { label: '5.', value: 'fifth' },
            { label: 'Letzter', value: 'last' },
          ],
          admin: {
            condition: (_data, siblingData) =>
              siblingData?.frequency === 'monthlyByWeekday',
            description:
              'z. B. „3.“ + „Sonntag“ = jeden 3. Sonntag im Monat.',
          },
        },
        {
          name: 'biweeklyAnchor',
          label: {
            de: 'Anker-Datum (alle 2 Wochen)',
          },
          type: 'date',
          admin: {
            date: {
              pickerAppearance: 'dayOnly',
            },
            condition: (_data, siblingData) =>
              siblingData?.frequency === 'biweekly',
            description:
              'Ein Datum, an dem dieser Termin stattfindet. Davon ausgehend wird im 2-Wochen-Rhythmus weitergerechnet.',
          },
        },
        {
          type: 'row',
          fields: [
            {
              name: 'defaultCelebrant',
              label: {
                de: 'Standard-Zelebrant',
              },
              type: 'text',
            },
            {
              name: 'defaultTitle',
              label: {
                de: 'Standard-Titel',
              },
              type: 'text',
            },
          ],
        },
        {
          name: 'defaultDescription',
          label: {
            de: 'Standard-Hinweise',
          },
          type: 'textarea',
          admin: {
            description:
              'Wird als „Hinweise“ auf jeden automatisch erzeugten Gottesdienst übernommen, z. B. „Vor der Messe beten wir den Rosenkranz.“',
          },
        },
        {
          name: 'notes',
          label: {
            de: 'Notiz',
          },
          type: 'text',
          admin: {
            description:
              'Nur intern, z. B. „Sommerferien: ausgesetzt“. Beeinflusst die Generierung nicht.',
          },
        },
      ],
    },
  ],
  admin: {
    useAsTitle: 'name',
    hidden: hide,
  },
  access: {
    read: () => true,
    create: isAdminOrEmployee(),
    update: isAdminOrEmployee(),
    delete: isAdminOrEmployee(),
  },
  hooks: {
    afterChange: [
      async ({ doc, req }) => {
        try {
          // Materialize Worship docs synchronously so they appear right
          // after saving — same approach as Events/eventOccurrence. This
          // wipes the church's future auto-generated masses and rebuilds
          // them from the current schedule, so changing (or clearing) the
          // schedule never leaves stale/double masses behind. The weekly
          // job (generateRecurringMasses) still backfills the rolling
          // window across all churches via its cron schedule.
          await regenerateMassesForChurch({
            church: doc,
            payload: req.payload,
            req,
          })
        } catch (err) {
          req.payload.logger.error(
            { err, churchId: doc.id },
            'Failed to regenerate recurring masses',
          )
        }
      },
    ],
  },
}
