package regionalservice

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

	"github.com/golang/mock/gomock"
	"github.com/stretchr/testify/assert"
	"github.com/tidbcloud/ticdc-service/pkg/regionalservice/mocks"
)

func TestGetCluster(t *testing.T) {
	ctrl := gomock.NewController(t)
	defer ctrl.Finish()
	roundTripper := mocks.NewMockRoundTripper(ctrl)
	serviceClient := NewRegionalServiceClient("http://example.com").(*client)
	serviceClient.cli.SetTransport(roundTripper)

	ctx := context.Background()
	clusterID := "test-cluster"

	roundTripper.EXPECT().RoundTrip(gomock.Any()).DoAndReturn(
		func(req *http.Request) (*http.Response, error) {
			assert.Equal(t, "GET", req.Method)
			assert.Equal(t, "/api/dedicated/v1/clusters/"+clusterID, req.URL.Path)
			return &http.Response{
				Status:     "ok",
				StatusCode: 200,
				Body:       io.NopCloser(strings.NewReader("{\"tenantId\":\"testID\"}")),
				Request:    req,
			}, nil
		},
	).Times(1)

	cluster, err := serviceClient.GetCluster(ctx, clusterID)
	assert.NoError(t, err)
	assert.Equal(t, "testID", cluster.TenantId)
}

func TestGetAPPBoxByTenantIDAndClusterID(t *testing.T) {
	ctrl := gomock.NewController(t)
	defer ctrl.Finish()

	roundTripper := mocks.NewMockRoundTripper(ctrl)
	serviceClient := NewRegionalServiceClient("http://example.com").(*client)
	serviceClient.cli.SetTransport(roundTripper)

	ctx := context.Background()
	tenantID := "test-tenant"
	clusterID := "test-cluster"

	roundTripper.EXPECT().RoundTrip(gomock.Any()).DoAndReturn(
		func(req *http.Request) (*http.Response, error) {
			assert.Equal(t, "GET", req.Method)
			assert.Equal(t, "http://example.com/api/dedicated/v1/appboxes?clusterId="+clusterID+"&tenantId="+tenantID,
				req.URL.String())
			return &http.Response{
				Status:     "ok",
				StatusCode: 200,
				Body: io.NopCloser(strings.NewReader("" +
					"{" +
					"\"appboxes\": [{\"proxyBaseUrl\":\"testurl\"}]" +
					"}")),
				Request: req,
			}, nil
		},
	).Times(1)

	appbox, err := serviceClient.GetAPPBoxByTenantIDAndClusterID(ctx, tenantID, clusterID)
	assert.NoError(t, err)
	assert.Equal(t, "testurl", appbox.ProxyBaseUrl)
}
