import { ConfigEnv, defineConfig, loadEnv, UserConfigExport } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import { resolve } from 'path'
import viteCompression from 'vite-plugin-compression'
import { ArcoResolver } from 'unplugin-vue-components/resolvers'
import Components from 'unplugin-vue-components/vite'
import AutoImport from 'unplugin-auto-import/vite'

const autoImport = AutoImport({
  imports: ['vue', 'vue-router', '@vueuse/core'],
  resolvers: [ArcoResolver()],
  eslintrc: {
    enabled: true
  }
})
// Ensure .d.ts file is created when running `vite optimize`
autoImport.buildStart()

// https://vitejs.dev/config/
export default async (config: ConfigEnv): Promise<UserConfigExport> => {
  return defineConfig({
    plugins: [
      vue(),
      vueJsx(),
      viteCompression(),
      autoImport,
      Components({
        resolvers: [
          ArcoResolver({
            sideEffect: false
          }),
          {
            type: 'component',
            resolve: (name: string) => {
              if (name === 'IconPark') {
                return {
                  name,
                  from: '@icon-park/vue-next/es/all'
                }
              }
              return undefined
            }
          }
        ],
        dirs: ['src/components'],
        extensions: ['vue']
      })
    ],
    css: {
      preprocessorOptions: {
        scss: { charset: false }
        // less: {
        //   modifyVars: {
        //     'arcoblue-1': '#E8FAFF',
        //     'arcoblue-2': '#B0E0F2',
        //     'arcoblue-3': '#7DC5E4',
        //     'arcoblue-4': '#4EA9D7',
        //     'arcoblue-5': '#258DC9',
        //     'arcoblue-6': '#0071bc',
        //     'arcoblue-7': '#005BA0',
        //     'arcoblue-8': '#004784',
        //     'arcoblue-9': '#003468',
        //     'arcoblue-10': '#00244D'
        //   },
        //   javascriptEnabled: true
        // }
      }
    },
    resolve: {
      alias: {
        '@': resolve(__dirname, 'src') // 设置 `@` 指向 `src` 目录
      }
    },
    build: {
      manifest: true,
      cssCodeSplit: true, // 如果设置为false，整个项目中的所有 CSS 将被提取到一个 CSS 文件中
      sourcemap: false, // 构建后是否生成 source map 文件。如果为 true，将会创建一个独立的 source map 文件
      target: 'modules', // 设置最终构建的浏览器兼容目标。默认值是一个 Vite 特有的值——'modules'  还可设置为 'es2015' 'es2016'等
      chunkSizeWarningLimit: 550, // 单位kb  打包后文件大小警告的限制 (文件大于此此值会出现警告)
      assetsInlineLimit: 4096, // 单位字节（1024等于1kb） 小于此阈值的导入或引用资源将内联为 base64 编码，以避免额外的 http 请求。设置为 0 可以完全禁用此项。
      minify: 'terser', // 'terser' 相对较慢，但大多数情况下构建后的文件体积更小。'esbuild' 最小化混淆更快但构建后的文件相对更大。
      terserOptions: {
        compress: {
          // eslint-disable-next-line camelcase
          drop_console: true, // 生产环境去除console
          // eslint-disable-next-line camelcase
          drop_debugger: true // 生产环境去除debugger
        }
      }
    },
    server: {
      host: '0.0.0.0',
      port: 4000, // 设置服务启动端口号
      open: true, // 设置服务启动时是否自动打开浏览器
      cors: true, // 允许跨域
      // 设置代理，根据我们项目实际情况配置
      proxy: {
        // 项目根目录新建 .env.development 文件，填入 VITE_BASE_URL=http://xxx
        '/webapi': {
          target: loadEnv(config.mode, process.cwd()).VITE_HTTP_BASE_URL || 'http://127.0.0.1:8020',
          changeOrigin: true,
          secure: false,
          rewrite: (path) => path.replace('/webapi/', '/')
        },
        '/sys/file': {
          target: loadEnv(config.mode, process.cwd()).VITE_HTTP_BASE_URL || 'http://127.0.0.1:8020',
          changeOrigin: true,
          secure: false,
          rewrite: (path) => path
        }
      }
    }
  })
}
