package agent

import (
	"encoding/json"
	"fmt"
	"os"
	"strings"

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

func buildClaudeMCPConfig(cfg drivercontract.LaunchConfig) string {
	servers := make(map[string]interface{}, len(cfg.MCPs))
	for _, m := range cfg.MCPs {
		if server, ok := claudeMCPServerConfig(m); ok {
			servers[m.Name] = server
		}
	}
	mcpCfg := map[string]interface{}{
		"mcpServers": servers,
	}
	data, _ := json.Marshal(mcpCfg)
	return string(data)
}

func writeClaudeMCPConfigFile(cfg drivercontract.LaunchConfig) (string, error) {
	file, err := os.CreateTemp("", "agentteam-claude-mcp-*.json")
	if err != nil {
		return "", fmt.Errorf("claude: create mcp config file: %w", err)
	}
	path := file.Name()
	cleanup := func() {
		logIgnoredCleanupError("failed to close claude mcp config file during cleanup", file.Close(), "path", path)
		logIgnoredCleanupError("failed to remove claude mcp config file during cleanup", os.Remove(path), "path", path)
	}
	if err := file.Chmod(0o600); err != nil {
		cleanup()
		return "", fmt.Errorf("claude: chmod mcp config file: %w", err)
	}
	if _, err := file.WriteString(buildClaudeMCPConfig(cfg)); err != nil {
		cleanup()
		return "", fmt.Errorf("claude: write mcp config file: %w", err)
	}
	if err := file.Close(); err != nil {
		logIgnoredCleanupError("failed to remove claude mcp config file after close error", os.Remove(path), "path", path)
		return "", fmt.Errorf("claude: close mcp config file: %w", err)
	}
	return path, nil
}

func claudeMCPServerConfig(m types.NamedMCPConfig) (map[string]interface{}, bool) {
	switch m.EffectiveTransport() {
	case types.MCPTransportStdio:
		if strings.TrimSpace(m.Command) == "" {
			return nil, false
		}
		server := map[string]interface{}{
			"type":    "stdio",
			"command": strings.TrimSpace(m.Command),
		}
		if len(m.Args) > 0 {
			server["args"] = append([]string(nil), m.Args...)
		}
		if len(m.Env) > 0 {
			server["env"] = runtimeconfig.CloneStringMap(m.Env)
		}
		if strings.TrimSpace(m.CWD) != "" {
			server["cwd"] = strings.TrimSpace(m.CWD)
		}
		return server, true
	default:
		if strings.TrimSpace(m.URL) == "" {
			return nil, false
		}
		server := map[string]interface{}{
			"type": "http",
			"url":  strings.TrimSpace(m.URL),
		}
		if len(m.Headers) > 0 {
			server["headers"] = runtimeconfig.CloneStringMap(m.Headers)
		}
		return server, true
	}
}
