/**
 * 数据源服务
 * 提供数据源加载和管理功能
 */
import {DataSourceType, type DataSourceOption} from './types';
import {getDataSourceConfig, getAllDataSourceTypes} from './DataSourceRegistry';
import { loadData } from './core/requestHelper';
import { warn } from './core/errorHandler';

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

        if (!config) {
            const registeredTypes = getAllDataSourceTypes();
            warn(`数据源类型 "${type}" 未配置，请检查：

📋 可能的原因：
1. 节点定义中使用了字符串而非 DataSourceType 枚举（如 "jenkins-servers" 应改为 DataSourceType.JENKINS_SERVERS）
2. 该数据源尚未在 DataSourceRegistry 中注册
3. 如果是新数据源，需要先在 src/domain/dataSource/presets/ 中添加配置并注册

✅ 当前已注册的数据源类型（${registeredTypes.length}个）：
${registeredTypes.map(t => `  - ${t}`).join('\n')}

💡 临时解决：返回空数组，界面将显示空下拉列表（可切换到变量输入模式）。`);
            return [];
        }

        // 使用统一的请求工具
        const data = await loadData<any>(config.url, config.params, `数据源 ${type}`);
        return config.transform(data);
    }

    /**
     * 批量加载多个数据源（用于预加载）
     * @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);

