package alicloud

import (
	"context"
	"errors"
	"testing"

	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	privatelink20200415 "github.com/alibabacloud-go/privatelink-20200415/v5/client"
	"github.com/alibabacloud-go/tea/tea"
	. "github.com/onsi/gomega"
	mocks "github.com/tidbcloud/observability/test/mockresourceworker/providers/alicloud"
	"go.uber.org/mock/gomock"
)

func newMockEndpointService(cfg *openapi.Config, mock aliEndpointServiceClient) AliEndpointServiceClient {
	return AliEndpointServiceClient{
		cli: mock,
		cfg: cfg,
	}
}

func TestEPSModifyUserPermissions(t *testing.T) {
	g := NewGomegaWithT(t)
	ctl := gomock.NewController(t)
	defer ctl.Finish()
	var cfg openapi.Config
	cfg.RegionId = tea.String("cn-hangzhou")
	mockclient := mocks.NewMockaliEndpointServiceClient(ctl)
	epsclient := newMockEndpointService(&cfg, mockclient)
	//add permissions
	mockclient.EXPECT().AddUserToVpcEndpointService(&privatelink20200415.AddUserToVpcEndpointServiceRequest{
		ServiceId: tea.String("test1"),
		UserARN:   tea.String("testarn"),
	}).Return(&privatelink20200415.AddUserToVpcEndpointServiceResponse{}, nil)
	g.Expect(epsclient.AddUserPermissions(context.TODO(), "test1", []string{"testarn"})).Should(Succeed())
	//delete permissions
	mockclient.EXPECT().RemoveUserFromVpcEndpointService(&privatelink20200415.RemoveUserFromVpcEndpointServiceRequest{
		ServiceId: tea.String("test1"),
		UserARN:   tea.String("testarn"),
	}).Return(&privatelink20200415.RemoveUserFromVpcEndpointServiceResponse{}, nil)
	g.Expect(epsclient.DeleteUserPermissions(context.TODO(), "test1", []string{"testarn"})).Should(Succeed())
}

func TestEPSGetEndpointService(t *testing.T) {
	g := NewGomegaWithT(t)
	ctl := gomock.NewController(t)
	defer ctl.Finish()
	var cfg openapi.Config
	cfg.RegionId = tea.String("cn-hangzhou")
	mockclient := mocks.NewMockaliEndpointServiceClient(ctl)
	aliclient := newMockEndpointService(&cfg, mockclient)

	mockclient.EXPECT().GetVpcEndpointServiceAttribute(&privatelink20200415.GetVpcEndpointServiceAttributeRequest{
		ServiceId: tea.String("test1"),
	}).Return(&privatelink20200415.GetVpcEndpointServiceAttributeResponse{
		StatusCode: tea.Int32(200),
		Body: &privatelink20200415.GetVpcEndpointServiceAttributeResponseBody{
			AutoAcceptEnabled: tea.Bool(false),
			ServiceId:         tea.String("test1"),
		},
	}, nil)
	g.Expect(aliclient.GetAliEndpointService(context.TODO(), "test1")).Should(Equal(&privatelink20200415.GetVpcEndpointServiceAttributeResponseBody{
		AutoAcceptEnabled: tea.Bool(false),
		ServiceId:         tea.String("test1"),
	}), nil)

	mockclient.EXPECT().GetVpcEndpointServiceAttribute(&privatelink20200415.GetVpcEndpointServiceAttributeRequest{
		ServiceId: tea.String("notfound"),
	}).Return(&privatelink20200415.GetVpcEndpointServiceAttributeResponse{
		StatusCode: tea.Int32(400),
	}, nil)
	g.Expect(aliclient.GetAliEndpointService(context.TODO(), "notfound")).Error().Should(Equal(errors.New(ErrNotFoundEndpointService)))

	mockclient.EXPECT().GetVpcEndpointServiceAttribute(&privatelink20200415.GetVpcEndpointServiceAttributeRequest{
		ServiceId: tea.String("error"),
	}).Return(&privatelink20200415.GetVpcEndpointServiceAttributeResponse{}, errors.New("someting"))
	g.Expect(aliclient.GetAliEndpointService(context.TODO(), "error")).Error().Should(HaveOccurred())
}
