package com.easyagents.agent.runtime.model;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 供应商无关的模型声明。
 */
public class AgentModelSpec {

    private AgentModelProviderType providerType = AgentModelProviderType.OPENAI_COMPATIBLE;
    private String modelName;
    private String baseUrl;
    private String endpointPath;
    private String apiKey;
    private boolean supportImage;
    private boolean supportImageBase64Only;
    private AgentHttpVersionPolicy httpVersionPolicy = AgentHttpVersionPolicy.AUTO;
    private AgentMessageContentFormat messageContentFormat = AgentMessageContentFormat.STANDARD;
    private Map<String, Object> metadata = new LinkedHashMap<>();

    /**
     * 获取供应商类型。
     *
     * @return 供应商类型
     */
    public AgentModelProviderType getProviderType() {
        return providerType;
    }

    /**
     * 设置供应商类型。
     *
     * @param providerType 供应商类型
     */
    public void setProviderType(AgentModelProviderType providerType) {
        this.providerType = providerType == null ? AgentModelProviderType.OPENAI_COMPATIBLE : providerType;
    }

    /**
     * 获取模型名称。
     *
     * @return 模型名称
     */
    public String getModelName() {
        return modelName;
    }

    /**
     * 设置模型名称。
     *
     * @param modelName 模型名称
     */
    public void setModelName(String modelName) {
        this.modelName = modelName;
    }

    /**
     * 获取基础 URL。
     *
     * @return 基础 URL
     */
    public String getBaseUrl() {
        return baseUrl;
    }

    /**
     * 设置基础 URL。
     *
     * @param baseUrl 基础 URL
     */
    public void setBaseUrl(String baseUrl) {
        this.baseUrl = baseUrl;
    }

    /**
     * 获取端点路径。
     *
     * @return 端点路径
     */
    public String getEndpointPath() {
        return endpointPath;
    }

    /**
     * 设置端点路径。
     *
     * @param endpointPath 端点路径
     */
    public void setEndpointPath(String endpointPath) {
        this.endpointPath = endpointPath;
    }

    /**
     * 获取API Key。
     *
     * @return API Key 值
     */
    public String getApiKey() {
        return apiKey;
    }

    /**
     * 设置API Key。
     *
     * @param apiKey API Key 值
     */
    public void setApiKey(String apiKey) {
        this.apiKey = apiKey;
    }

    /**
     * 判断模型是否支持图片输入。
     *
     * @return 支持图片时返回 true
     */
    public boolean isSupportImage() {
        return supportImage;
    }

    /**
     * 设置模型是否支持图片输入。
     *
     * @param supportImage 是否支持图片
     */
    public void setSupportImage(boolean supportImage) {
        this.supportImage = supportImage;
    }

    /**
     * 判断模型是否只接受 Base64 图片。
     *
     * @return 仅接受 Base64 时返回 true
     */
    public boolean isSupportImageBase64Only() {
        return supportImageBase64Only;
    }

    /**
     * 设置模型是否只接受 Base64 图片。
     *
     * @param supportImageBase64Only 是否只接受 Base64 图片
     */
    public void setSupportImageBase64Only(boolean supportImageBase64Only) {
        this.supportImageBase64Only = supportImageBase64Only;
    }

    /**
     * 获取 Agent 模型调用的 HTTP 版本策略。
     *
     * @return HTTP 版本策略
     */
    public AgentHttpVersionPolicy getHttpVersionPolicy() {
        return httpVersionPolicy;
    }

    /**
     * 设置 Agent 模型调用的 HTTP 版本策略。
     *
     * @param httpVersionPolicy HTTP 版本策略
     */
    public void setHttpVersionPolicy(AgentHttpVersionPolicy httpVersionPolicy) {
        this.httpVersionPolicy = httpVersionPolicy == null ? AgentHttpVersionPolicy.AUTO : httpVersionPolicy;
    }

    /**
     * 获取 OpenAI-compatible 请求中的消息 content 格式。
     *
     * @return 消息 content 格式
     */
    public AgentMessageContentFormat getMessageContentFormat() {
        return messageContentFormat;
    }

    /**
     * 设置 OpenAI-compatible 请求中的消息 content 格式。
     *
     * @param messageContentFormat 消息 content 格式
     */
    public void setMessageContentFormat(AgentMessageContentFormat messageContentFormat) {
        this.messageContentFormat = messageContentFormat == null
                ? AgentMessageContentFormat.STANDARD
                : messageContentFormat;
    }

    /**
     * 获取元数据。
     *
     * @return 元数据
     */
    public Map<String, Object> getMetadata() {
        return metadata;
    }

    /**
     * 设置元数据。
     *
     * @param metadata 元数据
     */
    public void setMetadata(Map<String, Object> metadata) {
        this.metadata = metadata == null ? new LinkedHashMap<>() : metadata;
    }
}
