package com.easyagents.agent.runtime.tool.asynctool;

import java.time.Duration;

/**
 * 异步工具 runtime 包装层的通用选项。
 */
public class AsyncToolOptions {

    private Duration submitTimeout = Duration.ofSeconds(5);
    private Duration observeTimeout = Duration.ofSeconds(3);
    private Duration resultTimeout = Duration.ofSeconds(3);
    private Duration cancelTimeout = Duration.ofSeconds(3);
    private Duration listTimeout = Duration.ofSeconds(3);
    private int defaultEventLimit = 20;
    private int maxEventLimit = 100;
    private int maxModelContentLength = 1200;
    private int maxEventTextLength = 800;

    /**
     * 创建默认异步工具选项实例。
     */
    public AsyncToolOptions() {
    }

    /**
     * 创建默认异步工具选项。
     *
     * @return 默认选项
     */
    public static AsyncToolOptions defaults() {
        return new AsyncToolOptions();
    }

    /**
     * 获取提交子工具超时时间。
     *
     * @return 超时时间
     */
    public Duration getSubmitTimeout() {
        return submitTimeout;
    }

    /**
     * 设置提交子工具超时时间。
     *
     * @param submitTimeout 超时时间
     */
    public void setSubmitTimeout(Duration submitTimeout) {
        this.submitTimeout = submitTimeout == null ? Duration.ofSeconds(5) : submitTimeout;
    }

    /**
     * 获取观察子工具超时时间。
     *
     * @return 超时时间
     */
    public Duration getObserveTimeout() {
        return observeTimeout;
    }

    /**
     * 设置观察子工具超时时间。
     *
     * @param observeTimeout 超时时间
     */
    public void setObserveTimeout(Duration observeTimeout) {
        this.observeTimeout = observeTimeout == null ? Duration.ofSeconds(3) : observeTimeout;
    }

    /**
     * 获取结果子工具超时时间。
     *
     * @return 超时时间
     */
    public Duration getResultTimeout() {
        return resultTimeout;
    }

    /**
     * 设置结果子工具超时时间。
     *
     * @param resultTimeout 超时时间
     */
    public void setResultTimeout(Duration resultTimeout) {
        this.resultTimeout = resultTimeout == null ? Duration.ofSeconds(3) : resultTimeout;
    }

    /**
     * 获取取消子工具超时时间。
     *
     * @return 超时时间
     */
    public Duration getCancelTimeout() {
        return cancelTimeout;
    }

    /**
     * 设置取消子工具超时时间。
     *
     * @param cancelTimeout 超时时间
     */
    public void setCancelTimeout(Duration cancelTimeout) {
        this.cancelTimeout = cancelTimeout == null ? Duration.ofSeconds(3) : cancelTimeout;
    }

    /**
     * 获取列表子工具超时时间。
     *
     * @return 超时时间
     */
    public Duration getListTimeout() {
        return listTimeout;
    }

    /**
     * 设置列表子工具超时时间。
     *
     * @param listTimeout 超时时间
     */
    public void setListTimeout(Duration listTimeout) {
        this.listTimeout = listTimeout == null ? Duration.ofSeconds(3) : listTimeout;
    }

    /**
     * 获取默认事件读取数量。
     *
     * @return 默认事件数量
     */
    public int getDefaultEventLimit() {
        return defaultEventLimit;
    }

    /**
     * 设置默认事件读取数量。
     *
     * @param defaultEventLimit 默认事件数量
     */
    public void setDefaultEventLimit(int defaultEventLimit) {
        this.defaultEventLimit = defaultEventLimit <= 0 ? 20 : defaultEventLimit;
    }

    /**
     * 获取最大事件读取数量。
     *
     * @return 最大事件数量
     */
    public int getMaxEventLimit() {
        return maxEventLimit;
    }

    /**
     * 设置最大事件读取数量。
     *
     * @param maxEventLimit 最大事件数量
     */
    public void setMaxEventLimit(int maxEventLimit) {
        this.maxEventLimit = maxEventLimit <= 0 ? 100 : maxEventLimit;
    }

    /**
     * 获取模型可见内容最大长度。
     *
     * @return 最大长度
     */
    public int getMaxModelContentLength() {
        return maxModelContentLength;
    }

    /**
     * 设置模型可见内容最大长度。
     *
     * @param maxModelContentLength 最大长度
     */
    public void setMaxModelContentLength(int maxModelContentLength) {
        this.maxModelContentLength = maxModelContentLength <= 0 ? 1200 : maxModelContentLength;
    }

    /**
     * 获取事件文本最大长度。
     *
     * @return 最大长度
     */
    public int getMaxEventTextLength() {
        return maxEventTextLength;
    }

    /**
     * 设置事件文本最大长度。
     *
     * @param maxEventTextLength 最大长度
     */
    public void setMaxEventTextLength(int maxEventTextLength) {
        this.maxEventTextLength = maxEventTextLength <= 0 ? 800 : maxEventTextLength;
    }
}
