import type { Block } from 'payload'

/**
 * Aspect ratio options
 */
const aspectRatioOptions = [
  { label: '16:9 (Standard)', value: '16:9' },
  { label: '4:3', value: '4:3' },
  { label: '1:1 (Quadrat)', value: '1:1' },
  { label: '9:16 (Vertikal)', value: '9:16' },
]

/**
 * Max width options
 */
const maxWidthOptions = [
  { label: 'Volle Breite', value: 'full' },
  { label: 'Groß (1024px)', value: 'large' },
  { label: 'Mittel (768px)', value: 'medium' },
  { label: 'Klein (512px)', value: 'small' },
]

/**
 * VideoEmbedBlock
 *
 * Einbettung von YouTube, Vimeo oder benutzerdefinierten Videos.
 * Unterstützt Privacy Mode, Lazy Loading und verschiedene Aspect Ratios.
 *
 * Verwendet die Video-Utils aus src/lib/video/video-utils.ts für URL-Parsing
 */
export const VideoEmbedBlock: Block = {
  slug: 'video-embed-block',
  labels: {
    singular: 'Video-Embed',
    plural: 'Video-Embeds',
  },
  imageURL: '/assets/blocks/video-embed.png',
  fields: [
    // Title (optional)
    {
      name: 'title',
      type: 'text',
      label: 'Titel',
      localized: true,
      admin: {
        description: 'Optionaler Titel über dem Video',
      },
    },

    // Video Source Selection
    {
      name: 'videoSource',
      type: 'select',
      required: true,
      defaultValue: 'youtube',
      label: 'Video-Quelle',
      options: [
        { label: 'YouTube', value: 'youtube' },
        { label: 'Vimeo', value: 'vimeo' },
        { label: 'Eigene URL', value: 'custom' },
      ],
    },

    // YouTube URL
    {
      name: 'youtubeUrl',
      type: 'text',
      label: 'YouTube-URL',
      admin: {
        description: 'z.B. https://www.youtube.com/watch?v=VIDEO_ID oder https://youtu.be/VIDEO_ID',
        condition: (_, siblingData) => siblingData?.videoSource === 'youtube',
      },
      validate: (
        value: string | undefined | null,
        { siblingData }: { siblingData?: Record<string, unknown> }
      ) => {
        if (siblingData?.videoSource !== 'youtube') return true
        if (!value) return 'YouTube-URL ist erforderlich'

        // Check for valid YouTube URL patterns
        const youtubePatterns = [
          /youtube\.com\/watch\?v=/,
          /youtu\.be\//,
          /youtube\.com\/embed\//,
          /youtube\.com\/shorts\//,
          /youtube-nocookie\.com\/embed\//,
        ]

        const isValidYouTube = youtubePatterns.some((pattern) => pattern.test(value))
        if (!isValidYouTube) {
          return 'Bitte eine gültige YouTube-URL eingeben'
        }
        return true
      },
    },

    // Vimeo URL
    {
      name: 'vimeoUrl',
      type: 'text',
      label: 'Vimeo-URL',
      admin: {
        description: 'z.B. https://vimeo.com/VIDEO_ID',
        condition: (_, siblingData) => siblingData?.videoSource === 'vimeo',
      },
      validate: (
        value: string | undefined | null,
        { siblingData }: { siblingData?: Record<string, unknown> }
      ) => {
        if (siblingData?.videoSource !== 'vimeo') return true
        if (!value) return 'Vimeo-URL ist erforderlich'

        // Check for valid Vimeo URL patterns
        const vimeoPatterns = [/vimeo\.com\/\d+/, /player\.vimeo\.com\/video\/\d+/]

        const isValidVimeo = vimeoPatterns.some((pattern) => pattern.test(value))
        if (!isValidVimeo) {
          return 'Bitte eine gültige Vimeo-URL eingeben'
        }
        return true
      },
    },

    // Custom URL
    {
      name: 'customUrl',
      type: 'text',
      label: 'Video-URL',
      admin: {
        description: 'Direkte URL zu einer MP4, WebM oder anderen Video-Datei',
        condition: (_, siblingData) => siblingData?.videoSource === 'custom',
      },
      validate: (
        value: string | undefined | null,
        { siblingData }: { siblingData?: Record<string, unknown> }
      ) => {
        if (siblingData?.videoSource !== 'custom') return true
        if (!value) return 'Video-URL ist erforderlich'

        try {
          new URL(value)
          return true
        } catch {
          return 'Bitte eine gültige URL eingeben'
        }
      },
    },

    // Custom Thumbnail
    {
      name: 'thumbnail',
      type: 'upload',
      relationTo: 'media',
      label: 'Vorschaubild',
      admin: {
        description:
          'Optional: Eigenes Vorschaubild. Bei YouTube wird automatisch das Thumbnail verwendet.',
      },
    },

    // Caption
    {
      name: 'caption',
      type: 'text',
      localized: true,
      label: 'Bildunterschrift',
      admin: {
        description: 'Optionaler Text unter dem Video',
      },
    },

    // Privacy & Performance
    {
      name: 'privacyMode',
      type: 'checkbox',
      defaultValue: true,
      label: 'Privacy Mode',
      admin: {
        description: 'YouTube: Verwendet youtube-nocookie.com für besseren Datenschutz',
      },
    },
    {
      name: 'lazyLoad',
      type: 'checkbox',
      defaultValue: true,
      label: 'Lazy Loading',
      admin: {
        description: 'Video erst laden, wenn es im Viewport sichtbar ist',
      },
    },

    // Display Options
    {
      name: 'aspectRatio',
      type: 'select',
      defaultValue: '16:9',
      options: aspectRatioOptions,
      label: 'Seitenverhältnis',
    },
    {
      name: 'maxWidth',
      type: 'select',
      defaultValue: 'large',
      options: maxWidthOptions,
      label: 'Maximale Breite',
    },

    // Playback Options
    {
      name: 'playbackOptions',
      type: 'group',
      label: 'Wiedergabe-Optionen',
      fields: [
        {
          name: 'autoplay',
          type: 'checkbox',
          defaultValue: false,
          label: 'Autoplay',
          admin: {
            description: 'Automatisch abspielen (erfordert Mute für die meisten Browser)',
          },
        },
        {
          name: 'muted',
          type: 'checkbox',
          defaultValue: false,
          label: 'Stumm',
          admin: {
            description: 'Video stumm abspielen',
          },
        },
        {
          name: 'loop',
          type: 'checkbox',
          defaultValue: false,
          label: 'Endlosschleife',
        },
        {
          name: 'showControls',
          type: 'checkbox',
          defaultValue: true,
          label: 'Steuerung anzeigen',
        },
        {
          name: 'startTime',
          type: 'number',
          min: 0,
          label: 'Startzeit (Sekunden)',
          admin: {
            description: 'Video ab dieser Sekunde starten',
          },
        },
      ],
    },

    // Styling
    {
      name: 'style',
      type: 'group',
      label: 'Darstellung',
      fields: [
        {
          name: 'alignment',
          type: 'select',
          defaultValue: 'center',
          label: 'Ausrichtung',
          options: [
            { label: 'Links', value: 'left' },
            { label: 'Mitte', value: 'center' },
            { label: 'Rechts', value: 'right' },
          ],
        },
        {
          name: 'borderRadius',
          type: 'select',
          defaultValue: 'md',
          label: 'Eckenradius',
          options: [
            { label: 'Keine', value: 'none' },
            { label: 'Klein', value: 'sm' },
            { label: 'Mittel', value: 'md' },
            { label: 'Groß', value: 'lg' },
          ],
        },
        {
          name: 'shadow',
          type: 'checkbox',
          defaultValue: true,
          label: 'Schatten',
        },
      ],
    },
  ],
}
