/**
 * @file 全局模块注册器
 * @description 提供全局单例的模块注册器
 * @author JunBin.Yang
 */

import { Container, getContainer } from '@core/di';
import { NavigationService } from '@core/navigation';
import { FeatureModule, RouteRegistry, DefaultRouteRegistry } from './FeatureModule';
import { ModuleRegistry, ModuleRegistryConfig, ModuleState } from './ModuleRegistry';

/**
 * 全局模块注册器实例
 */
let globalRegistry: ModuleRegistry | undefined;

/**
 * 获取全局模块注册器
 * @returns 模块注册器实例
 */
export function getModuleRegistry(): ModuleRegistry {
  if (!globalRegistry) {
    globalRegistry = new ModuleRegistry();
  }
  return globalRegistry;
}

/**
 * 设置全局模块注册器
 * @param registry 模块注册器实例
 */
export function setModuleRegistry(registry: ModuleRegistry): void {
  globalRegistry = registry;
}

/**
 * 创建模块注册器
 * @param config 配置选项
 * @returns 模块注册器实例
 */
export function createModuleRegistry(config?: ModuleRegistryConfig): ModuleRegistry {
  return new ModuleRegistry(config);
}

/**
 * 注册模块到全局注册器
 * @param module 功能模块
 */
export function registerModule(module: FeatureModule): void {
  getModuleRegistry().register(module);
}

/**
 * 批量注册模块到全局注册器
 * @param modules 功能模块数组
 */
export function registerModules(modules: FeatureModule[]): void {
  getModuleRegistry().registerAll(modules);
}

/**
 * 启动全局模块注册器
 */
export async function bootstrapModules(): Promise<void> {
  await getModuleRegistry().bootstrap();
}

/**
 * 获取模块状态
 * @param moduleId 模块 ID
 * @returns 模块状态
 */
export function getModuleState(moduleId: string): ModuleState | undefined {
  return getModuleRegistry().getModuleState(moduleId);
}

/**
 * 销毁全局模块注册器
 */
export function destroyModules(): void {
  if (globalRegistry) {
    globalRegistry.destroy();
    globalRegistry = undefined;
  }
}

/**
 * 重置全局模块注册器
 */
export function resetModuleRegistry(): void {
  destroyModules();
  globalRegistry = new ModuleRegistry();
}