import { Engine, type EngineOptions, type ModelLoadOptions } from '../components/engine';
import { BimComponent } from '../core/component';
import type { BimEngine } from '../bim-engine';
import { RightKeyManager } from './right-key-manager';
import { infoMenuButton } from '../components/menu/buttons/info';
import { homeMenuButton } from '../components/menu/buttons/home';

/**
 * 3D 引擎管理器
 * 负责连接 Engine 组件和 BimEngine，向外部暴露简化的 API
 * 采用延迟初始化模式，用户需主动调用 initialize() 方法
 */
export class EngineManager extends BimComponent {
    /** 3D 引擎挂载的父容器 */
    private container: HTMLElement;
    /** 3D 引擎组件实例 */
    private engineInstance: Engine | null = null;

    public rightKey: RightKeyManager | null = null; // 右键菜单管理器

    /**
     * 构造函数
     * @param engine 引擎实例
     * @param container 3D 引擎挂载的目标容器
     */
    constructor(engine: BimEngine, container: HTMLElement) {
        super(engine);
        this.container = container;
    }

    /**
     * 初始化 3D 引擎
     * @param options 引擎配置选项（可选，如果不提供则使用默认配置）
     * @returns 是否初始化成功
     */
    public initialize(options?: Omit<EngineOptions, 'container'>): boolean {
        // 如果已经初始化，先销毁旧的实例
        if (this.engineInstance && this.engineInstance.isInitialized()) {
            console.warn('[EngineManager] 3D Engine already initialized. Destroying old instance...');
            this.engineInstance.destroy();
            this.engineInstance = null;
        }

        try {
            // 创建 Engine 组件实例
            // options 中的配置会自动复制给 createEngine 使用
            this.engineInstance = new Engine({
                container: this.container,
                ...options, // 合并配置选项
            });

            // 调用组件的 init 方法初始化引擎
            this.engineInstance.init();

            // 初始化右键 (移到 return 之前)
            this.rightKey = new RightKeyManager(this.engine, this.container);

            // 注册默认右键菜单
            this.rightKey.registerHandler((_e) => {
                return [
                    infoMenuButton(this.engine),
                    homeMenuButton(this.engine)
                ];
            });

            return this.engineInstance.isInitialized();
        } catch (error) {
            console.error('[EngineManager] Failed to initialize 3D engine:', error);
            this.engineInstance = null;
            return false;
        }
    }
    /**
     * 检��� 3D 引擎是否已初始化
     */
    public isInitialized(): boolean {
        return this.engineInstance !== null && this.engineInstance.isInitialized();
    }

    /**
     * 加载 3D 模型
     * @param url 模型文件 URL
     * @param options 加载选项（位置、旋转、缩放）
     */
    public loadModel(url: string, options?: ModelLoadOptions): void {
        if (!this.engineInstance || !this.engineInstance.isInitialized()) {
            console.error('[EngineManager] 3D Engine not initialized. Please call initialize() first.');
            return;
        }
        this.engineInstance.loadModel(url, options);
    }

    /**
     * 获取原始 3D 引擎实例
     * 用于直接调用第三方引擎的其他 API
     */
    public getEngine(): any {
        if (!this.engineInstance) {
            console.warn('[EngineManager] 3D Engine not initialized.');
            return null;
        }
        return this.engineInstance.getEngine();
    }

    /**
     * 销毁 3D 引擎实例
     */
    public destroy(): void {
        if (this.engineInstance) {
            this.engineInstance.destroy();
            this.engineInstance = null;
        }
        if (this.rightKey) {
            this.rightKey.destroy();
            this.rightKey = null;
        }
    }
}



