// src/collections/YtSeries.ts

import type { CollectionConfig } from 'payload'
import { hasYouTubeAccess, isYouTubeManager } from '../lib/youtubeAccess'

/**
 * YtSeries Collection
 *
 * Content-Serien für YouTube-Kanäle mit eigenem Branding.
 * Ermöglicht die Verwaltung von wiederkehrenden Formaten
 * wie "GRFI", "Investment-Piece", etc.
 */
export const YtSeries: CollectionConfig = {
  slug: 'yt-series',
  labels: {
    singular: 'YouTube-Serie',
    plural: 'YouTube-Serien',
  },
  admin: {
    group: 'YouTube',
    useAsTitle: 'name',
    defaultColumns: ['name', 'channel', 'format', 'isActive', 'updatedAt'],
    description: 'Content-Serien für YouTube-Kanäle',
  },
  access: {
    read: hasYouTubeAccess,
    create: isYouTubeManager,
    update: isYouTubeManager,
    delete: isYouTubeManager,
  },
  fields: [
    // Grunddaten
    {
      name: 'name',
      type: 'text',
      required: true,
      localized: true,
      label: 'Name',
      admin: {
        placeholder: 'z.B. "GRFI", "Investment-Piece"',
      },
    },
    {
      name: 'slug',
      type: 'text',
      required: true,
      label: 'Slug',
      admin: {
        description: 'URL-freundlicher Name (eindeutig pro Kanal)',
        placeholder: 'z.B. "grfi", "investment-piece"',
      },
    },
    {
      name: 'channel',
      type: 'relationship',
      relationTo: 'youtube-channels',
      required: true,
      label: 'Kanal',
      admin: {
        position: 'sidebar',
      },
    },
    {
      name: 'description',
      type: 'textarea',
      localized: true,
      label: 'Beschreibung',
      admin: {
        rows: 3,
      },
    },

    // Branding
    {
      name: 'logo',
      type: 'upload',
      relationTo: 'media',
      label: 'Logo',
      admin: {
        description: 'Serien-Logo (transparent PNG empfohlen)',
      },
    },
    {
      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: {
        placeholder: '#B08D57',
        description: 'Hex-Farbcode',
      },
      validate: (value: string | undefined | null) => {
        if (!value) return true
        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: {
        placeholder: '#FFFFFF',
        description: 'Sekundäre Farbe',
      },
      validate: (value: string | undefined | null) => {
        if (!value) return true
        const hexRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/
        if (!hexRegex.test(value)) {
          return 'Bitte einen gültigen Hex-Farbcode eingeben'
        }
        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
        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'
        }
      },
    },

    // Format & Häufigkeit
    {
      name: 'format',
      type: 'select',
      label: 'Format',
      options: [
        { label: 'Short (< 60s)', value: 'short' },
        { label: 'Longform', value: 'longform' },
        { label: 'Mixed', value: 'mixed' },
      ],
      admin: {
        position: 'sidebar',
      },
    },
    {
      name: 'publishingFrequency',
      type: 'text',
      label: 'Veröffentlichungs-Rhythmus',
      admin: {
        placeholder: 'z.B. "wöchentlich", "2x pro Woche"',
        position: 'sidebar',
      },
    },

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