/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import type { UserConfig, ConfigEnv } from "vite";
import vue from "@vitejs/plugin-vue";
import { loadEnv } from "vite";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import monacoEditorPlugin from "vite-plugin-monaco-editor";
import vueJsx from "@vitejs/plugin-vue-jsx";
import path from "path";
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";

const OUTPUT_DIR = "dist";
const pathSrc = path.resolve(__dirname, "./src");
// https://vitejs.dev/config/
export default ({ mode }: ConfigEnv): UserConfig => {
  const { VITE_SW_PROXY_TARGET } = loadEnv(mode, process.cwd());
  return {
    plugins: [
      vue(),
      vueJsx(),
      monacoEditorPlugin({}),
      AutoImport({
        resolvers: [ElementPlusResolver()],
        dts: path.resolve(__dirname, "./src/types/auto-imports.d.ts"),
      }),
      Components({
        resolvers: [ElementPlusResolver()],
        dts: path.resolve(__dirname, "./src/types/components.d.ts"),
      }),
      createSvgIconsPlugin({
        // Specify the icon folder to be cached
        iconDirs: [path.resolve(__dirname, "./src/assets/icons")],
        // Specify symbolId format
        symbolId: "[name]",
      }),
    ],
    resolve: {
      extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue"],
      alias: {
        "@": pathSrc,
        "vue-i18n": "vue-i18n/dist/vue-i18n.cjs.js",
      },
      preserveSymlinks: true,
    },
    css: {
      preprocessorOptions: {
        //define global scss variable
        scss: {
          additionalData: `@use "@/styles/theme.scss" as *;`,
        },
      },
    },
    server: {
      host: true,
      port: 3000,
      proxy: {
        "/graphql": {
          target: `${VITE_SW_PROXY_TARGET || "http://127.0.0.1:12800"}`,
          changeOrigin: true,
        },
        "/api": {
          target: `${VITE_SW_PROXY_TARGET || "http://127.0.0.1:12800"}`,
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/api/, ""),
        },
      },
    },
    build: {
      target: "es2015",
      outDir: OUTPUT_DIR,
      manifest: false,
      sourcemap: false,
      chunkSizeWarningLimit: 2000,
      rollupOptions: {
        output: {
          chunkFileNames: "static/js/[name]-[hash].js",
          entryFileNames: "static/js/[name]-[hash].js",
          assetFileNames: "static/[ext]/[name]-[hash].[ext]",
          manualChunks(id) {
            if (id.includes("node_modules")) {
              if (id.includes("echarts")) {
                return "echarts";
              }
              if (id.includes("element-plus")) {
                return "element-plus";
              }
              if (id.includes("monaco-editor")) {
                return "monaco-editor";
              }
              if (id.includes("d3")) {
                return "d3";
              }
            }
          },
        },
      },
    },
  };
};
