package tech.easyflow.agent.runtime;

import tech.easyflow.agent.entity.Agent;
import tech.easyflow.ai.entity.Model;

import java.util.Map;
import java.util.function.Supplier;

/**
 * 解析 Agent 运行时应使用的模型输入能力。
 *
 * <p>正式运行严格使用发布快照；草稿试运行使用当前模型配置。</p>
 */
public final class AgentModelCapabilityResolver {

    private static final String MODEL_SUMMARY = "modelSummary";
    private static final String SUPPORT_IMAGE = "supportImage";
    private static final String SUPPORT_IMAGE_BASE64_ONLY = "supportImageB64Only";

    /**
     * 禁止实例化能力解析工具。
     */
    private AgentModelCapabilityResolver() {
    }

    /**
     * 解析 Agent 当前运行模式对应的模型能力。
     *
     * <p>只要 Agent 携带发布快照，就不会读取实时模型能力。旧快照缺少能力字段时按不支持处理。</p>
     *
     * @param agent Agent 运行视图
     * @param liveModelSupplier 草稿态实时模型提供器
     * @return 规范化模型能力
     */
    public static Resolution resolve(Agent agent, Supplier<Model> liveModelSupplier) {
        Map<String, Object> publishedSnapshot = agent == null
                ? null : agent.getPublishedSnapshotJson();
        if (publishedSnapshot != null && !publishedSnapshot.isEmpty()) {
            return fromPublishedSnapshot(publishedSnapshot);
        }
        Model liveModel = liveModelSupplier == null ? null : liveModelSupplier.get();
        return new Resolution(
                liveModel != null && Boolean.TRUE.equals(liveModel.getSupportImage()),
                liveModel != null && Boolean.TRUE.equals(liveModel.getSupportImageB64Only()));
    }

    /**
     * 从发布快照读取模型能力。
     *
     * @param publishedSnapshot Agent 发布快照
     * @return 快照中的模型能力
     */
    private static Resolution fromPublishedSnapshot(Map<String, Object> publishedSnapshot) {
        Object summaryValue = publishedSnapshot.get(MODEL_SUMMARY);
        if (!(summaryValue instanceof Map<?, ?> modelSummary)) {
            return Resolution.disabled();
        }
        return new Resolution(
                Boolean.TRUE.equals(modelSummary.get(SUPPORT_IMAGE)),
                Boolean.TRUE.equals(modelSummary.get(SUPPORT_IMAGE_BASE64_ONLY)));
    }

    /**
     * 模型输入能力解析结果。
     *
     * @param supportImage 是否支持图片输入
     * @param supportImageBase64Only 是否仅支持 Base64 图片输入
     */
    public record Resolution(boolean supportImage, boolean supportImageBase64Only) {

        /**
         * 创建关闭全部图片能力的结果。
         *
         * @return 关闭图片能力的结果
         */
        private static Resolution disabled() {
            return new Resolution(false, false);
        }
    }
}
