package nextgen_client

import (
	"context"
	"io"
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestPlanReplayerRequestsUseTheLogicalClusterID(t *testing.T) {
	var gotListPath, gotGeneratePath, gotPageSize, gotPageToken, gotAuthorization, gotContentType string
	var gotGenerateBody string
	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		gotAuthorization = r.Header.Get("Authorization")
		switch r.Method {
		case http.MethodGet:
			gotListPath = r.URL.Path
			gotPageSize = r.URL.Query().Get("pageSize")
			gotPageToken = r.URL.Query().Get("pageToken")
			_, _ = w.Write([]byte(`{"files":[],"nextPageToken":"next-token"}`))
		case http.MethodPost:
			gotGeneratePath = r.URL.Path
			gotContentType = r.Header.Get("Content-Type")
			body, err := io.ReadAll(r.Body)
			require.NoError(t, err)
			gotGenerateBody = string(body)
			_, _ = w.Write([]byte(`{"downloadUrl":"https://example.test/file.zip","expireTime":"2026-08-20T04:53:34Z"}`))
		default:
			t.Fatalf("unexpected method %s", r.Method)
		}
	}))
	defer server.Close()

	client := NewClient(server.URL, "nextgen-token")
	listResp, err := client.ListPlanReplayerFiles(context.Background(), 42, 1000, "opaque-token")
	require.NoError(t, err)
	require.Equal(t, "next-token", listResp.NextPageToken)

	downloadResp, err := client.GeneratePlanReplayerFileDownloadURL(context.Background(), 42, &GeneratePlanReplayerFileDownloadURLRequest{
		FileName: "replayer_token_123.zip",
	})
	require.NoError(t, err)
	require.Equal(t, "https://example.test/file.zip", downloadResp.DownloadURL)
	require.Equal(t, "Bearer nextgen-token", gotAuthorization)
	require.Equal(t, "/proxy/nextgen/clusters/42/cluster-ng-server/api/v1beta/clusters/42/planReplayerFiles", gotListPath)
	require.Equal(t, "1000", gotPageSize)
	require.Equal(t, "opaque-token", gotPageToken)
	require.Equal(t, "/proxy/nextgen/clusters/42/cluster-ng-server/api/v1beta/clusters/42:generatePlanReplayerFileDownloadURL", gotGeneratePath)
	require.Equal(t, "application/json", gotContentType)
	require.JSONEq(t, `{"fileName":"replayer_token_123.zip"}`, gotGenerateBody)
}
