import { defineCollection, z } from "astro:content";
import { glob } from "astro/loaders";
import { SITE } from "@/config";

const blog = defineCollection({
  loader: glob({ pattern: "**/[^_]*.md", base: "./src/data/blog" }),
  schema: ({ image }) =>
    z.object({
      author: z.string().default(SITE.author),
      pubDatetime: z.date(),
      modDatetime: z.date().optional().nullable(),
      title: z.string(),
      featured: z.boolean().optional(),
      draft: z.boolean().optional(),
      tags: z.array(z.string()).default(["others"]),
      ogImage: image()
        .refine((img) => img.width >= 1200 && img.height >= 630, {
          message: "OpenGraph image must be at least 1200 X 630 pixels!",
        })
        .or(z.string())
        .optional(),
      description: z.string(),
      canonicalURL: z.string().optional(),
      editPost: z
        .object({
          disabled: z.boolean().optional(),
          url: z.string().optional(),
          text: z.string().optional(),
          appendFilePath: z.boolean().optional(),
        })
        .optional(),
    }),
});

const snippets = defineCollection({
  loader: glob({ pattern: "**/[^_]*.md", base: "./src/data/snippets" }),
  schema: z.object({
    title: z.string(),
    pubDateime: z.date(),
    modDatetime: z.date().nullable(),
    tags: z.array(z.string()).nullable().default(["go"]),
    description: z.string().optional(),
    editPost: z
      .object({
        url: z.string().optional(),
        text: z.string().optional(),
        appendFilePath: z.boolean().optional(),
      })
      .optional(),
  }),
});

export const collections = { blog, snippets };
