/**
 * @file 全局容器实例
 * @description 提供全局单例容器和便捷访问方法
 * @author JunBin.Yang
 */

import { Container } from './Container';
import { ServiceContainer } from './ServiceContainer';
import { ServiceKey, ServiceFactory, ServiceOptions } from './ServiceProvider';

/**
 * 全局容器实例
 */
let globalContainer: Container = new ServiceContainer();

/**
 * 获取全局容器实例
 * @returns 全局容器
 */
export function getContainer(): Container {
  return globalContainer;
}

/**
 * 设置全局容器实例
 * 用于测试或自定义容器场景
 * @param container 容器实例
 */
export function setContainer(container: Container): void {
  globalContainer = container;
}

/**
 * 重置全局容器
 * 清空所有注册的服务并创建新容器
 */
export function resetContainer(): void {
  globalContainer = new ServiceContainer();
}

/**
 * 注册服务到全局容器
 * @template T 服务类型
 * @param key 服务标识符
 * @param factory 服务工厂函数
 * @param options 注册选项
 */
export function register<T>(key: ServiceKey, factory: ServiceFactory<T>, options?: ServiceOptions): void {
  globalContainer.register<T>(key, factory, options);
}

/**
 * 从全局容器解析服务
 * @template T 服务类型
 * @param key 服务标识符
 * @param default_factory 默认服务工厂函数
 * @returns 服务实例
 */
export function resolve<T>(key: ServiceKey, default_factory?: ServiceFactory<T>): T {
  return globalContainer.resolve<T>(key, default_factory);
}

/**
 * 尝试从全局容器解析服务
 * @template T 服务类型
 * @param key 服务标识符
 * @returns 服务实例或 undefined
 */
export function tryResolve<T>(key: ServiceKey): T | undefined {
  return globalContainer.tryResolve<T>(key);
}

/**
 * 检查全局容器中服务是否已注册
 * @param key 服务标识符
 * @returns 是否已注册
 */
export function has(key: ServiceKey): boolean {
  return globalContainer.has(key);
}