package profile

import (
	"fmt"
	"strings"
)

// MachineBinding is the resolved daemon credential for one AgentTeam Workspace.
type MachineBinding struct {
	ServerURL   string
	WorkspaceID string
	MachineID   string
	APIKey      string
}

// UpsertMachineBinding persists a resolved Machine credential and reconciles
// the running server connection before returning.
func (sm *ServerManager) UpsertMachineBinding(binding MachineBinding) (AgentTeamServer, error) {
	serverURL := strings.TrimRight(strings.TrimSpace(binding.ServerURL), "/")
	workspaceID := strings.TrimSpace(binding.WorkspaceID)
	machineID := strings.TrimSpace(binding.MachineID)
	apiKey := strings.TrimSpace(binding.APIKey)
	if serverURL == "" || workspaceID == "" || machineID == "" || apiKey == "" {
		return AgentTeamServer{}, fmt.Errorf("machine binding requires server URL, workspace ID, machine ID, and API key")
	}

	matches := make([]AgentTeamServer, 0, 1)
	for _, server := range sm.All() {
		if strings.TrimRight(strings.TrimSpace(server.ServerURL), "/") == serverURL &&
			strings.TrimSpace(server.WorkspaceID) == workspaceID {
			matches = append(matches, server)
		}
	}

	if len(matches) == 0 {
		server := AgentTeamServer{
			Enabled:     true,
			ServerURL:   serverURL,
			WorkspaceID: workspaceID,
			MachineID:   machineID,
			APIKey:      apiKey,
		}
		if err := sm.Add(&server); err != nil {
			return AgentTeamServer{}, err
		}
		return server, nil
	}

	primary := matches[0]
	for _, server := range matches {
		if server.Enabled {
			primary = server
			break
		}
	}
	enabled := true
	empty := ""
	config := agentteamServerCompatConfig(AgentTeamServer{
		ServerURL:   serverURL,
		WorkspaceID: workspaceID,
		MachineID:   machineID,
		APIKey:      apiKey,
	})
	updated, err := sm.Patch(primary.ID, ServerUpdate{
		Enabled:          &enabled,
		ServerURL:        &serverURL,
		WorkspaceID:      &workspaceID,
		MachineID:        &machineID,
		APIKey:           &apiKey,
		AuthToken:        &empty,
		ConnectionStatus: &empty,
		Config:           &config,
	})
	if err != nil {
		return AgentTeamServer{}, err
	}
	for _, duplicate := range matches {
		if duplicate.ID == updated.ID || !duplicate.Enabled {
			continue
		}
		if err := sm.SetEnabled(duplicate.ID, false); err != nil {
			return AgentTeamServer{}, fmt.Errorf("disable duplicate server binding %q: %w", duplicate.ID, err)
		}
	}
	return updated, nil
}
