package webagent

import (
	"github.com/tidbcloud/AgentTeam/internal/api/dto"
	"github.com/tidbcloud/AgentTeam/internal/store/agent"
)

func agentLLMFromFields(mode string, baseURL string, apiKey string, headers map[string]string, wireAPI string) *agent.AgentLLM {
	return agent.NewAgentLLM(mode, baseURL, apiKey, headers, wireAPI)
}

func createAgentParamsFromRequest(request dto.WebAgentCreateRequest, trimmedName string) agent.CreateAgentParams {
	return agent.CreateAgentParams{
		DisplayName:     trimmedName,
		Description:     request.Description,
		Runtime:         request.Runtime,
		Model:           request.Model,
		ReasoningEffort: request.ReasoningEffort,
		LLMMode:         request.LLMMode,
		BaseURL:         request.BaseURL,
		APIKey:          request.APIKey,
		Headers:         request.Headers,
		WireAPI:         request.WireAPI,
		ModelProfileID:  request.ModelProfileID,
		ChannelIDs:      request.ChannelIDs,
	}
}

func updateAgentParamsFromRequest(request UpdateAgentInput, llmSet bool) agent.UpdateAgentParams {
	updateParams := agent.UpdateAgentParams{
		Name:        request.Name,
		DisplayName: request.DisplayName,
		DeriveName:  request.DeriveName,
		Runtime:     request.Runtime,
		LLMSet:      llmSet,
	}
	if request.Description.Set {
		updateParams.Description = optionalStringValue(request.Description)
	}
	if request.AvatarURL.Set {
		updateParams.AvatarURL = optionalStringValue(request.AvatarURL)
	}
	if request.Model.Set {
		updateParams.Model = optionalStringValue(request.Model)
	}
	if request.PermissionMode.Set {
		permissionMode := optionalStringValue(request.PermissionMode)
		if normalized, ok := agent.NormalizeAgentPermissionMode(*permissionMode); ok {
			permissionMode = &normalized
		}
		updateParams.PermissionMode = permissionMode
	}
	if request.ReasoningEffort.Set {
		updateParams.ReasoningEffort = optionalStringValue(request.ReasoningEffort)
	}
	if request.LLMMode.Set {
		updateParams.LLMMode = optionalStringValue(request.LLMMode)
	}
	if request.BaseURL.Set {
		updateParams.BaseURL = optionalStringValue(request.BaseURL)
	}
	if request.APIKey.Set {
		updateParams.APIKey = optionalStringValue(request.APIKey)
	}
	if request.Headers.Set {
		updateParams.Headers = request.Headers.Value
		updateParams.HeadersSet = true
	}
	if request.WireAPI.Set {
		updateParams.WireAPI = optionalStringValue(request.WireAPI)
	}
	if request.ModelProfileID.Set {
		updateParams.ModelProfileID = optionalStringValue(request.ModelProfileID)
		updateParams.ModelProfileSet = true
	}
	return updateParams
}
