namespace AxCopilot.Services.Agent;

/// <summary>
/// Phase 23: 자동 컴팩션 모니터.
/// 에이전트 루프 반복마다 컨텍스트 토큰 사용량을 확인하고,
/// 임계치 초과 시 자동으로 대화를 요약���니다.
/// </summary>
public class AutoCompactMonitor
{
    private readonly int _thresholdPercent;

    /// <summary>자동 컴팩션 모니터를 생성합니다.</summary>
    /// <param name="thresholdPercent">컨텍스트 사용량 임계치 (기본 80%)</param>
    public AutoCompactMonitor(int thresholdPercent = 80)
    {
        _thresholdPercent = Math.Clamp(thresholdPercent, 50, 95);
    }

    /// <summary>
    /// 현재 토큰 사용량을 확인하고 컴팩션이 필요한지 판단합니다.
    /// </summary>
    /// <param name="currentTokens">현재 사용 중인 토큰 수</param>
    /// <param name="maxTokens">모델의 최대 컨텍스트 토큰 수</param>
    /// <returns>true면 컴팩션 필요</returns>
    public bool ShouldCompact(int currentTokens, int maxTokens)
    {
        if (maxTokens <= 0) return false;
        var usagePercent = (int)((double)currentTokens / maxTokens * 100);
        return usagePercent >= _thresholdPercent;
    }

    /// <summary>현재 사용률을 계산합니다 (0~100).</summary>
    public static int CalculateUsagePercent(int currentTokens, int maxTokens)
    {
        if (maxTokens <= 0) return 0;
        return (int)((double)currentTokens / maxTokens * 100);
    }
}
