package agent

import (
	"fmt"
	"strings"

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

const codexProviderAPIKeyEnvVar = "AGENTTEAM_CODEX_PROVIDER_API_KEY"

func applyCodexProviderConfig(args []string, env map[string]string, prov *drivercontract.ProviderConfig) ([]string, map[string]string) {
	if prov == nil || strings.TrimSpace(prov.ID) == "" || strings.TrimSpace(prov.BaseURL) == "" {
		return args, env
	}

	name := strings.TrimSpace(prov.Name)
	if name == "" {
		name = strings.TrimSpace(prov.ID)
	}

	wireAPI := codexWireAPI(prov.WireAPIs)

	args = append(args,
		"-c", fmt.Sprintf("model_provider=%q", prov.ID),
		"-c", fmt.Sprintf("model_providers.%s.name=%q", prov.ID, name),
		"-c", fmt.Sprintf("model_providers.%s.base_url=%q", prov.ID, strings.TrimSpace(prov.BaseURL)),
		"-c", fmt.Sprintf("model_providers.%s.wire_api=%q", prov.ID, wireAPI),
	)

	if strings.TrimSpace(prov.APIKey) != "" {
		args = append(args, "-c", fmt.Sprintf("model_providers.%s.env_key=%q", prov.ID, codexProviderAPIKeyEnvVar))
		if env == nil {
			env = make(map[string]string)
		}
		env[codexProviderAPIKeyEnvVar] = strings.TrimSpace(prov.APIKey)
	} else if strings.TrimSpace(prov.EnvKey) != "" {
		args = append(args, "-c", fmt.Sprintf("model_providers.%s.env_key=%q", prov.ID, strings.TrimSpace(prov.EnvKey)))
	}

	return args, env
}

func codexWireAPI(wireAPIs []string) string {
	first := ""
	for _, wireAPI := range wireAPIs {
		wireAPI = strings.TrimSpace(wireAPI)
		if wireAPI == "" {
			continue
		}
		if wireAPI == provider.WireAPIResponses {
			return provider.WireAPIResponses
		}
		if first == "" {
			first = wireAPI
		}
	}
	if first != "" {
		return first
	}
	return provider.WireAPIResponses
}
