//go:build e2e

package api

import (
	"context"
	"fmt"
	"net/http"
	"net/http/httptest"
	"runtime"
	"testing"

	"github.com/pingcap/failpoint"
	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/desktop/internal/upgrade"
	"github.com/tidbcloud/AgentTeam/desktop/internal/version"
)

func TestLinuxHeadlessUpgradeManifest_E2E(t *testing.T) {
	if runtime.GOOS != "linux" {
		t.Skip("Linux owns the Go headless upgrade path")
	}
	const stableResp = `{
		"schema_version": "1",
		"product": "agentteam-daemon",
		"channel": "stable",
		"current_version": "v9.9.9",
		"published_at": "2026-05-15T00:00:00Z",
		"manifest_url": "%s/v9.9.9.json"
	}`
	const manifestResp = `{
		"schema_version": "1",
		"product": "agentteam-daemon",
		"version": "v9.9.9",
		"published_at": "2026-05-15T00:00:00Z",
		"manifest_url": "%s/v9.9.9.json",
		"client": {
			"install_script": "%s/install.sh",
			"checksums": "%s/checksums.txt",
			"assets": [
				{"platform": "linux-amd64", "purpose": "runtime", "kind": "tarball", "url": "%s/agentteam-amd64.tar.gz"},
				{"platform": "linux-arm64", "purpose": "runtime", "kind": "tarball", "url": "%s/agentteam-arm64.tar.gz"}
			]
		}
	}`

	fakeServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		base := "http://" + r.Host
		switch r.URL.Path {
		case "/stable.json":
			w.Header().Set("Content-Type", "application/json")
			fmt.Fprintf(w, stableResp, base)
		case "/v9.9.9.json":
			w.Header().Set("Content-Type", "application/json")
			fmt.Fprintf(w, manifestResp, base, base, base, base, base)
		default:
			w.WriteHeader(http.StatusNotFound)
		}
	}))
	t.Cleanup(fakeServer.Close)

	cfgDir := t.TempDir()
	require.NoError(t, failpoint.Enable("agentteam-config-dir", fmt.Sprintf(`return("%s")`, cfgDir)))
	t.Cleanup(func() { require.NoError(t, failpoint.Disable("agentteam-config-dir")) })

	origVersion := version.Version
	version.Version = "v1.0.0"
	t.Cleanup(func() { version.Version = origVersion })

	result, err := upgrade.CheckVersion(context.Background(), fakeServer.URL+"/stable.json")
	require.NoError(t, err)
	require.True(t, result.HasUpdate)
	require.Equal(t, "v9.9.9", result.Latest)
	require.Equal(t, "v1.0.0", result.Current)
	require.Equal(t, "linux-"+runtime.GOARCH, result.Platform)
	require.Equal(t, upgrade.UpdateMethodAutomatic, result.UpdateMethod)
	require.Equal(t, fakeServer.URL+"/agentteam-"+runtime.GOARCH+".tar.gz", result.RuntimeAssetURL)
}
