package com.agent.management.service;

import com.agent.management.model.entity.AiModel;
import org.springframework.ai.chat.client.ChatClient;

import java.util.List;
import java.util.Map;

public interface AiModelService {

    List<AiModel> listModels();

    AiModel getModel(Long id);

    AiModel createModel(AiModel model);

    AiModel updateModel(Long id, AiModel model);

    /** 复制模型：以原模型为模板创建一条新记录，名称追加「（复制）」 */
    AiModel duplicateModel(Long id);

    void deleteModel(Long id);

    void setDefault(Long id);

    /** 批量更新模型调用优先级 */
    void updatePriorities(List<Map<String, Object>> priorities);

    /** 获取默认模型实体，无默认模型时返回 null */
    AiModel getDefaultModel();

    /** 获取默认模型的 ChatClient，无默认模型时返回 null */
    ChatClient getDefaultChatClient();

    /** 获取默认模型的 ChatClient，无默认模型时回退到 auto-configured builder */
    ChatClient getChatClientOrFallback(ChatClient.Builder fallbackBuilder);

    /**
     * 自动路由调用：按优先级依次尝试模型，直到成功或全部失败
     * @param promptFn 接收 ChatClient，返回调用结果
     * @return 调用结果
     */
    <T> T routeChatCall(java.util.function.Function<ChatClient, T> promptFn);

    /**
     * 系统内部使用的模型调用：优先使用 application.yml 配置，不可用时按模型管理顺序降级
     * @param promptFn 接收 ChatClient，返回调用结果
     * @return 调用结果
     */
    <T> T systemChatCall(java.util.function.Function<ChatClient, T> promptFn);

    /**
     * 测试模型连接：发送简短 Chat 请求，返回 success/latency/error
     * @param model 模型配置（可以是未保存的）
     * @return { success: boolean, latencyMs: long, error: String }
     */
    Map<String, Object> testConnection(AiModel model);

    /**
     * 测试已保存模型的连接
     */
    Map<String, Object> testConnection(Long modelId);

    /**
     * 获取接口下可用的模型列表（调用 /v1/models）
     * @param model 包含 baseUrl + apiKey 的配置
     * @return 模型标识列表
     */
    List<String> fetchAvailableModels(AiModel model);

    /**
     * 根据模型 ID 获取对应的 ChatClient（带缓存）
     */
    ChatClient getChatClient(Long modelId);
}
