// src/collections/Series.ts

import type { CollectionConfig } from 'payload'
import { authenticatedOnly, tenantScopedPublicRead } from '../lib/tenantAccess'

/**
 * Series Collection
 *
 * YouTube-Serien mit eigenem Branding für BlogWoman.de
 * Unterstützt lokalisierte Inhalte und Custom Brand Colors.
 * Tenant-scoped für Multi-Tenant-Betrieb.
 */
export const Series: CollectionConfig = {
  slug: 'series',
  admin: {
    group: 'Content',
    useAsTitle: 'title',
    defaultColumns: ['title', 'slug', 'brandColor', 'isActive'],
    description: 'YouTube-Serien und Content-Reihen',
  },
  access: {
    read: tenantScopedPublicRead,
    create: authenticatedOnly,
    update: authenticatedOnly,
    delete: authenticatedOnly,
  },
  fields: [
    // Main Content
    {
      name: 'title',
      type: 'text',
      required: true,
      localized: true,
      label: 'Titel',
    },
    {
      name: 'slug',
      type: 'text',
      required: true,
      unique: true,
      label: 'Slug',
      admin: {
        description: 'URL-freundlicher Name (z.B. "grfi-series")',
      },
    },
    {
      name: 'tagline',
      type: 'text',
      maxLength: 150,
      localized: true,
      label: 'Tagline',
      admin: {
        description: 'Kurzer Slogan oder Untertitel (max. 150 Zeichen)',
      },
    },
    {
      name: 'description',
      type: 'richText',
      localized: true,
      label: 'Beschreibung',
      admin: {
        description: 'Ausführliche Beschreibung der Serie',
      },
    },

    // Branding
    {
      name: 'logo',
      type: 'upload',
      relationTo: 'media',
      label: 'Logo',
      admin: {
        description: 'Serien-Logo (empfohlen: transparent PNG)',
      },
    },
    {
      name: 'coverImage',
      type: 'upload',
      relationTo: 'media',
      label: 'Cover-Bild',
      admin: {
        description: 'Hauptbild für die Serie (16:9 empfohlen)',
      },
    },
    {
      name: 'brandColor',
      type: 'text',
      label: 'Markenfarbe',
      admin: {
        description: 'Hex-Farbcode (z.B. #B08D57)',
        placeholder: '#B08D57',
      },
      validate: (value: string | undefined | null) => {
        if (!value) return true // Optional field
        const hexRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/
        if (!hexRegex.test(value)) {
          return 'Bitte einen gültigen Hex-Farbcode eingeben (z.B. #B08D57)'
        }
        return true
      },
    },
    {
      name: 'accentColor',
      type: 'text',
      label: 'Akzentfarbe',
      admin: {
        description: 'Sekundäre Farbe (z.B. #FFFFFF)',
        placeholder: '#FFFFFF',
      },
      validate: (value: string | undefined | null) => {
        if (!value) return true // Optional field
        const hexRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/
        if (!hexRegex.test(value)) {
          return 'Bitte einen gültigen Hex-Farbcode eingeben (z.B. #FFFFFF)'
        }
        return true
      },
    },

    // YouTube Integration
    {
      name: 'youtubePlaylistId',
      type: 'text',
      label: 'YouTube Playlist ID',
      admin: {
        description: 'Die Playlist-ID aus YouTube (z.B. PLxxxxxx)',
      },
    },
    {
      name: 'youtubePlaylistUrl',
      type: 'text',
      label: 'YouTube Playlist URL',
      admin: {
        description: 'Vollständiger Link zur YouTube-Playlist',
      },
      validate: (value: string | undefined | null) => {
        if (!value) return true // Optional field
        try {
          const url = new URL(value)
          if (!url.hostname.includes('youtube.com') && !url.hostname.includes('youtu.be')) {
            return 'Bitte eine gültige YouTube-URL eingeben'
          }
          return true
        } catch {
          return 'Bitte eine gültige URL eingeben'
        }
      },
    },

    // Display Settings
    {
      name: 'order',
      type: 'number',
      defaultValue: 0,
      label: 'Sortierung',
      admin: {
        position: 'sidebar',
        description: 'Niedrigere Zahlen werden zuerst angezeigt',
      },
    },
    {
      name: 'isActive',
      type: 'checkbox',
      required: true,
      defaultValue: true,
      label: 'Aktiv',
      admin: {
        position: 'sidebar',
        description: 'Inaktive Serien werden nicht angezeigt',
      },
    },
  ],
}
