package gcp

import (
	"context"
	"errors"
	"os"
	"testing"

	. "github.com/onsi/gomega"
	"github.com/tidbcloud/observability/pkg/resourceworker/providers/gcp/psc"
	mocks "github.com/tidbcloud/observability/test/mockresourceworker/providers/gcp/psc"
	"go.uber.org/mock/gomock"
	computepb "google.golang.org/genproto/googleapis/cloud/compute/v1"
)

type PSCOption func(*PSCClient)

func newMockPSC(mock psc.CloudPSCClient, opts ...PSCOption) *PSCClient {
	psc := &PSCClient{
		cli:     mock,
		project: "project",
		region:  "region",
	}
	for _, opt := range opts {
		opt(psc)
	}
	return psc
}

func TestPSCNew(t *testing.T) {
	os.Setenv("GOOGLE_APPLICATION_CREDENTIALS", "../../../../test/files/application_default_credentials.json")
	defer os.Unsetenv("GOOGLE_APPLICATION_CREDENTIALS")
	g := NewGomegaWithT(t)
	_, err := NewPSC("project1", "region1")
	g.Expect(err).Should(Succeed())
}
func TestPSCGet(t *testing.T) {
	g := NewGomegaWithT(t)
	ctl := gomock.NewController(t)
	defer ctl.Finish()
	mockclient := mocks.NewMockCloudPSCClient(ctl)
	pscclient := newMockPSC(mockclient)
	mockclient.EXPECT().Get(gomock.Any(), gomock.Any()).Return(&computepb.ServiceAttachment{}, nil)
	g.Expect(pscclient.GetPSCService(context.Background(), "test1")).Error().Should(Succeed())
}

func TestPSCSet(t *testing.T) {
	g := NewGomegaWithT(t)
	ctl := gomock.NewController(t)
	defer ctl.Finish()
	mockclient := mocks.NewMockCloudPSCClient(ctl)
	operationclient := mocks.NewMockOperation(ctl)
	pscclient := newMockPSC(mockclient)
	//success
	mockclient.EXPECT().Patch(gomock.Any(), gomock.Any()).Return(operationclient, nil)
	operationclient.EXPECT().Wait(gomock.Any()).Return(nil)
	g.Expect(pscclient.SetPSCService(context.Background(), "test1", &computepb.ServiceAttachment{})).Should(Succeed())
	//error
	mockclient.EXPECT().Patch(gomock.Any(), gomock.Any()).Return(nil, errors.New("errors"))
	g.Expect(pscclient.SetPSCService(context.Background(), "test1", &computepb.ServiceAttachment{})).Should(HaveOccurred())
}
