import { docsSchema, i18nSchema } from '@astrojs/starlight/schema';
import { defineCollection, reference, z } from 'astro:content';

const authors = defineCollection({
  type: 'data',
  schema: z.object({
    name: z.string(),
    twitter: z.string().url().optional(),
    linkedin: z.string().url().optional(),
    github: z.string().url().optional(),
  }),
});

const docs = defineCollection({
  schema: (ctx) =>
    docsSchema({
      extend: z.object({
        noCommentSection: z.boolean().optional().default(false),
        challengeNumber: z.union([z.number(), z.boolean()]).default(false),
        author: reference('authors').optional(),
        contributors: z.array(z.string()).optional(),
        command: z.string().optional(),
        blogLink: z.string().optional(),
        videoLink: z
          .object({
            link: z.string(),
            alt: z.string(),
            flag: z.enum(['FR']).optional(),
          })
          .optional(),
      }),
    })(ctx),
});

const i18n = defineCollection({
  type: 'data',
  schema: i18nSchema({
    extend: z
      .object({
        'page.title.challenge': z.string(),
        'author.createdBy': z.string(),
        'buttons.email': z.string(),
        'buttons.star': z.string(),
        'buttons.sponsor': z.string(),
        'buttons.clipboardCopy': z.string(),
        'challenge.footer.note': z.string(),
        'challenge.footer.running': z.string(),
        'challenge.footer.start': z.string(),
        'challenge.footer.reminder': z.string(),
        'challenge.footer.communityAnswers': z.string(),
        'challenge.footer.authorAnswer': z.string(),
        'challenge.footer.blogPost': z.string(),
        'challenge.footer.video': z.string(),
        'challenge.footer.gettingStarted.title': z.string(),
        'challenge.footer.gettingStarted.link': z.string(),
        'challenge.footer.upvoteAnswer': z.string(),
        'subscription.button': z.string(),
        'subscription.email': z.string(),
        'subscription.note.title': z.string(),
        'subscription.note.description': z.string(),
        'contributor.title': z.string(),
        'contributor.subtitle': z.string(),
      })
      .partial(),
  }),
});

export const collections = {
  docs: docs,
  i18n: i18n,
  authors: authors,
};
