/**
 * @file 功能模块接口
 * @description 定义功能模块的标准接口
 * @author JunBin.Yang
 */

import { Container } from '@core/di';
import { RouteBuild, NavigationService } from '@core/navigation';

/**
 * 路由注册器接口
 */
export interface RouteRegistry {
  /**
   * 注册路由
   * @param name 路由名称
   * @param builder 路由构建器
   */
  register(name: string, builder: WrappedBuilder<[]>): void;

  /**
   * 获取路由构建器
   * @param name 路由名称
   * @returns 路由构建器
   */
  getBuilder(name: string): WrappedBuilder<[]> | undefined;
}

/**
 * 默认路由注册器实现
 * 基于 RouteBuild 的适配器
 */
export class DefaultRouteRegistry implements RouteRegistry {
  register(name: string, builder: WrappedBuilder<[]>): void {
    RouteBuild.register(name, builder);
  }

  getBuilder(name: string): WrappedBuilder<[]> | undefined {
    return RouteBuild.getBuilder(name);
  }
}

/**
 * 模块上下文
 * 提供模块初始化时所需的依赖
 */
export interface ModuleContext {
  /**
   * DI 容器
   */
  container: Container;

  /**
   * 路由注册器
   */
  routeRegistry: RouteRegistry;

  /**
   * 导航服务(可选,用于注册守卫)
   */
  navigationService?: NavigationService;
}

/**
 * 功能模块接口
 * 所有功能包必须实现此接口
 */
export interface FeatureModule {
  /**
   * 模块唯一标识
   */
  readonly moduleId: string;

  /**
   * 模块名称(用于显示)
   */
  readonly moduleName?: string;

  /**
   * 模块版本
   */
  readonly version?: string;

  /**
   * 模块依赖的其他模块 ID 列表
   */
  readonly dependencies?: string[];

  /**
   * 注册 DI 服务
   * @param container DI 容器
   */
  registerServices?(container: Container): void;

  /**
   * 注册路由
   * @param registry 路由注册器
   */
  registerRoutes?(registry: RouteRegistry): void;

  /**
   * 注册路由守卫
   * @param navigationService 导航服务
   */
  registerGuards?(navigationService: NavigationService): void;

  /**
   * 模块初始化
   * 在所有注册完成后调用
   * @param context 模块上下文
   */
  onInit?(context: ModuleContext): Promise<void> | void;

  /**
   * 模块销毁
   */
  onDestroy?(): void;
}

/**
 * 模块元数据
 */
export interface ModuleMetadata {
  /**
   * 模块 ID
   */
  moduleId: string;

  /**
   * 模块名称
   */
  moduleName?: string;

  /**
   * 模块版本
   */
  version?: string;

  /**
   * 依赖模块
   */
  dependencies?: string[];
}