import { defineConfig, loadConfigFromFile, mergeConfig } from 'vite';
import { FileUtils } from 'z-utils';
import { type ServiceConfig } from 'z-utils';

/**
 * 获取 Vite 配置
 */
export async function getViteConfig(options: ServiceConfig): Promise<any> {
  const root = process.cwd();
  
  // 尝试加载用户配置文件
  let userConfig: any = {};
  if (options.config) {
    const configPath = FileUtils.resolve(root, options.config);
    if (await FileUtils.exists(configPath)) {
      userConfig = await loadConfigFromFile({ command: 'serve', mode: options.mode }, configPath);
    }
  } else {
    // 自动查找配置文件
    const configFiles = [
      'vite.config.js',
      'vite.config.ts',
      'vite.config.mjs',
      'vite.config.cjs'
    ];
    
    for (const configFile of configFiles) {
      const configPath = FileUtils.join(root, configFile);
      if (await FileUtils.exists(configPath)) {
        userConfig = await loadConfigFromFile({ command: 'serve', mode: options.mode }, configPath);
        break;
      }
    }
  }
  
  // 默认配置
  const defaultConfig = defineConfig({
    root,
    mode: options.mode,
    server: {
      port: parseInt(options.port?.toString() || '3000'),
      host: options.host || 'localhost',
      open: true,
      cors: true
    },
    build: {
      outDir: options.outDir || 'dist',
      sourcemap: options.sourcemap || false,
      minify: options.minify !== false,
      rollupOptions: {
        output: {
          manualChunks: {
            vendor: ['vue', 'react']
          }
        }
      }
    },
    plugins: await getDefaultPlugins(root)
  });
  
  // 合并配置
  if (userConfig && userConfig.config) {
    return mergeConfig(defaultConfig, userConfig.config);
  }
  
  return defaultConfig;
}

/**
 * 获取默认插件
 */
async function getDefaultPlugins(root: string): Promise<any[]> {
  const plugins: any[] = [];
  
  // 检查项目类型并添加相应插件
  const packageJsonPath = FileUtils.join(root, 'package.json');
  
  if (await FileUtils.exists(packageJsonPath)) {
    try {
      const packageJson = await FileUtils.readJson(packageJsonPath);
      const dependencies = { ...packageJson.dependencies, ...packageJson.devDependencies };
      
      // Vue 项目
      if (dependencies.vue) {
        const { default: vue } = await import('@vitejs/plugin-vue');
        plugins.push(vue());
      }
      
      // React 项目
      if (dependencies.react) {
        const { default: react } = await import('@vitejs/plugin-react');
        plugins.push(react());
      }
    } catch (error) {
      // 忽略错误，使用默认配置
    }
  }
  
  return plugins;
}
