import vue from '@vitejs/plugin-vue';
import { resolve } from 'path';
import { ConfigEnv, defineConfig, loadEnv } from 'vite';
import vueJsx from '@vitejs/plugin-vue-jsx';
import compression from 'vite-plugin-compression';
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import { lazyImport, VxeResolver } from 'vite-plugin-lazy-import'


const pathResolve = (dir: string) => {
  return resolve(__dirname, '.', dir);
};

const alias: Record<string, string> = {
  '/@': pathResolve('./src/'),
  '@views': pathResolve('./src/views'),
  'vue-i18n': 'vue-i18n/dist/vue-i18n.cjs.js',
  '@dvaformflow': pathResolve('./src/viwes/plugins/dvaadmin_form_flow/src/')
};

const viteConfig = defineConfig((mode: ConfigEnv) => {
  const env = loadEnv(mode.mode, process.cwd());
  return {
    plugins: [
      vue(),
      vueJsx(),
      // vueSetupExtend()
      compression({
        algorithm: 'gzip', // 使用 gzip 压缩
        ext: '.gz', // 输出的文件扩展名
        threshold: 10240, // 只有大小大于该值的资源会被压缩（默认 10KB）
        deleteOriginFile: false, // 是否删除原始未压缩的文件
      }),
      AutoImport({
        imports: [
          'vue',
          'vue-router',
          'pinia',
          {
            'dayjs': [
              // 默认导入
              ['default', 'dayjs']
            ]
          },
        ],
        resolvers: [ElementPlusResolver()],
        dts: 'src/auto-imports.d.ts', // 生成 TypeScript 声明文件
      }),
      Components({
        // resolvers: [ElementPlusResolver()],
      }),
      lazyImport({
        resolvers: [
          VxeResolver({
            libraryName: 'vxe-table'
          }),
          VxeResolver({
            libraryName: 'vxe-pc-ui'
          })
        ]
      })
    ],
    root: process.cwd(),
    resolve: { alias },
    base: mode.command === 'serve' ? './' : env.VITE_PUBLIC_PATH,
    optimizeDeps: {
      include: [ 'element-plus/es/locale/lang/zh-cn', 'element-plus/es/locale/lang/en', 'element-plus/es/locale/lang/zh-tw' ]
    },
    server: {
      host: '0.0.0.0',
      port: env.VITE_PORT as unknown as number,
      open: false,
      hmr: true,
      proxy: {
        '/gitee': {
          target: 'https://gitee.com',
          ws: true,
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/gitee/, '')
        }
      }
    },
    build: {
      outDir: env.VITE_DIST_PATH || 'dist',
      chunkSizeWarningLimit: 1500,
      rollupOptions: {
        output: {
          entryFileNames: `assets/[name].[hash].js`,
          chunkFileNames: `assets/[name].[hash].js`,
          assetFileNames: `assets/[name].[hash].[ext]`,
          compact: true,
          manualChunks: {
            vue: [ 'vue', 'vue-router', 'pinia' ],
            echarts: [ 'echarts' ],
            elementPlus: ['element-plus'],
          },
          // manualChunks(id) {
          //   if (id.includes('node_modules')) {
          //     return 'vendor';
          //   }
          // }
        }
      }
    },
    css: { preprocessorOptions: { css: { charset: false } } },
    define: {
      __VUE_I18N_LEGACY_API__: JSON.stringify(false),
      __VUE_I18N_FULL_INSTALL__: JSON.stringify(false),
      __INTLIFY_PROD_DEVTOOLS__: JSON.stringify(false),
      __VERSION__: JSON.stringify(process.env.npm_package_version)
    }
  };
});

export default viteConfig;
