package api

import (
	"context"
	"crypto/ed25519"
	"crypto/rand"
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/desktop/internal/crypto"
	"github.com/tidbcloud/AgentTeam/desktop/internal/profile"
	"github.com/tidbcloud/AgentTeam/desktop/internal/userauth"
)

func TestMatchingMachineIDUsesEnabledServerWorkspaceBinding(t *testing.T) {
	target := profile.AgentTeamServer{
		ServerURL:   "https://agentteam.example.test/",
		WorkspaceID: "wsp_1",
	}
	machineID := matchingMachineID([]profile.AgentTeamServer{
		{Enabled: true, ServerURL: "https://other.example.test", WorkspaceID: "wsp_1", MachineID: "wrong-server"},
		{Enabled: true, ServerURL: "https://agentteam.example.test", WorkspaceID: "wsp_2", MachineID: "wrong-workspace"},
		{Enabled: false, ServerURL: "https://agentteam.example.test", WorkspaceID: "wsp_1", MachineID: "disabled"},
		{Enabled: true, ServerURL: "https://agentteam.example.test", WorkspaceID: "wsp_1", MachineID: "mch_local"},
	}, target)
	require.Equal(t, "mch_local", machineID)
}

func TestElectronActiveTargetHistoryIgnoresMachineServerHistory(t *testing.T) {
	manager, err := userauth.New(t.TempDir())
	require.NoError(t, err)
	require.NoError(t, manager.SetLastActiveTarget("srv_machine"))

	history := electronActiveTargetHistory{manager: manager}
	_, ok := history.LastActiveTarget()
	require.False(t, ok)
	require.NoError(t, history.SetLastActiveTarget("srv_machine"))
}

func TestElectronActiveTargetHistoryAcceptsGUIWorkspaceTarget(t *testing.T) {
	publicKey, privateKey, err := ed25519.GenerateKey(rand.Reader)
	require.NoError(t, err)
	require.NoError(t, crypto.SetKeys(publicKey, privateKey))
	t.Cleanup(crypto.ResetKeys)
	server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
		writer.Header().Set("Content-Type", "application/json")
		switch request.URL.Path {
		case "/api/v1/auth/login":
			_, _ = writer.Write([]byte(`{"accessToken":"access","refreshToken":"refresh","user":{"id":"usr_1","email":"user@example.com","name":"User"}}`))
		case "/api/v1/workspaces":
			_, _ = writer.Write([]byte(`[{"id":"wsp_1","name":"Workspace","slug":"workspace"}]`))
		default:
			http.NotFound(writer, request)
		}
	}))
	t.Cleanup(server.Close)

	manager, err := userauth.New(t.TempDir())
	require.NoError(t, err)
	login, err := manager.Login(context.Background(), server.URL, "user@example.com", "password")
	require.NoError(t, err)
	targetID := userauth.BuildTargetID(login.Server.ID, "wsp_1")
	history := electronActiveTargetHistory{manager: manager}

	require.NoError(t, history.SetLastActiveTarget(targetID))
	got, ok := history.LastActiveTarget()
	require.True(t, ok)
	require.Equal(t, targetID, got)
}
