import { defineConfig, loadEnv } from 'vite'; // 导入 Vite 的定义配置函数和环境变量加载函数
import vue from '@vitejs/plugin-vue'; // 导入 Vue 插件，使 Vite 支持 .vue 文件
import path from 'path'; // Node.js 标准库，用于处理和转换文件路径
import AutoImport from 'unplugin-auto-import/vite'; // 自动导入 API 插件
import Components from 'unplugin-vue-components/vite'; // 自动注册组件插件
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'; // 组件解析器，用于自动导入 Element Plus 组件
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; // SVG 图标插件，将 SVG 文件转化为 Vue 组件
import viteCompression from 'vite-plugin-compression'; // 压缩构建输出文件的插件

// ESLint 插件，用于在开发期间进行代码检查
import eslintPlugin from 'vite-plugin-eslint';

export default defineConfig(({ command }) => ({
  plugins: [
    vue(), // 启用 Vue 插件

    // 创建 SVG 图标插件实例，配置图标目录和生成的 symbol ID 模板
    createSvgIconsPlugin({
      iconDirs: [path.resolve(process.cwd(), 'src/icons/svg')],
      symbolId: 'icon-[dir]-[name]'
    }),

    // 配置 AutoImport 插件以自动导入指定模块中的内容
    AutoImport({
      imports: ['vue', 'vue-router'], // 指定要自动导入的模块
      dirs: ['src/hooks/**', 'src/stores/**', 'src/utils/**'], // 包含自定义钩子、状态管理、工具函数的目录
      resolvers: command === 'build' ? [ElementPlusResolver()] : [], // 构建时使用 ElementPlusResolver 解析器
      dts: 'src/auto-import/imports.d.ts', // 自动生成类型声明文件的位置
      eslintrc: {
        enabled: false // 禁用对 .eslintrc 文件的自动更新
      }
    }),

    // 自动注册来自特定目录的 Vue 组件，并可选地使用解析器来处理第三方库中的组件
    Components({
      dirs: ['src/components'], // 包含组件的目录
      resolvers: command === 'build' ? [ElementPlusResolver()] : [], // 构建时使用 ElementPlusResolver 解析器
      dts: 'src/auto-import/components.d.ts' // 自动生成类型声明文件的位置
    }),

    // 使用 ESLint 插件检查 JavaScript 和 Vue 文件
    eslintPlugin({
      include: ['src/**/*.js', 'src/**/*.vue', 'src/*.js', 'src/*.vue'] // 指定要检查的文件模式
    }),

    // 对超过 1KB 的文件启用 gzip 或 brotli 压缩
    viteCompression({
      threshold: 1000,
    })
  ],

  // 开发服务器配置
  server: {
    host: true, // 允许外部访问
    port: 9527, // 设置服务端口
    open: true // 在启动时自动打开浏览器
  },

  // 路径别名配置
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'), // 将 @ 替换为 src 目录的绝对路径
      'vue-i18n': 'vue-i18n/dist/vue-i18n.cjs.js' // 强制使用兼容性更好的 vue-i18n 版本
    }
  },

  // 构建选项
  build: {
    base: './', // 构建后的资源基础路径
    rollupOptions: {
      output: {
        chunkFileNames: 'static/js/[name]-[hash].js', // 动态导入的代码分割块命名规则
        entryFileNames: 'static/js/[name]-[hash].js', // 入口文件命名规则
        assetFileNames: 'static/[ext]/[name]-[hash].[ext]', // 静态资源（如图片、字体等）命名规则

        // 手动拆分 chunks，通常用于优化包大小和缓存策略
        manualChunks(id) {
          if (id.includes('node_modules')) {
            if (id.toString().indexOf('.pnpm/') !== -1) {
              return id.toString().split('.pnpm/')[1].split('/')[0].toString();
            } else if (id.toString().indexOf('node_modules/') !== -1) {
              return id.toString().split('node_modules/')[1].split('/')[0].toString();
            }
          }
        }
      }
    },
    sourcemap: false, // 是否生成 source map 文件
    target: 'es2015', // 设置打包后代码的目标浏览器或 Node.js 版本
    reportCompressedSize: false // 不报告压缩后的包大小
  }
}));
