import { printBuildComplete, printBuildStart } from './buildReport';

import type { Plugin } from 'vite';

// 渲染模式（与 vite.config.ts 同源）。SSG 模式下「恭喜打包完成」改由 react-router.config.ts 的
// buildEnd 钩子打印（那里晚于 ssr 构建、prerender、清理 server 等全部步骤）；此插件的 closeBundle
// 只对 CSR 有意义——CSR 不走 react-router，vite build 结束即全部结束。
const isCSR = process.env.APP_RENDER_MODE === 'csr';

export function viteBuildInfo(): Plugin {
    let isBuild = false;
    let outDir: string;
    let startTime: number | undefined;
    return {
        name: 'vite:buildInfo',
        // framework 模式下分 client / ssr 两个环境构建；ssr:false 时 react-router 删除 dist/server，
        // 扫描已删目录会报 ENOENT。仅在 client 环境运行本插件（打包信息只对最终客户端产物有意义）。
        applyToEnvironment: (environment) => environment.name === 'client',
        configResolved(resolvedConfig) {
            isBuild = resolvedConfig.command === 'build';
            outDir = resolvedConfig.build?.outDir ?? 'dist';
        },
        buildStart() {
            if (isBuild) {
                startTime = printBuildStart();
            }
        },
        closeBundle() {
            // 仅 CSR 在此收尾。SSG 交给 buildEnd，避免「恭喜」早于后续 ssr/prerender 输出。
            if (isBuild && isCSR) {
                void printBuildComplete(outDir, startTime);
            }
        },
    };
}
