import { EngineDetector, PlayCanvasAdapter, GenericAdapter, PlayableScriptsAdapter } from './engines/index.js';
/**
 * 基础构建器 - 路由到不同构建工具适配器
 *
 * 职责：
 * 1. 确定引擎类型和构建工具（从 options 或自动检测）
 * 2. 根据构建工具路由到对应适配器执行 Base Build
 *
 * 路由规则（按 buildTool）：
 * - playcanvas-native → PlayCanvasAdapter：处理 PlayCanvas 项目
 * - playable-scripts → PlayableScriptsAdapter：处理 @playcraft/devkit 项目
 * - generic → GenericAdapter：处理外部引擎（npm install + npm run build）
 */
export class BaseBuilder {
    constructor(projectDir, options, extraOptions) {
        this.projectDir = projectDir;
        this.options = options;
        this.playableScriptsConfig = extraOptions?.playableScriptsConfig;
        this.usePlayableScripts = extraOptions?.usePlayableScripts;
        console.log(`[BaseBuilder] 初始化: projectDir=${projectDir}, outputDir=${options.outputDir}`);
    }
    /**
     * 获取构建元数据（在 build() 完成后可用）
     */
    get metadata() {
        return this._metadata;
    }
    /**
     * 执行基础构建
     * 根据构建工具路由到对应适配器
     */
    async build() {
        // 1. 确定引擎类型和构建工具
        const { engine, buildTool } = await this.resolveDetection();
        console.log(`[BaseBuilder] 使用引擎: ${engine}, 构建工具: ${buildTool}`);
        // 2. 根据构建工具路由到对应适配器
        let result;
        switch (buildTool) {
            case 'playcanvas-native': {
                const adapter = new PlayCanvasAdapter(this.projectDir, this.options);
                result = await adapter.baseBuild();
                break;
            }
            case 'playable-scripts': {
                const adapter = new PlayableScriptsAdapter(this.projectDir, this.options, this.playableScriptsConfig);
                result = await adapter.baseBuild();
                break;
            }
            case 'generic':
            default: {
                const adapter = new GenericAdapter(this.projectDir, this.options, engine);
                result = await adapter.baseBuild();
                break;
            }
        }
        // 3. 存储 metadata 供外部访问
        this._metadata = result.metadata;
        return result;
    }
    /**
     * 解析引擎类型和构建工具
     * 优先级：
     * 1. --use-playable-scripts 显式指定
     * 2. options.engine 用户显式指定引擎
     * 3. 自动检测（detectFull）
     */
    async resolveDetection() {
        // 1. 用户显式指定 --use-playable-scripts
        if (this.usePlayableScripts) {
            console.log('[BaseBuilder] 用户显式指定使用 playable-scripts 构建工具');
            return { engine: 'generic', buildTool: 'playable-scripts' };
        }
        // 2. 用户显式指定引擎
        if (this.options.engine) {
            const validated = EngineDetector.validateEngine(this.options.engine);
            if (validated) {
                console.log(`[BaseBuilder] 使用用户指定的引擎: ${validated}`);
                // PlayCanvas 直接使用原生适配器
                if (validated === 'playcanvas') {
                    return { engine: 'playcanvas', buildTool: 'playcanvas-native' };
                }
                // 其他引擎：检测是否可用 playable-scripts（@playcraft/adsdk 项目）
                const detected = await EngineDetector.detectFull(this.projectDir);
                if (detected.buildTool === 'playable-scripts') {
                    console.log(`[BaseBuilder] 检测到 playable-scripts 项目，优先使用 devkit 构建`);
                    return detected;
                }
                // 否则使用 generic 适配器
                return { engine: validated, buildTool: 'generic' };
            }
            console.warn(`[BaseBuilder] 无效的引擎类型: ${this.options.engine}，将自动检测`);
        }
        // 3. 自动检测
        const detected = await EngineDetector.detectFull(this.projectDir);
        console.log(`[BaseBuilder] 自动检测结果: engine=${detected.engine}, buildTool=${detected.buildTool}`);
        return detected;
    }
}
