import { defineCollection, defineConfig } from "@content-collections/core";
import { compileMDX } from "@content-collections/mdx";
import rehypePrettyCode from "rehype-pretty-code";
import remarkGfm from "remark-gfm";
import { z } from "zod";

const MDX_EXTENSION_REGEX = /\.mdx$/;
const WHITESPACE_REGEX = /\s+/;

const blogPosts = defineCollection({
  name: "blogPosts",
  directory: "content/blog",
  include: "**/*.mdx",
  schema: z.object({
    title: z.string(),
    description: z.string(),
    date: z.string(),
    author: z.string().default("ElevaSEO"),
    category: z.string(),
    tags: z.array(z.string()).default([]),
    keywords: z.array(z.string()).optional(),
    image: z.string().optional(),
    imageAlt: z.string(),
    lastmod: z.string(),
    authorImage: z.string(),
    authorTwitter: z.string(),
    isFamilyFriendly: z.boolean(),
    published: z.boolean().default(true),
    locale: z.enum(["fr", "en"]),
    translationKey: z.string(),
    content: z.string(),
  }),
  transform: async (document, context) => {
    const mdx = await compileMDX(context, document, {
      remarkPlugins: [remarkGfm],
      rehypePlugins: [
        [
          rehypePrettyCode,
          {
            theme: "github-dark",
            keepBackground: true,
          },
        ],
      ],
    });

    // Extract locale and slug from path: "fr/my-post.mdx" -> locale: "fr", slug: "my-post"
    const pathParts = document._meta.path.split("/");
    const locale = pathParts[0];
    const slug = (pathParts.at(-1) ?? "").replace(MDX_EXTENSION_REGEX, "");

    const categorySlug = document.category
      .toLowerCase()
      .replace(/[^a-z0-9\s-]/g, "")
      .replace(/\s+/g, "-");

    const words = document.content.trim().split(WHITESPACE_REGEX).length;
    const readingTime = Math.max(1, Math.ceil(words / 200));
    const localePrefix = locale === "fr" ? "" : `/${locale}`;
    const canonical = `${localePrefix}/blog/${categorySlug}/${slug}`;

    return {
      ...document,
      code: mdx as unknown as string,
      locale,
      slug,
      categorySlug,
      readingTime,
      wordCount: words,
      lastmod: document.lastmod,
      imageAlt: document.imageAlt,
      authorImage: document.authorImage,
      keywords: document.keywords ?? document.tags,
      canonical,
    };
  },
});

export default defineConfig({
  content: [blogPosts],
});
