package webagent

import (
	"context"
	"strings"
	"time"

	"github.com/tidbcloud/AgentTeam/internal/store/agent"
	"github.com/tidbcloud/AgentTeam/internal/store/storeerr"
)

const agentTeamProxyProviderRef = agent.AgentLLMModeAgentTeamProxy

func agentLLMMode(llm *agent.AgentLLM) string {
	if llm == nil {
		return ""
	}
	return llm.NormalizedMode()
}

func agentLLMUsesAgentTeamProxy(llm *agent.AgentLLM) bool {
	return agentLLMMode(llm) == agentTeamProxyProviderRef
}

func agentLLMUsesAgentTeamHosted(llm *agent.AgentLLM) bool {
	return agentLLMMode(llm) == agent.AgentLLMModeAgentTeamHosted
}

func validateWorkspaceAgentLLM(_ context.Context, orgs OrganizationProvider, _ string, llm *agent.AgentLLM) error {
	normalized := llm.Normalize()
	if normalized == nil {
		return nil
	}
	if normalized.Mode == agent.AgentLLMModeAgentTeamHosted {
		return nil
	}
	if normalized.Mode != agentTeamProxyProviderRef {
		return nil
	}
	if orgs == nil {
		return storeerr.ErrBadRequest
	}
	return nil
}

func buildStoredAgentLLM(ctx context.Context, orgs OrganizationProvider, workspaceID string, llm *agent.AgentLLM) (*agent.AgentLLM, error) {
	normalized := llm.Normalize()
	if normalized == nil {
		return nil, nil
	}
	if normalized.Mode != agentTeamProxyProviderRef {
		if normalized.Mode == agent.AgentLLMModeAgentTeamHosted {
			return agent.BuildStoredAgentTeamHostedAgentLLM(), nil
		}
		return normalized, nil
	}
	if orgs == nil {
		return nil, storeerr.ErrBadRequest
	}
	apiKey, err := orgs.CreateInternalWorkspaceProxyKey(ctx, strings.TrimSpace(workspaceID), time.Time{})
	if err != nil {
		return nil, err
	}
	return agent.BuildStoredAgentTeamProxyAgentLLM(apiKey)
}

func storedAgentLLMEqual(left *agent.AgentLLM, right *agent.AgentLLM) bool {
	leftNormalized := left.Normalize()
	rightNormalized := right.Normalize()
	if leftNormalized == nil || rightNormalized == nil {
		return leftNormalized == nil && rightNormalized == nil
	}
	leftHeaders, leftErr := agent.EncodeAgentHeaders(leftNormalized.Headers)
	rightHeaders, rightErr := agent.EncodeAgentHeaders(rightNormalized.Headers)
	return leftErr == nil &&
		rightErr == nil &&
		leftNormalized.Mode == rightNormalized.Mode &&
		leftNormalized.BaseURL == rightNormalized.BaseURL &&
		leftNormalized.APIKey == rightNormalized.APIKey &&
		leftNormalized.WireAPI == rightNormalized.WireAPI &&
		leftHeaders == rightHeaders
}
