package com.easyagents.agent.runtime.memory;

/**
 * AutoContext 自动压缩参数。
 */
public class AgentMemoryCompressionParameter {

    private boolean enabled = true;
    private Integer msgThreshold;
    private int lastKeep = 8;
    private Double tokenRatio;
    private Long maxToken;
    private long largePayloadThreshold = 2048L;
    private Integer minCompressionTokenThreshold;
    private double currentRoundCompressionRatio = 0.5D;
    private int minConsecutiveToolMessages = 4;

    /**
     * 判断是否启用自动压缩。
     *
     * @return 启用时返回 true
     */
    public boolean isEnabled() {
        return enabled;
    }

    /**
     * 设置压缩开关。
     *
     * @param enabled 压缩开关
     */
    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    /**
     * 获取消息阈值。
     *
     * @return 消息阈值
     */
    public Integer getMsgThreshold() {
        return msgThreshold;
    }

    /**
     * 设置消息阈值。
     *
     * @param msgThreshold 消息阈值
     */
    public void setMsgThreshold(int msgThreshold) {
        this.msgThreshold = msgThreshold <= 0 ? null : msgThreshold;
    }

    /**
     * 获取最近保留消息数。
     *
     * @return 最近保留消息数
     */
    public int getLastKeep() {
        return lastKeep;
    }

    /**
     * 设置最近保留消息数。
     *
     * @param lastKeep 最近保留消息数
     */
    public void setLastKeep(int lastKeep) {
        this.lastKeep = Math.max(0, lastKeep);
    }

    /**
     * 获取Token 比例。
     *
     * @return Token 比例
     */
    public Double getTokenRatio() {
        return tokenRatio;
    }

    /**
     * 设置Token 比例。
     *
     * @param tokenRatio Token 比例
     */
    public void setTokenRatio(double tokenRatio) {
        this.tokenRatio = tokenRatio <= 0D ? null : tokenRatio;
    }

    /**
     * 获取最大 Token 数。
     *
     * @return 最大 Token 数
     */
    public Long getMaxToken() {
        return maxToken;
    }

    /**
     * 设置最大 Token 数。
     *
     * @param maxToken 最大 Token 数
     */
    public void setMaxToken(long maxToken) {
        this.maxToken = maxToken <= 0L ? null : maxToken;
    }

    /**
     * 获取大负载阈值。
     *
     * @return 大负载阈值
     */
    public long getLargePayloadThreshold() {
        return largePayloadThreshold;
    }

    /**
     * 设置大负载阈值。
     *
     * @param largePayloadThreshold 大负载阈值
     */
    public void setLargePayloadThreshold(long largePayloadThreshold) {
        this.largePayloadThreshold = largePayloadThreshold <= 0L ? 2048L : largePayloadThreshold;
    }

    /**
     * 获取最小压缩 Token 阈值。
     *
     * @return 最小压缩 Token 阈值
     */
    public Integer getMinCompressionTokenThreshold() {
        return minCompressionTokenThreshold;
    }

    /**
     * 设置最小压缩 Token 阈值。
     *
     * @param minCompressionTokenThreshold 最小压缩 Token 阈值
     */
    public void setMinCompressionTokenThreshold(int minCompressionTokenThreshold) {
        this.minCompressionTokenThreshold = minCompressionTokenThreshold <= 0 ? null : minCompressionTokenThreshold;
    }

    /**
     * 获取当前轮压缩比例。
     *
     * @return 当前轮压缩比例
     */
    public double getCurrentRoundCompressionRatio() {
        return currentRoundCompressionRatio;
    }

    /**
     * 设置当前轮压缩比例。
     *
     * @param currentRoundCompressionRatio 当前轮压缩比例
     */
    public void setCurrentRoundCompressionRatio(double currentRoundCompressionRatio) {
        this.currentRoundCompressionRatio = currentRoundCompressionRatio <= 0D ? 0.5D : currentRoundCompressionRatio;
    }

    /**
     * 获取最小连续工具消息数。
     *
     * @return 最小连续工具消息数
     */
    public int getMinConsecutiveToolMessages() {
        return minConsecutiveToolMessages;
    }

    /**
     * 设置最小连续工具消息数。
     *
     * @param minConsecutiveToolMessages 最小连续工具消息数
     */
    public void setMinConsecutiveToolMessages(int minConsecutiveToolMessages) {
        this.minConsecutiveToolMessages = Math.max(0, minConsecutiveToolMessages);
    }
}
