import { addTemplate, useNuxt } from "@nuxt/kit";
import { setColors } from "./utils/colors";
import { generateSafelist } from "./utils/colors";

// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
  devtools: { enabled: true },
  compatibilityDate: "2024-11-15",
  modules: ["@nuxtjs/tailwindcss"],
  hooks: {
    "tailwindcss:config": (tailwindConfig) => {
      const nuxt = useNuxt();

      tailwindConfig.theme = tailwindConfig.theme || {};
      tailwindConfig.theme.extend = tailwindConfig.theme.extend || {};
      tailwindConfig.theme.extend.colors =
        tailwindConfig.theme.extend.colors || {};

      const colors = setColors(tailwindConfig.theme);

      // generate safelist and inject it into tailwindConfig
      const safelist = generateSafelist(
        ["primary", "amber", "violet", "red", "emerald", "cyan"],
        colors
      );
      tailwindConfig.safelist = safelist;

      // inject colors into appConfig
      nuxt.options.appConfig.rayui = nuxt.options.appConfig.rayui || {};
      nuxt.options.appConfig.rayui.colors = colors;

      const template = addTemplate({
        filename: "ray.colors.mjs",
        getContents: () =>
          `export default ${JSON.stringify(
            nuxt.options.appConfig.rayui.colors
          )};`,
        write: true,
      });
      const typesTemplate = addTemplate({
        filename: "ray.colors.d.ts",
        getContents: () =>
          `declare module '#ray-colors' { const defaultExport: ${JSON.stringify(
            nuxt.options.appConfig.rayui.colors
          )}; export default defaultExport; }`,
        write: true,
      });

      nuxt.options.alias["#ray-colors"] = template.dst;

      nuxt.hook("prepare:types", (opts) => {
        opts.references.push({ path: typesTemplate.dst });
      });
    },
  },
  components: [
    {
      path: "./components",
      prefix: "Ray",
      pathPrefix: false,
    },
    {
      path: "./components/icons",
      prefix: "Icon",
      pathPrefix: false,
    },
  ],
});