import { defineCollection, defineContentConfig, z } from "@nuxt/content";

const createBaseSchema = () =>
  z.object({
    title: z.string(),
    description: z.string(),
  });

const createButtonSchema = () =>
  z.object({
    label: z.string(),
    icon: z.string().optional(),
    to: z.string().optional(),
    color: z
      .enum(["primary", "neutral", "success", "warning", "error", "info"])
      .optional(),
    size: z.enum(["xs", "sm", "md", "lg", "xl"]).optional(),
    variant: z
      .enum(["solid", "outline", "subtle", "soft", "ghost", "link"])
      .optional(),
    target: z.enum(["_blank", "_self"]).optional(),
  });

const createImageSchema = () =>
  z.object({
    src: z.string().editor({ input: "media" }),
    alt: z.string(),
  });

const createAuthorSchema = () =>
  z.object({
    name: z.string(),
    description: z.string().optional(),
    username: z.string().optional(),
    twitter: z.string().optional(),
    to: z.string().optional(),
    avatar: createImageSchema().optional(),
  });

const createTestimonialSchema = () =>
  z.object({
    quote: z.string(),
    author: createAuthorSchema(),
  });

export default defineContentConfig({
  collections: {
    index: defineCollection({
      type: "page",
      source: "index.yml",
      schema: z.object({
        hero: z.object({
          links: z.array(createButtonSchema()),
          images: z.array(createImageSchema()),
        }),
        about: createBaseSchema(),
        experience: createBaseSchema().extend({
          items: z.array(
            z.object({
              date: z.date(),
              position: z.string(),
              company: z.object({
                name: z.string(),
                url: z.string(),
                logo: z.string().editor({ input: "icon" }).optional(),
                image: z.string().editor({ input: "media" }).optional(),
                color: z.string(),
              }),
            }),
          ),
        }),
        testimonials: z.array(createTestimonialSchema()),
        blog: createBaseSchema(),
        faq: createBaseSchema().extend({
          categories: z.array(
            z.object({
              title: z.string().nonempty(),
              questions: z.array(
                z.object({
                  label: z.string().nonempty(),
                  content: z.string().nonempty(),
                }),
              ),
            }),
          ),
        }),
      }),
    }),
    projects: defineCollection({
      type: "data",
      source: "projects/*.yml",
      schema: z.object({
        title: z.string().nonempty(),
        description: z.string().nonempty(),
        image: z.string().nonempty().editor({ input: "media" }),
        url: z.string().nonempty(),
        tags: z.array(z.string()),
        date: z.date(),
      }),
    }),
    blog: defineCollection({
      type: "page",
      source: "blog/*.md",
      schema: z.object({
        minRead: z.number(),
        date: z.date(),
        image: z.string().nonempty().editor({ input: "media" }),
        author: createAuthorSchema(),
      }),
    }),
    pages: defineCollection({
      type: "page",
      source: [{ include: "projects.yml" }, { include: "blog.yml" }],
      schema: z.object({
        links: z.array(createButtonSchema()),
      }),
    }),
    speaking: defineCollection({
      type: "page",
      source: "speaking.yml",
      schema: z.object({
        links: z.array(createButtonSchema()),
        events: z.array(
          z.object({
            category: z.enum(["Live talk", "Podcast", "Conference"]),
            title: z.string(),
            date: z.date(),
            location: z.string(),
            url: z.string().optional(),
          }),
        ),
      }),
    }),
    about: defineCollection({
      type: "page",
      source: "about.yml",
      schema: z.object({
        content: z.object({}),
        images: z.array(createImageSchema()),
      }),
    }),
  },
});
