package clustercli_test

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

	"github.com/jarcoal/httpmock"
	"github.com/stretchr/testify/require"
	clusterctlpb "github.com/tidbcloud/infra-provider/api/tidbcloud/cluster-server/v1"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/common/clustercli"
)

func TestClusterCli(t *testing.T) {
	ctx := context.Background()
	httpmock.Activate()
	defer httpmock.DeactivateAndReset()
	successHandlerFunc := func(r *http.Request) (*http.Response, error) {
		return httpmock.NewJsonResponse(http.StatusOK, struct{}{})
	}
	notFoundHandlerFunc := func(r *http.Request) (*http.Response, error) {
		t.Logf("not found handler for url: %+v\n", r.URL.String())
		return httpmock.NewJsonResponse(http.StatusNotFound, struct{}{})
	}
	httpmock.RegisterResponder(http.MethodPost, "/api/v1/clusters", successHandlerFunc)
	httpmock.RegisterResponder(http.MethodGet, `=~^/api/v1/clusters/\w+`, successHandlerFunc)
	httpmock.RegisterResponder(http.MethodDelete, `=~^/api/v1/clusters/\w+`, successHandlerFunc)
	httpmock.RegisterResponder(http.MethodGet, `=~^/api/v1/clusters/\w+/tidbgroups/\w+`, successHandlerFunc)
	httpmock.RegisterResponder(http.MethodPost, `=~^/api/v1/clusters/\w+/tidbgroups/\w+:setPrivateLinkIpAddressType$`, successHandlerFunc)
	httpmock.RegisterResponder(http.MethodGet, `=~^/api/v1/clusters/\w+:getClusterRole`, successHandlerFunc)
	httpmock.RegisterResponder(http.MethodGet, `=~^/api/v1/clusters/\w+:getInfraInformation`, successHandlerFunc)
	httpmock.RegisterResponder(http.MethodPost, `=~^/api/v1/clusters/\w+:updateClusterAWSCloud`, successHandlerFunc)
	httpmock.RegisterNoResponder(notFoundHandlerFunc)
	cli := clustercli.NewClusterCli("http://cluster-service.mock")
	{
		in := new(clusterctlpb.CreateClusterRequest)
		_, err := cli.CreateCluster(ctx, in)
		require.Nil(t, err)
	}
	{
		in := new(clusterctlpb.GetClusterRequest)
		in.ClusterId = "foo"
		_, err := cli.GetCluster(ctx, in)
		require.Nil(t, err)
	}
	{
		in := new(clusterctlpb.DeleteClusterRequest)
		in.ClusterId = "foo"
		_, err := cli.DeleteCluster(ctx, in)
		require.Nil(t, err)
	}
	{
		in := new(clusterctlpb.GetTidbGroupRequest)
		in.ClusterId = "foo"
		in.TidbGroupId = "bar"
		_, err := cli.GetTidbGroup(ctx, in)
		require.Nil(t, err)
	}
	{
		in := &clusterctlpb.SetPrivateLinkIPAddressTypeRequest{
			ClusterId:              "foo",
			TidbGroupId:            "bar",
			RequestedIpAddressType: clusterctlpb.PrivateLinkIPAddressType_PRIVATE_LINK_IP_ADDRESS_TYPE_DUALSTACK,
			NlbIpAddressType:       clusterctlpb.PrivateLinkIPAddressType_PRIVATE_LINK_IP_ADDRESS_TYPE_DUALSTACK,
		}
		err := cli.SetPrivateLinkIPAddressType(ctx, in)
		require.Nil(t, err)
	}
	{
		in := new(clusterctlpb.GetClusterRoleRequest)
		in.ClusterId = "foo"
		_, err := cli.GetClusterRole(ctx, in)
		require.Nil(t, err)
	}
	{
		in := new(clusterctlpb.GetInfraInformationRequest)
		in.ClusterId = "foo"
		_, err := cli.GetInfraInformation(ctx, in)
		require.Nil(t, err)
	}
	{
		in := new(clusterctlpb.UpdateClusterAWSCloudRequest)
		in.ClusterId = "foo"
		_, err := cli.UpdateClusterAWSCloud(ctx, in)
		require.Nil(t, err)
	}
}
