import { defineConfig } from "vite";
import { sentryVitePlugin } from "@sentry/vite-plugin";

import vue from "@vitejs/plugin-vue";
import gql from "@rollup/plugin-graphql";
import path from "path";

const getFlavorConfig = () => {
  switch (process.env.APP_FLAVOR) {
    case "my-kv":
      return require("./config/prod-my-kv.env.js").default;
    case "my-dhf":
      return require("./config/prod-dhf.env.js").default;
    case "my-dha":
      return require("./config/prod-dha.env.js").default;
  }
  return {};
};

function resolve(dir: string) {
  return path.join(__dirname, dir);
}

const define = {
  "import.meta.env.HEP_URL": JSON.stringify(process.env.HEP_URL),
  "import.meta.env.MATOMO_HOST": JSON.stringify(process.env.MATOMO_HOST),
  "import.meta.env.MATOMO_SITE_ID": JSON.stringify(process.env.MATOMO_SITE_ID),
  "import.meta.env.LOGOUT_REDIRECT_URL": JSON.stringify(
    process.env.LOGOUT_REDIRECT_URL
  ),
  "import.meta.env.VUE_APP_FLAVOR": JSON.stringify(process.env.APP_FLAVOR),
  "import.meta.env.SENTRY_DSN": JSON.stringify(
    process.env.SENTRY_JAVASCRIPT_DSN
  ),
  "import.meta.env.SENTRY_ENVIRONMENT": JSON.stringify(process.env.SENTRY_ENV),
  /*
   * ENV variables used in JS code need to be stringyfied, as they will be replaced (in place) in the code,
   * and JS needs quotes around strings
   * see https://cli.vuejs.org/guide/mode-and-env.html#using-env-variables-in-client-side-code
   */
  "import.meta.env.VUE_APP_ENABLE_SPELLCHECK": !!process.env.TASKBASE_BASEURL,
};

const flavorConfig = getFlavorConfig();

const htmlPlugin = () => {
  return {
    name: "html-transform",
    transformIndexHtml(html: string) {
      return html
        .replace(/_APP_TITLE_/, flavorConfig.VUE_APP_TITLE || "mySkillbox")
        .replace(
          /_FAVICON_16_/,
          flavorConfig.VUE_APP_FAVICON_16 || "/static/favicon-16x16.png"
        )
        .replace(
          /_FAVICON_32_/,
          flavorConfig.VUE_APP_FAVICON_32 || "/static/favicon-32x32.png"
        );
    },
  };
};

const disableSentryPlugin = !process.env.SENTRY_AUTH_TOKEN; // disable the plugin when we're not in an environment that is connected to sentry

// https://vitejs.dev/config/
export default defineConfig({
  build: {
    assetsDir: "static",
    sourcemap: true, // Source map generation must be turned on
  },
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: process.env.THEME
          ? `@import "styles/themes/_${process.env.THEME}.scss";`
          : "",
      },
    },
    devSourcemap: true,
  },
  resolve: {
    alias: {
      "@": resolve("./src"),
      styles: resolve("./src/styles"),
      gql: resolve("./src/graphql/gql"),
    },
  },
  server: {
    port: 8080,
    hmr: {
      clientPort: 8080,
    },
  },
  plugins: [
    gql(),
    vue(),
    htmlPlugin(),
    sentryVitePlugin({
      authToken: process.env.SENTRY_AUTH_TOKEN,
      org: "iterativ",
      disable: disableSentryPlugin,
      project: "skillbox-vue",
    }),
  ],
  define,
});
