import { CommentIcon } from '@sanity/icons';
import { defineField } from 'sanity';
import { languages } from '../../languages';
import { validateImage } from '../../utils/validation';

export default defineField({
  name: 'blurb',
  title: 'Blurb',
  type: 'document',
  icon: CommentIcon,
  fields: [
    defineField({
      name: 'language',
      type: 'string',
      readOnly: true,
      description: 'Language of this document.'
      // hidden: true,
    }),
    // Title
    defineField({
      name: 'title',
      title: 'Title',
      type: 'string',
      description: 'What do you want to convey?',
      validation: (Rule) => Rule.required()
    }),
    // Image
    defineField({
      name: 'image',
      title: 'Image',
      type: 'mainImage',
      validation: (Rule) => validateImage(Rule, true)
    }),
    // Text
    defineField({
      name: 'text',
      title: 'Text',
      type: 'text',
      description: 'Small text displayed below title.',
      rows: 5
    }),
    // Link
    {
      name: 'link',
      title: 'Link',
      type: 'object',
      fields: [
        {
          name: 'linkType',
          type: 'string',
          title: 'Link type',
          initialValue: 'internal',
          description: 'Link to internal or external content.',
          validation: (Rule) => Rule.required(),
          options: {
            list: ['internal', 'external'],
            layout: 'radio'
          }
        },
        {
          name: 'internalLink',
          type: 'linkInternal',
          title: 'Internal link',
          hidden: ({ parent }) => parent?.linkType !== 'internal',
          options: {
            collapsible: false
          },
          validation: (Rule) =>
            Rule.custom((value: any, context: any) => {
              if (context.parent.linkType == 'internal') {
                const currentLink = value && value.reference;
                if (!currentLink) {
                  return 'Reference is required';
                }
              }
              return true;
            })
        },
        {
          name: 'externalLink',
          type: 'linkExternal',
          title: 'External link',
          hidden: ({ parent }) => parent?.linkType !== 'external',
          options: {
            collapsible: false
          },
          validation: (Rule) =>
            Rule.custom((value: any, context: any) => {
              if (context.parent.linkType == 'external') {
                const currentTitle = value?.title;
                const currentUrl = value?.url;
                if (!currentTitle) {
                  return 'Title is required';
                } else if (!currentUrl) {
                  return 'URL is required';
                }
              }
              return true;
            })
        }
      ]
    }
  ],
  preview: {
    select: {
      title: 'title',
      image: 'image',
      language: 'language'
    },
    prepare(selection) {
      const { image, title, language } = selection;

      const currentLang = languages.find((lang) => lang.id === language);

      return {
        media: image,
        title,
        subtitle: `${currentLang ? currentLang.title : ''}`
      };
    }
  }
});
