package regionalservercli_test

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

	"github.com/jarcoal/httpmock"
	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/common/regionalservercli"
	"sigs.k8s.io/controller-runtime/pkg/client"

	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
)

// TestMigrationAWSClient just test path and method are correct
func TestMigrationRSClient(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{}{})
	}
	reconcileHandlerFunc := func(r *http.Request) (*http.Response, error) {
		q := r.URL.Query()
		if q.Get("pause") != "false" && q.Get("pause") != "true" {
			return httpmock.NewJsonResponse(http.StatusBadRequest, struct{}{})
		}
		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.RegisterNoResponder(notFoundHandlerFunc)
	httpmock.RegisterResponder(http.MethodPost, "/api/dedicated/v1/migration/dedicatedregional/import/appbox", successHandlerFunc)
	httpmock.RegisterResponder(http.MethodPost, "/api/dedicated/v1/migration/dedicatedregional/import/approute", successHandlerFunc)
	httpmock.RegisterResponder(http.MethodPost, "/api/dedicated/v1/migration/dedicatedregional/import/internet", successHandlerFunc)
	httpmock.RegisterResponder(http.MethodPost, "/api/dedicated/v1/migration/dedicatedregional/import/privatelinkservice", successHandlerFunc)
	httpmock.RegisterResponder(http.MethodPost, "/api/dedicated/v1/migration/dedicatedregional/import/vpcpeering", successHandlerFunc)
	httpmock.RegisterResponder(http.MethodPost, "/api/dedicated/v1/migration/dedicatedregional/import/vpc", successHandlerFunc)

	httpmock.RegisterResponder(http.MethodGet, "/api/dedicated/v1/migration/dedicatedregional/check/appbox", successHandlerFunc)
	httpmock.RegisterResponder(http.MethodGet, "/api/dedicated/v1/migration/dedicatedregional/check/approute", successHandlerFunc)
	httpmock.RegisterResponder(http.MethodGet, "/api/dedicated/v1/migration/dedicatedregional/check/internet", successHandlerFunc)
	httpmock.RegisterResponder(http.MethodGet, "/api/dedicated/v1/migration/dedicatedregional/check/privatelinkservice", successHandlerFunc)
	httpmock.RegisterResponder(http.MethodGet, "/api/dedicated/v1/migration/dedicatedregional/check/vpcpeering", successHandlerFunc)
	httpmock.RegisterResponder(http.MethodGet, "/api/dedicated/v1/migration/dedicatedregional/check/vpc", successHandlerFunc)

	httpmock.RegisterResponder(http.MethodPatch, "/api/dedicated/v1/migration/dedicatedregional/reconcile/appbox", reconcileHandlerFunc)
	httpmock.RegisterResponder(http.MethodPatch, "/api/dedicated/v1/migration/dedicatedregional/reconcile/approute", reconcileHandlerFunc)
	httpmock.RegisterResponder(http.MethodPatch, "/api/dedicated/v1/migration/dedicatedregional/reconcile/internet", reconcileHandlerFunc)
	httpmock.RegisterResponder(http.MethodPatch, "/api/dedicated/v1/migration/dedicatedregional/reconcile/privatelinkservice", reconcileHandlerFunc)
	httpmock.RegisterResponder(http.MethodPatch, "/api/dedicated/v1/migration/dedicatedregional/reconcile/vpcpeering", reconcileHandlerFunc)
	httpmock.RegisterResponder(http.MethodPatch, "/api/dedicated/v1/migration/dedicatedregional/reconcile/vpc", reconcileHandlerFunc)

	cli := regionalservercli.NewMigrationServiceRSClient("http://cluster-service.mock")
	{
		err := cli.ImportAPPBox(ctx, new(v1alpha1.APPBox))
		require.Nil(t, err)
	}
	{
		err := cli.ImportAPPRoute(ctx, new(v1alpha1.APPRoute))
		require.Nil(t, err)
	}
	{
		err := cli.ImportInternet(ctx, new(v1alpha1.Internet))
		require.Nil(t, err)
	}
	{
		err := cli.ImportPrivateLinkService(ctx, new(v1alpha1.PrivateLinkService))
		require.Nil(t, err)
	}
	{
		err := cli.ImportVPCPeering(ctx, new(v1alpha1.VPCPeering))
		require.Nil(t, err)
	}
	{
		err := cli.ImportVPC(ctx, new(v1alpha1.VPC))
		require.Nil(t, err)
	}
	key := client.ObjectKey{
		Namespace: "foo",
		Name:      "foo",
	}
	{
		err := cli.CheckAPPBox(ctx, key)
		require.Nil(t, err)
	}
	{
		err := cli.CheckAPPRoute(ctx, key)
		require.Nil(t, err)
	}
	{
		err := cli.CheckInternet(ctx, key)
		require.Nil(t, err)
	}
	{
		err := cli.CheckPrivateLinkService(ctx, key)
		require.Nil(t, err)
	}
	{
		err := cli.CheckVPCPeering(ctx, key)
		require.Nil(t, err)
	}
	{
		err := cli.CheckVPC(ctx, key)
		require.Nil(t, err)
	}
	{
		err := cli.ReconcileAPPBox(ctx, key, false)
		require.Nil(t, err)
	}
	{
		err := cli.ReconcileAPPRoute(ctx, key, false)
		require.Nil(t, err)
	}
	{
		err := cli.ReconcileInternet(ctx, key, false)
		require.Nil(t, err)
	}
	{
		err := cli.ReconcilePrivateLinkService(ctx, key, false)
		require.Nil(t, err)
	}
	{
		err := cli.ReconcileVPCPeering(ctx, key, false)
		require.Nil(t, err)
	}
	{
		err := cli.ReconcileVPC(ctx, key, false)
		require.Nil(t, err)
	}
}
