import {
  createProviderModelMapperFromFile,
  createProviderModelMapperFromData,
  type ProviderModelMapper,
} from './provider-models-mapper.js';

/**
 * 共享的提供商模型映射器实例
 * 确保整个应用只有一个实例,避免重复创建和内存浪费
 */
let providerModelMapper: ProviderModelMapper | null = null;

/**
 * 统一的 ProviderModelMapper Hook
 * 支持初始化和获取同一个实例
 * @param filePath 可选的JSON文件路径,仅在首次调用时有效
 * @returns ProviderModelMapper 实例
 */
export async function useProviderModelMapper(filePath?: string): Promise<ProviderModelMapper> {
  if (!providerModelMapper) {
    if (!filePath) {
      throw new Error('Provider models file path is required for first initialization');
    }
    providerModelMapper = await createProviderModelMapperFromFile(filePath);
  }
  return providerModelMapper;
}

/**
 * 使用内存中的提供商模型数据初始化映射器(主要用于远程拉取 OpenTiny 模型)
 * @param providerModelsData 提供商模型数据对象
 */
export async function initProviderModelMapperFromData(
  providerModelsData: Record<string, any>,
): Promise<ProviderModelMapper> {
  providerModelMapper = createProviderModelMapperFromData(providerModelsData);
  return providerModelMapper;
}

export function useProviderModelMapperSync(): ProviderModelMapper {
  if (!providerModelMapper) {
    throw new Error('Provider model mapper has not been initialized. Call useProviderModelMapper() first.');
  }

  return providerModelMapper;
}

/**
 * 重置 ProviderModelMapper 实例(主要用于测试)
 */
export function useResetProviderModelMapper(): void {
  providerModelMapper = null;
}