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

const reviews = defineCollection({
  loader: glob({
    pattern: ["*.md", "!_template.md"],
    base: "./src/content/reviews",
  }),
  schema: z
    .object({
      title: z.string(),
      company: z.string(),
      website: z.string().url(),
      location: z.string(),
      category: z.string(),
      date: z.coerce.date().optional(),
      draft: z.boolean().default(true),

      for_who: z.string(),
      price_from: z.string(),
      hosting: z.string(),

      // Optioneel zolang draft: true — een concept mag nog geen score/oordeel
      // hebben. Zodra draft: false wordt gezet, dwingt de refine hieronder af
      // dat beide echt ingevuld zijn (voorkomt een leeg/0-sterren oordeel dat
      // per ongeluk gepubliceerd wordt).
      score: z.number().int().min(1).max(5).optional(),
      verdict: z.string().optional().default(""),

      // Alleen voor een eventueel echt merklogo (public/logos/...). De kleur van
      // de gegenereerde placeholder-cover wordt niet hier gekozen, maar
      // automatisch afgeleid van `category` — zie src/lib/category.ts.
      logo: z.string().optional().default(""),
    })
    .superRefine((data, ctx) => {
      if (data.draft) return;
      if (data.score === undefined) {
        ctx.addIssue({
          code: z.ZodIssueCode.custom,
          path: ["score"],
          message: "score (1-5) is verplicht zodra draft: false staat",
        });
      }
      if (!data.verdict) {
        ctx.addIssue({
          code: z.ZodIssueCode.custom,
          path: ["verdict"],
          message: "verdict mag niet leeg zijn zodra draft: false staat",
        });
      }
    }),
});

export const collections = { reviews };
