package dispatcher

import (
	"os"
	"path/filepath"
	"strings"

	"github.com/tidbcloud/AgentTeam/desktop/internal/agent/drivercontract"
	"github.com/tidbcloud/AgentTeam/desktop/internal/tokenanalysis"
)

func (d *Dispatcher) withTokenAnalysisEnv(env map[string]string, agentID string) (map[string]string, string) {
	if d == nil || d.tokenAnalysisToken == nil || strings.TrimSpace(agentID) == "" || strings.TrimSpace(d.serverURL) == "" {
		return env, ""
	}
	tokenValue, err := d.tokenAnalysisToken(strings.TrimSpace(agentID))
	if err != nil {
		return env, ""
	}
	if env == nil {
		env = make(map[string]string)
	}
	env[tokenanalysis.EnvBaseURL] = strings.TrimRight(d.serverURL, "/")
	env[tokenanalysis.EnvToken] = tokenValue
	env[tokenanalysis.EnvAgentID] = strings.TrimSpace(agentID)
	if executable, err := os.Executable(); err == nil {
		dir := filepath.Dir(executable)
		current := strings.TrimSpace(env["PATH"])
		if current == "" {
			current = strings.TrimSpace(os.Getenv("PATH"))
		}
		if current == "" {
			env["PATH"] = dir
		} else if !pathListContains(current, dir) {
			env["PATH"] = dir + string(os.PathListSeparator) + current
		}
	}
	return env, tokenValue
}

func clearTokenAnalysisEnv(env map[string]string) map[string]string {
	if env == nil {
		return nil
	}
	delete(env, tokenanalysis.EnvBaseURL)
	delete(env, tokenanalysis.EnvToken)
	delete(env, tokenanalysis.EnvAgentID)
	return env
}

func revokeTokenAnalysisConfig(cfg drivercontract.LaunchConfig) {
	if value := strings.TrimSpace(cfg.AnalysisToken); value != "" {
		sessionMCPTokenManager().RevokeAgentToken(value)
	}
}

func pathListContains(value, target string) bool {
	target = filepath.Clean(target)
	for _, item := range filepath.SplitList(value) {
		if filepath.Clean(item) == target {
			return true
		}
	}
	return false
}
