import type { ConfigEnv, UserConfig } from "vite";
import { defineConfig, loadEnv } from "vite";
import { fileURLToPath, URL } from "node:url";
import { resolve } from "path";
import { wrapperEnv } from "./node/getEnv";
import { getPluginsList } from "./node/plugins";
import { include, exclude } from "./node/optimize";
import { getNowDate } from "./src/common/utils/core/date";
import pkg from "./package.json";

const { dependencies, devDependencies, name, version } = pkg;

const __APP_INFO__ = {
  pkg: { dependencies, devDependencies, name, version }, // package.json 相关信息
  lastBuildTime: getNowDate(), // 编译或打包时间
};

// https://vitejs.dev/config/
export default defineConfig(({ command, mode }: ConfigEnv): UserConfig => {
  const env = loadEnv(mode, process.cwd());
  const viteEnv = wrapperEnv(env);

  return {
    base: env.VITE_PUBLIC_PATH,
    resolve: {
      alias: {
        "@": fileURLToPath(new URL("./src", import.meta.url)),
        "@assets": fileURLToPath(new URL("./src/common/assets", import.meta.url)),
        "@api": fileURLToPath(new URL("./src/common/api", import.meta.url)),
        "@config": fileURLToPath(new URL("./src/common/config", import.meta.url)),
        "@directives": fileURLToPath(new URL("./src/common/directives", import.meta.url)),
        "@enums": fileURLToPath(new URL("./src/common/enums", import.meta.url)),
        "@http": fileURLToPath(new URL("./src/common/http", import.meta.url)),
        "@languages": fileURLToPath(new URL("./src/common/languages", import.meta.url)),
        "@styles": fileURLToPath(new URL("./src/common/styles", import.meta.url)),
        "@utils": fileURLToPath(new URL("./src/common/utils", import.meta.url)),
        "@components": fileURLToPath(new URL("./src/components", import.meta.url)),
        "@composables": fileURLToPath(new URL("./src/composables", import.meta.url)),
        "@pinia": fileURLToPath(new URL("./src/pinia", import.meta.url)),
        "@router": fileURLToPath(new URL("./src/router", import.meta.url)),
      },
    },
    plugins: getPluginsList(command, viteEnv),
    // https://cn.vitejs.dev/config/dep-optimization-options.html#dep-optimization-options
    optimizeDeps: {
      include,
      exclude,
    },
    server: {
      // 服务器主机名，如果允许外部访问，可设置为 "0.0.0.0"
      host: "0.0.0.0",
      port: viteEnv.VITE_PORT,
      open: viteEnv.VITE_OPEN,
      cors: true,
      // 跨域代理配置
      proxy: {
        "/api": {
          target: "https://vue3-design.teek.top",
          changeOrigin: true,
          secure: true, // 是否忽略 https 安全证书问题，true 不忽略，false 忽略
          rewrite: path => path.replace(/^\/api/, ""),
        },
      },
      // 预热文件以提前转换和缓存结果，降低启动期间的初始页面加载时长并防止转换瀑布
      warmup: {
        clientFiles: ["./index.html", "./src/{views,components}/*"],
      },
    },
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: `@use "@styles/index.scss" as *;`,
        },
      },
    },
    // 打包去除 console.log && debugger
    esbuild: {
      pure: viteEnv.VITE_DROP_CONSOLE ? ["console.log"] : [],
      drop: viteEnv.VITE_DROP_DEBUGGER ? ["debugger"] : [],
    },
    build: {
      // esbuild 打包更快，terser 打包慢
      minify: "esbuild",
      // minify: "terser",
      // terserOptions: {
      //   compress: {
      //     drop_console: viteEnv.VITE_DROP_CONSOLE,
      //     drop_debugger: viteEnv.VITE_DROP_DEBUGGER,
      //   },
      // },
      outDir: env.VITE_OUT_DIR || "dist",
      sourcemap: viteEnv.VITE_SOURCEMAP,
      // 消除打包大小超过 500kb 警告
      chunkSizeWarningLimit: 4000,
      rollupOptions: {
        input: {
          index: resolve(__dirname, ".", "index.html"),
        },
        // 静态资源分类打包
        output: {
          // 拆包
          manualChunks: {
            "vue-chunks": ["vue", "vue-router", "pinia", "vue-i18n"],
            "element-plus": ["element-plus"],
          },
          chunkFileNames: "static/js/[name]-[hash].js",
          entryFileNames: "static/js/[name]-[hash].js",
          assetFileNames: "static/[ext]/[name]-[hash].[ext]",
        },
      },
      cssCodeSplit: !env.VITE_USE_CSS_SPLIT,
    },
    define: {
      __APP_INFO__: JSON.stringify(__APP_INFO__),
      __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: "true", // 去除控制台的一个警告信息
      log: {},
    },
  };
});
