import { globSync } from "glob";
import { viteStaticCopy } from "vite-plugin-static-copy";
import { PluginOption } from "vite";
import Handlebars from "handlebars";
import path from "path";

export const handlebars = (
  options: { vars?: Record<string, any> } = {},
): PluginOption[] => {
  const files = globSync("src/assets/**/**.hbs");

  function render(content: string): string {
    const template = Handlebars.compile(content);
    return template(options?.vars ?? {});
  }

  return [
    {
      name: "hbs-templating",
      enforce: "pre",
      transformIndexHtml: {
        order: "pre",
        handler(html) {
          return render(html);
        },
      },
    },
    viteStaticCopy({
      silent: true,
      targets: files.map((file) => ({
        src: file,
        dest: "",
        rename: path.basename(file).slice(0, -4), // remove .hbs file extension
        transform: {
          encoding: "utf8",
          handler(content: string) {
            return render(content);
          },
        },
      })),
    }),
  ];
};
