import type { CollectionConfig } from 'payload'
import { lexicalEditor } from '@payloadcms/richtext-lexical'
import slugify from 'slugify'

export const Artikel: CollectionConfig = {
    slug: 'artikel',
    labels: {
        singular: 'Artikel',
        plural: 'Artikel',
    },
    admin: {
        useAsTitle: 'title',
        defaultColumns: ['title', 'author', 'publishedAt', '_status'],
        description: 'Wissenschaftliche und halbwissenschaftliche Beiträge.',
    },
    versions: {
        drafts: {
            autosave: {
                interval: 2000,
            },
        },
    },
    access: {
        read:   () => true,
        create: ({ req }) => ['admin', 'editor', 'author'].includes(req.user?.role ?? ''),
        update: ({ req }) => ['admin', 'editor', 'author'].includes(req.user?.role ?? ''),
        delete: ({ req }) => ['admin', 'editor'].includes(req.user?.role ?? ''),
    },
    hooks: {
        beforeValidate: [
            ({ data, req }) => {
                if (!data) return data
                const locale = req.locale || 'de'
                const title = typeof data?.title === 'object' ? data.title?.[locale] : data?.title
                if (title && !data?.slug) {
                    let raw = slugify(title as string, {
                        lower: true,
                        strict: true,
                        locale,
                    })
                    data.slug = raw.replace(/^\{.*?"([^"]+)"\}$/, '$1')
                }
                if (!data.meta) data.meta = {}
                if (!data.meta.title) data.meta.title = data.title
                if (!data.meta.description && data.excerpt) data.meta.description = data.excerpt
                return data
            },
        ],
    },
    fields: [
        {
            name: 'title',
            label: 'Titel',
            type: 'text',
            required: true,
            localized: true,
        },
        {
            name: 'slug',
            label: 'URL-Slug',
            type: 'text',
            unique: true,
            index: true,
            admin: {
                position: 'sidebar',
                description: 'Wird automatisch aus dem Titel generiert.',
            },
        },
        {
            name: 'excerpt',
            label: 'Abstract',
            type: 'textarea',
            localized: true,
            admin: {
                description: 'Kurze wissenschaftliche Zusammenfassung.',
            },
        },
        {
            name: 'featuredImage',
            label: 'Titelbild',
            type: 'upload',
            relationTo: 'media',
            admin: {
                position: 'sidebar',
            },
        },
        {
            name: 'author',
            label: 'Autor',
            type: 'relationship',
            relationTo: 'users',
            required: true,
            admin: {
                position: 'sidebar',
            },
            hooks: {
                beforeChange: [
                    ({ value, req }) => {
                        if (!value && req.user) return req.user.id
                        return value
                    },
                ],
            },
        },
        {
            name: 'tags',
            label: 'Schlagwörter',
            type: 'array',
            admin: {
                description: 'Thematische Schlagwörter für die Filterung, z.B. "Siedlungsgeschichte", "Pécs".',
            },
            fields: [
                {
                    name: 'tag',
                    label: 'Schlagwort',
                    type: 'text',
                    required: true,
                },
            ],
        },
        {
            name: 'publishedAt',
            label: 'Veröffentlichungsdatum',
            type: 'date',
            admin: {
                position: 'sidebar',
                date: { pickerAppearance: 'dayAndTime' },
                description: 'Wird automatisch gesetzt wenn der Artikel veröffentlicht wird.',
            },
            hooks: {
                beforeChange: [
                    ({ value, siblingData }) => {
                        if (!value && siblingData?._status === 'published') {
                            return new Date().toISOString()
                        }
                        return value
                    },
                ],
            },
        },
        {
            name: 'content',
            label: 'Inhalt',
            type: 'richText',
            required: true,
            localized: true,
            editor: lexicalEditor({
                features: ({ defaultFeatures }) => defaultFeatures,
            }),
        },
        // ── References ────────────────────────────────────────────────────
        {
            name: 'references',
            label: 'Quellen & Literatur',
            type: 'array',
            admin: {
                description: 'Quellen aus dem Archiv auswählen. Werden am Ende des Artikels als Literaturverzeichnis dargestellt.',
            },
            fields: [
                {
                    name: 'source',
                    label: 'Quelle',
                    type: 'relationship',
                    relationTo: 'archiv',
                    required: true,
                },
                {
                    name: 'pages',
                    label: 'Seiten (spezifisch)',
                    type: 'text',
                    admin: {
                        description: 'Optional: spezifische Seiten für diesen Verweis, z.B. "45–67"',
                    },
                },
                {
                    name: 'note',
                    label: 'Anmerkung',
                    type: 'text',
                    admin: {
                        description: 'Optionale Anmerkung zu dieser spezifischen Verwendung der Quelle.',
                    },
                },
            ],
        },
        {
            name: 'meta',
            label: 'SEO (automatisch)',
            type: 'group',
            admin: {
                description: 'Wird automatisch aus Titel und Abstract befüllt.',
            },
            fields: [
                {
                    name: 'title',
                    label: 'SEO-Titel',
                    type: 'text',
                    localized: true,
                    admin: { readOnly: true },
                },
                {
                    name: 'description',
                    label: 'Meta-Beschreibung',
                    type: 'textarea',
                    localized: true,
                    admin: { readOnly: true },
                },
            ],
        },
    ],
}