import type { Plugin } from "prettier";

type Parser = { parser: string; plugins: Plugin[] };

const prettyLanguages = new Set([
  "json",
  "javascript",
  "typescript",
  "css",
  "sass",
  "less",
  "html",
  "markdown",
]);

export const getLanguageParser = async (
  language: string
): Promise<Parser | undefined> => {
  if (language === "javascript" || language === "typescript") {
    return {
      parser: "babel",
      plugins: [await import("prettier/parser-babel")],
    };
  }
  if (language === "css" || language === "sass" || language === "less") {
    return {
      parser: language,
      plugins: [await import("prettier/parser-postcss")],
    };
  }
  if (language === "html") {
    return {
      parser: "html",
      plugins: [await import("prettier/parser-html")],
    };
  }
  if (language === "markdown") {
    return {
      parser: "markdown",
      plugins: [await import("prettier/parser-markdown")],
    };
  }

  return undefined;
};

export const isPrettyLanguage = (language: string): boolean =>
  prettyLanguages.has(language.toLowerCase());

export const prettyPrint = async (
  language: string,
  code: string
): Promise<string> => {
  const lcLanguage = language.toLowerCase();

  if (lcLanguage === "json") {
    return JSON.stringify(JSON.parse(code), undefined, 2);
  }

  const prettier = await import("prettier/standalone");

  return prettier.format(code, await getLanguageParser(lcLanguage));
};
