package agent

import (
	"net/http"
	"strings"

	"github.com/gin-gonic/gin"

	"github.com/tidbcloud/AgentTeam/internal/api/dto"
	agentstore "github.com/tidbcloud/AgentTeam/internal/store/agent"
	"github.com/tidbcloud/AgentTeam/internal/versioning"
)

const (
	agentDaemonUpgradeCode    = "upgrade_required"
	agentDaemonUpgradeMessage = "This machine's agentteam daemon is too old for AgentTeam's message APIs. Upgrade agentteam daemon and try again."
)

func agentMeetsMinDaemonVersion(authenticatedAgent agentstore.AuthenticatedAgent, minDaemonVersion string) bool {
	minDaemonVersion = strings.TrimSpace(minDaemonVersion)
	if minDaemonVersion == "" {
		return true
	}
	comparison, err := versioning.CompareSemver(authenticatedAgent.DaemonVersion, minDaemonVersion)
	return err == nil && comparison >= 0
}

func requireAgentDaemonVersion(c *gin.Context, authenticatedAgent agentstore.AuthenticatedAgent, minDaemonVersion string) bool {
	if agentMeetsMinDaemonVersion(authenticatedAgent, minDaemonVersion) {
		return true
	}
	c.JSON(http.StatusConflict, agentErrorWithCode(agentDaemonUpgradeMessage, agentDaemonUpgradeCode))
	return false
}

func requireAgentWorkspaceDaemonVersion(c *gin.Context, authenticatedAgent agentstore.AuthenticatedAgent, minDaemonVersion string) bool {
	if agentMeetsMinDaemonVersion(authenticatedAgent, minDaemonVersion) {
		return true
	}
	c.JSON(http.StatusConflict, dto.AgentWorkspaceSnapshotResponse{
		Error:    agentDaemonUpgradeMessage,
		Channels: []dto.WorkspaceChannel{},
		Agents:   []dto.WorkspaceActor{},
		Humans:   []dto.WorkspaceActor{},
	})
	return false
}

func requireAgentScopeMembersDaemonVersion(c *gin.Context, authenticatedAgent agentstore.AuthenticatedAgent, minDaemonVersion string) bool {
	if agentMeetsMinDaemonVersion(authenticatedAgent, minDaemonVersion) {
		return true
	}
	c.JSON(http.StatusConflict, dto.AgentScopeMembersResponse{
		Error:   agentDaemonUpgradeMessage,
		Members: []dto.AgentScopeMemberDisplayRow{},
	})
	return false
}
