import { reactRouter } from '@react-router/dev/vite';
import legacy from '@vitejs/plugin-legacy';
import react from '@vitejs/plugin-react';
import removeConsole from 'vite-plugin-remove-console';

// import wasm from 'vite-plugin-wasm'; // 代码中直接 import 'xxx.wasm' 时需要用到此插件
// import topLevelAwait from 'vite-plugin-top-level-await'; // 使用 vite-plugin-wasm 插件时需要同时引入此插件

import { viteBuildInfo } from '../buildInfo';
import { configCompressPlugin } from '../compress';
import svgConvert from '../svgConvert';

import { clientChunksPlugin } from './chunks';

import type { PluginOption } from 'vite';

/**
 * 组装插件数组。依赖渲染模式（isCSR）、环境（isProd）与 env（压缩方式）。
 * @param isCSR 是否 CSR 模式。CSR 用官方 plugin-react；SSG 用 reactRouter（接管 React 处理与入口）。二者互斥。
 * @param isProd 是否生产构建。生产才启用 removeConsole。
 * @param env 处理后的环境变量（提供 VITE_BUILD_COMPRESSION）。
 */
export function createPlugins(isCSR: boolean, isProd: boolean, env: ImportMetaEnv): PluginOption[] {
    return [
        // React 处理：CSR 用官方 plugin-react；SSG 用 reactRouter（自带 React 处理并接管入口）。二者互斥。
        isCSR ? react() : reactRouter(),
        // clientChunksPlugin 仅 SSG 需要（framework 分 client/ssr 双环境构建）；
        // CSR 单环境构建，vendor 分包直接写在 build.rollupOptions 里。
        !isCSR && clientChunksPlugin,

        // wasm(),
        // topLevelAwait(),

        legacy({
            // 浏览器支持基线（browserslist 语法）：chrome87/safari13/firefox78/edge88 这条老线，
            // 与 build.ts 的 CSS_TARGET（esbuild 语法）表达同一基线，需保持一致。
            // legacy() 会为该基线生成 nomodule 的 legacy chunk + polyfill，并用 Babel 降级现代 JS 语法，
            // 使产物可在这些老浏览器上运行（现代浏览器仍走 type=module 的现代 chunk）。
            targets: ['chrome >= 87', 'safari >= 13', 'firefox >= 78', 'edge >= 88', 'not IE 11'],
        }),
        isProd &&
            removeConsole({
                includes: ['log', 'warn'],
                external: ['error'],
            }),
        svgConvert(),
        viteBuildInfo(),
        configCompressPlugin(env.VITE_BUILD_COMPRESSION!),
    ].filter(Boolean) as PluginOption[];
}
