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

const linkSchema = z.object({
  type: z.enum(["definition", "appui", "transposition"]),
  target: z.string().min(1), // URL interne (ex: /glossaire/archicratie/) ou slug
  note: z.string().optional()
});

const baseTextSchema = z.object({
  title: z.string().min(1),
  level: z.union([z.literal(1), z.literal(2), z.literal(3)]).default(1),
  version: z.string().min(1),
  concepts: z.array(z.string().min(1)).default([]),
  links: z.array(linkSchema).default([]),
  // optionnels mais utiles dès maintenant
  order: z.number().int().nonnegative().optional(),
  summary: z.string().optional()
});

// Éditions (séparation stricte : edition + status verrouillés par collection)
const traite = defineCollection({
  type: "content",
  schema: baseTextSchema.extend({
    edition: z.literal("traite"),
    status: z.literal("theorie_fondamentale")
  })
});

const archicratie = defineCollection({
  type: "content",
  schema: baseTextSchema.extend({
    edition: z.literal("archicratie"),
    status: z.literal("modele_sociopolitique")
  })
});

const ia = defineCollection({
  type: "content",
  schema: baseTextSchema.extend({
    edition: z.literal("ia"),
    status: z.literal("application")
  })
});

const atlas = defineCollection({
  type: "content",
  schema: baseTextSchema.extend({
    edition: z.literal("atlas"),
    status: z.literal("cartographie")
  })
});

// Glossaire (référentiel terminologique)
const glossaire = defineCollection({
  type: "content",
  schema: z.object({
    title: z.string().min(1), // Titre public (souvent identique au terme)
    term: z.string().min(1),  // Terme canonique
    aliases: z.array(z.string().min(1)).default([]),
    edition: z.literal("glossaire"),
    status: z.literal("referentiel"),
    version: z.string().min(1),
    // Micro-définition affichable en popover (courte, stable)
    definitionShort: z.string().min(1),
    concepts: z.array(z.string().min(1)).default([]),
    // Liens typés (vers ouvrages ou autres termes)
    links: z.array(linkSchema).default([])
  })
});

export const collections = {
  traite,
  archicratie,
  ia,
  glossaire,
  atlas
};
