package regionalapi

import (
	"context"
	"net/url"
	"testing"

	"github.com/stretchr/testify/require"
	ticdc_v1 "github.com/tidbcloud/cluster-service-ng/api/tidbcloud/ticdc-service/v1"
	"github.com/tidbcloud/pkgv2/bizerr"
)

type captureRegionalClient struct {
	path        string
	queryParams url.Values
	resp        *ticdc_v1.DescribeEndpointServiceAvailabilityZonesResponse
	err         bizerr.BizError
}

func (c *captureRegionalClient) Get(
	_ context.Context,
	_ *Region,
	uriPath string,
	_ map[string]string,
	queryParams url.Values,
	dest interface{},
) bizerr.BizError {
	c.path = uriPath
	c.queryParams = queryParams
	if c.err != nil {
		return c.err
	}
	if c.resp != nil {
		*(dest.(*ticdc_v1.DescribeEndpointServiceAvailabilityZonesResponse)) = *c.resp
	}
	return nil
}

func (c *captureRegionalClient) Post(
	context.Context, *Region, string, map[string]string, url.Values, interface{}, interface{},
) bizerr.BizError {
	return nil
}

func (c *captureRegionalClient) Put(
	context.Context, *Region, string, map[string]string, url.Values, interface{}, interface{},
) bizerr.BizError {
	return nil
}

func (c *captureRegionalClient) Delete(context.Context, *Region, string, map[string]string, url.Values) bizerr.BizError {
	return nil
}

func TestDescribeEndpointServiceAvailabilityZones(t *testing.T) {
	regionalCli := &captureRegionalClient{
		resp: &ticdc_v1.DescribeEndpointServiceAvailabilityZonesResponse{
			Zones: []*ticdc_v1.EndpointServiceAvailabilityZone{
				{AvailabilityZone: "us-east-1b", AvailabilityZoneId: "use1-az1"},
			},
		},
	}
	client := NewTiCDCPrivateLinkClient(regionalCli)

	resp, err := client.DescribeEndpointServiceAvailabilityZones(context.Background(), &Region{SharedPoolID: "sp-1"},
		&ticdc_v1.DescribeEndpointServiceAvailabilityZonesRequest{
			SharedPoolId:  "sp-1",
			ServiceName:   "com.amazonaws.vpce.us-east-1.vpce-svc-123",
			ServiceRegion: "us-east-1",
		})

	require.NoError(t, err)
	require.Equal(t, describeEndpointServiceAvailabilityZonesPath, regionalCli.path)
	require.Equal(t, "sp-1", regionalCli.queryParams.Get("sharedPoolId"))
	require.Equal(t, "com.amazonaws.vpce.us-east-1.vpce-svc-123", regionalCli.queryParams.Get("serviceName"))
	require.Equal(t, "us-east-1", regionalCli.queryParams.Get("serviceRegion"))
	require.Equal(t, "use1-az1", resp.Zones[0].AvailabilityZoneId)
}

func TestDescribeEndpointServiceAvailabilityZonesReturnsRegionalError(t *testing.T) {
	regionalCli := &captureRegionalClient{
		err: bizerr.New(bizerr.ErrCodeParams, "invalid service region"),
	}
	client := NewTiCDCPrivateLinkClient(regionalCli)

	_, err := client.DescribeEndpointServiceAvailabilityZones(context.Background(), &Region{SharedPoolID: "sp-1"},
		&ticdc_v1.DescribeEndpointServiceAvailabilityZonesRequest{
			SharedPoolId:  "sp-1",
			ServiceName:   "com.amazonaws.vpce.us-west-2.vpce-svc-123",
			ServiceRegion: "us-west-2",
		})

	require.Error(t, err)
	require.Equal(t, bizerr.ErrCodeParams, err.RawErrCode())
}
