/**
 * 数据源服务
 * 提供数据源加载和管理功能
 */
import request from '@/utils/request';
import { DataSourceType, type DataSourceOption } from './types';
import { getDataSourceConfig } from './DataSourceRegistry';

/**
 * 数据源服务类
 */
class DataSourceService {
  /**
   * 加载单个数据源
   * @param type 数据源类型
   * @returns 选项列表
   */
  async load(type: DataSourceType): Promise<DataSourceOption[]> {
    const config = getDataSourceConfig(type);

    if (!config) {
      console.error(`❌ 数据源类型 ${type} 未配置`);
      return [];
    }

    try {
      const response = await request.get(config.url, { params: config.params });
      // request 拦截器已经提取了 data 字段，response 直接是数组
      return config.transform(response || []);
    } catch (error) {
      console.error(`❌ 加载数据源 ${type} 失败:`, error);
      return [];
    }
  }

  /**
   * 批量加载多个数据源（用于预加载）
   * @param types 数据源类型列表
   * @returns 数据源数据映射
   */
  async loadMultiple(
    types: DataSourceType[]
  ): Promise<Record<DataSourceType, DataSourceOption[]>> {
    const results = await Promise.all(
      types.map(type => this.load(type))
    );

    return types.reduce((acc, type, index) => {
      acc[type] = results[index];
      return acc;
    }, {} as Record<DataSourceType, DataSourceOption[]>);
  }

  /**
   * 预加载常用数据源（提升用户体验）
   * @returns 预加载的数据源映射
   */
  async preload(): Promise<Record<DataSourceType, DataSourceOption[]>> {
    const commonTypes: DataSourceType[] = [
      DataSourceType.JENKINS_SERVERS,
      DataSourceType.K8S_CLUSTERS,
      DataSourceType.USERS
    ];
    return this.loadMultiple(commonTypes);
  }
}

// 导出单例
export const dataSourceService = new DataSourceService();

// 向后兼容：导出原有的函数式API
export const loadDataSource = (type: DataSourceType) => dataSourceService.load(type);
export const loadMultipleDataSources = (types: DataSourceType[]) => dataSourceService.loadMultiple(types);

