/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2024-2025. All rights reserved.
 */
package magic.core.agent

public class Interceptor {
    private let agent: Agent
    private let mode: InterceptorMode

    private var numOfBypass = 0

    public init(agent: Agent, mode!: InterceptorMode = InterceptorMode.Always) {
        this.agent = agent
        this.mode = mode
    }

    protected func shouldIntercept(request: AgentRequest): Bool {
        match (mode) {
            case InterceptorMode.Always => return true
            case InterceptorMode.Periodic(freq) => return numOfBypass >= freq
            case InterceptorMode.Conditional(fn) => return fn(request)
        }
    }

    protected func doIntercept(request: AgentRequest): AgentResponse {
        // Each time intercepting a request, the number of bypassed requests is reset
        numOfBypass = 0
        return agent.chat(request)
    }

    protected func doBypass(_request: AgentRequest) {
        numOfBypass += 1
    }
}