import type { CollectionConfig } from 'payload'
import { slugField } from 'payload'

import { adminOnly, adminOrEditor, anyRoleAdmin, readPublishedOrRoles } from '../../access/roles'

import { populatePublishedAt } from '../../hooks/populatePublishedAt'
import { generatePreviewPath } from '../../utilities/generatePreviewPath'
import { revalidateDelete, revalidatePage } from './hooks/revalidatePage'
import { logCollectionChange, logCollectionDelete } from '@/hooks/auditLog'
import { normalizeLegacyPageRichText } from '@/hooks/normalizeLegacyPageRichText'

import { HeroOfferV1 } from '@/blocks/HeroOfferV1/config'
import { RichTextV1 } from '@/blocks/RichTextV1/config'
import { ContentListV1 } from '@/blocks/ContentListV1/config'
import { CTABannerV1 } from '@/blocks/CTABanner/config'
import { LeadFormV1 } from '@/blocks/LeadFormV1/config'
import { ImageGalleryStripV1 } from '@/blocks/ImageGalleryStripV1/config'
import { Testimonial } from '@/blocks/Testimonial/config'

import {
  MetaDescriptionField,
  MetaImageField,
  MetaTitleField,
  OverviewField,
  PreviewField,
} from '@payloadcms/plugin-seo/fields'
import { FormBlock } from '@/blocks/Form/config'
import { renderPageBySlug } from './renderEndpoint'
import { MediaBlock } from '@/blocks/MediaBlock/config'
import { snippetsFields } from '@/fields/snippetsFields'

export const Pages: CollectionConfig<'pages'> = {
  slug: 'pages',

  access: {
    admin: anyRoleAdmin,
    create: adminOrEditor,
    read: readPublishedOrRoles,
    update: adminOrEditor,
    delete: adminOnly,
  },

  defaultPopulate: {
    title: true,
    slug: true,
  },

  admin: {
    useAsTitle: 'title',
    defaultColumns: ['title', 'slug', 'updatedAt'],

    livePreview: {
      url: ({ data, req }) =>
        generatePreviewPath({
          slug: data?.slug,
          collection: 'pages',
          req,
        }),
    },

    preview: (data, { req }) =>
      generatePreviewPath({
        slug: data?.slug as string,
        collection: 'pages',
        req,
      }),
  },

  fields: [
    {
      name: 'title',
      type: 'text',
      required: true,
    },

    {
      type: 'tabs',
      tabs: [
        {
          label: 'Content',
          fields: [
            {
              name: 'layout',
              type: 'blocks',
              required: true,
              admin: {
                initCollapsed: true,
              },
              blocks: [
                HeroOfferV1,
                RichTextV1,
                ContentListV1,
                CTABannerV1,
                LeadFormV1,
                ImageGalleryStripV1,
                Testimonial,
                FormBlock,
                MediaBlock,
              ],
            },
          ],
        },

        {
          name: 'meta',
          label: 'SEO',
          fields: [
            OverviewField({
              titlePath: 'meta.title',
              descriptionPath: 'meta.description',
              imagePath: 'meta.image',
            }),
            MetaTitleField({ hasGenerateFn: true }),
            MetaImageField({ relationTo: 'media' }),
            MetaDescriptionField({}),
            PreviewField({
              hasGenerateFn: true,
              titlePath: 'meta.title',
              descriptionPath: 'meta.description',
            }),
            snippetsFields({
              description:
                'Optional page-level snippets. These are returned along with global snippets in the render API.',
            }),
          ],
        },
      ],
    },

    {
      name: 'publishedAt',
      type: 'date',
      admin: {
        position: 'sidebar',
      },
    },
    {
      name: 'layoutSettings',
      type: 'group',
      admin: { position: 'sidebar' },
      fields: [
        {
          name: 'headerVariant',
          type: 'select',
          defaultValue: 'inherit',
          options: [
            { label: 'Inherit from Header Global', value: 'inherit' },
            { label: 'Force Default', value: 'default' },
            { label: 'Force Landing', value: 'landing' },
            { label: 'Shared Layout', value: 'shared' },
          ],
        },
        {
          name: 'headerOverride',
          type: 'relationship',
          relationTo: 'shared-layouts',
          filterOptions: {
            type: { equals: 'header' },
          },
          admin: {
            condition: (data) => data?.layoutSettings?.headerVariant === 'shared',
          },
        },
        {
          name: 'footerVariant',
          type: 'select',
          defaultValue: 'inherit',
          options: [
            { label: 'Inherit from Footer Global', value: 'inherit' },
            { label: 'Force Default', value: 'default' },
            { label: 'Force Landing', value: 'landing' },
            { label: 'Shared Layout', value: 'shared' },
          ],
        },
        {
          name: 'footerOverride',
          type: 'relationship',
          relationTo: 'shared-layouts',
          filterOptions: {
            type: { equals: 'footer' },
          },
          admin: {
            condition: (data) => data?.layoutSettings?.footerVariant === 'shared',
          },
        },
        {
          name: 'floatingCTA',
          type: 'relationship',
          relationTo: 'shared-ctas',
          admin: {
            description:
              'Select a CTA to appear as a floating button from the second section onwards.',
          },
        },
      ],
    },

    slugField(),
  ],

  hooks: {
    beforeChange: [populatePublishedAt],
    afterRead: [normalizeLegacyPageRichText],
    afterChange: [revalidatePage, logCollectionChange('pages')],
    afterDelete: [revalidateDelete, logCollectionDelete('pages')],
  },

  versions: {
    drafts: {
      autosave: {
        interval: 100,
      },
      schedulePublish: true,
    },
    maxPerDoc: 50,
  },
  endpoints: [
    {
      path: '/render/:slug',
      method: 'get',
      handler: renderPageBySlug,
    },
  ],
}
