package tidbmgmthttp

import (
	"context"
	"errors"
	"net/http"
	"net/http/httptest"
	"testing"
	"time"

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

func TestListTidbsBuildsAuthorizedUserRequest(t *testing.T) {
	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		require.Equal(t, http.MethodGet, r.Method)
		require.Equal(t, listTidbsPath, r.URL.Path)
		require.Equal(t, "123", r.URL.Query().Get("orgId"))
		require.Equal(t, "25", r.URL.Query().Get("pageSize"))
		require.Equal(t, "25", r.URL.Query().Get("skip"))
		require.Empty(t, r.URL.Query()["servicePlans"])
		require.Equal(t, "Bearer test-token", r.Header.Get("Authorization"))
		require.Equal(t, "00-abc-def-01", r.Header.Get("Traceparent"))
		_, _ = w.Write([]byte(`{"tidbs":[{"tidbId":"cluster-a"}],"totalSize":31}`))
	}))
	defer server.Close()
	client, err := NewClient(server.URL, time.Second)
	require.NoError(t, err)

	response, err := client.ListTidbs(context.Background(), ListRequest{
		OrgID: 123, PageSize: 25, Skip: 25, Authorization: "Bearer test-token",
		TraceHeaders: http.Header{"Traceparent": {"00-abc-def-01"}},
	})
	require.NoError(t, err)
	require.Equal(t, int64(31), response.TotalSize)
	require.Equal(t, []Tidb{{TidbID: "cluster-a"}}, response.Tidbs)
}

func TestListTidbsReturnsTypedStatusWithoutBody(t *testing.T) {
	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
		w.WriteHeader(http.StatusForbidden)
		_, _ = w.Write([]byte(`{"message":"sensitive detail"}`))
	}))
	defer server.Close()
	client, err := NewClient(server.URL, time.Second)
	require.NoError(t, err)

	_, err = client.ListTidbs(context.Background(), ListRequest{OrgID: 1, PageSize: 1, Authorization: "Bearer token"})
	var upstream *UpstreamError
	require.True(t, errors.As(err, &upstream))
	require.Equal(t, http.StatusForbidden, upstream.StatusCode)
	require.NotContains(t, err.Error(), "sensitive detail")
}
