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

// Petit helper pour éviter la répétition du loader
const obsidianLoader = (path: string) =>
  glob({
    pattern: "**/[^_]*.{md,mdx}",
    base: `./src/content/${path}`,
  });

const journal = defineCollection({
  loader: obsidianLoader("journal"),
  schema: z
    .object({
      title: z.string(),
      // On rend la date plus flexible car Obsidian peut parfois envoyer des strings
      publishDate: z.coerce.date(),
      tags: z.array(z.string()).default([]),
      author: z.string().default("Artisan"),
    })
    .passthrough(),
});

const classes = defineCollection({
  loader: obsidianLoader("classes"),
  schema: z
    .object({
      title: z.string(),
      description: z.string(),
      encre: z
        .enum(["martial", "arcane", "divin", "primal", "hybride"])
        .default("martial"),
    })
    .passthrough(),
});

const especes = defineCollection({
  loader: obsidianLoader("especes"),
  schema: z
    .object({
      title: z.string(),
      description: z.string(),
      spectre: z
        .enum(["solaire", "elementaire", "terrestre", "sylvestre", "ombre"])
        .default("terrestre"),
    })
    .passthrough(),
});

const personnages = defineCollection({
  loader: obsidianLoader("personnages"),
  schema: z
    .object({
      nom: z.string(),
      espece: z.string(),
      niveau_global: z.number().default(1),
      classes_detail: z
        .array(
          z.object({
            nom: z.string(),
            niveau: z.number(),
          }),
        )
        .default([]),
    })
    .passthrough(),
});

export const collections = { journal, classes, especes, personnages };
