import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import path from "path";
import mkcert from "vite-plugin-mkcert";
import { readFileSync } from "fs";

// https://vitejs.dev/config/
export default defineConfig(({ command, mode }) => {
  const isProduction = mode === "production";
  const timestamp = Date.now();

  // Đọc version từ package.json
  const packageJson = JSON.parse(readFileSync("package.json", "utf8"));
  const appVersion = `${packageJson.version}-${timestamp}`;

  return {
    https: !isProduction, // Chỉ sử dụng HTTPS cho development
    hmr: !isProduction
      ? {
          host: "localhost",
          port: 5173,
          protocol: "wss",
        }
      : undefined,
    plugins: [vue(), ...(isProduction ? [] : [mkcert()])],
    define: {
      __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: false,
      __BUILD_TIMESTAMP__: JSON.stringify(timestamp),
      __APP_VERSION__: JSON.stringify(appVersion),
      __PACKAGE_VERSION__: JSON.stringify(packageJson.version),
    },
    resolve: {
      alias: {
        "@": path.resolve(__dirname, "./src"),
      },
    },
    build: {
      target: "es2020", // Hỗ trợ BigInt và các tính năng mới hơn
      outDir: "dist", // Build ra thư mục dist
      assetsDir: "assets",
      sourcemap: false, // Tắt sourcemap cho production
      minify: "terser", // Sử dụng terser để minify
      terserOptions: {
        compress: {
          drop_console: true, // Loại bỏ console.log
          drop_debugger: true, // Loại bỏ debugger
          pure_funcs: [
            "console.log",
            "console.info",
            "console.debug",
            "console.warn",
          ], // Loại bỏ console functions
        },
        mangle: {
          safari10: true, // Tối ưu cho Safari
        },
      },
      rollupOptions: {
        output: {
          manualChunks: {
            // Tách vendor libraries thành chunks riêng
            vendor: ["vue", "vue-router", "pinia"],
            ui: ["bootstrap", "@popperjs/core"],
            utils: ["lodash", "moment", "axios"],
            editor: ["@tinymce/tinymce-vue"],
          },
          // Tối ưu hóa tên file với hash dài hơn để tránh cache
          chunkFileNames: "js/[name]-[hash:12].js",
          entryFileNames: "js/[name]-[hash:12].js",
          assetFileNames: (assetInfo) => {
            const info = assetInfo.name.split(".");
            const ext = info[info.length - 1];
            if (/\.(css)$/.test(assetInfo.name)) {
              return `css/[name]-[hash:12].${ext}`;
            }
            if (/\.(png|jpe?g|svg|gif|tiff|bmp|ico)$/i.test(assetInfo.name)) {
              return `images/[name]-[hash:12].${ext}`;
            }
            if (/\.(woff|woff2|ttf|eot)$/i.test(assetInfo.name)) {
              return `fonts/[name]-[hash:12].${ext}`;
            }
            return `assets/[name]-[hash:12].${ext}`;
          },
        },
      },
      // Tối ưu hóa chunk size
      chunkSizeWarningLimit: 1000,
      // Tối ưu hóa CSS
      cssCodeSplit: true,
      // Tối ưu hóa assets
      assetsInlineLimit: 4096, // Inline assets nhỏ hơn 4KB
    },
    // Tối ưu hóa cho production
    optimizeDeps: {
      include: [
        "vue",
        "vue-router",
        "pinia",
        "axios",
        "lodash",
        "moment",
        "bootstrap",
        "@popperjs/core",
      ],
      exclude: [
        "@tinymce/tinymce-vue", // Exclude tinymce để lazy load
      ],
    },
    // Tối ưu hóa server
    server: {
      port: 5173,
      host: "localhost",
    },
    // Tối ưu hóa preview
    preview: {
      port: 4173,
      host: "localhost",
    },
  };
});
