package subscriber

import (
	"context"
	"testing"

	. "github.com/onsi/gomega"
	core_event "github.com/tidbcloud/core-svc/event"
	"github.com/tidbcloud/pkgv2/db/mock_db"
	"github.com/tidbcloud/serverless-service/internal/domain/facade"
	"github.com/tidbcloud/serverless-service/internal/domain/facade/mock_facade"
	"github.com/tidbcloud/serverless-service/internal/domain/repo/mock_repo"
	"github.com/tidbcloud/serverless-service/internal/service/event_svc"
	"go.uber.org/mock/gomock"
)

func TestClusterEventHandler(t *testing.T) {
	g := NewGomegaWithT(t)
	ctrl := gomock.NewController(t)
	defer ctrl.Finish()

	billingFacade := mock_facade.NewMockBillingFacade(ctrl)
	clusterRepo := mock_repo.NewMockClusterRepo(ctrl)
	clusterTidbPool := mock_repo.NewMockClusterTidbPoolRepo(ctrl)
	canaryRepo := mock_repo.NewMockCanaryRepo(ctrl)
	dbProvider := mock_db.NewMockTransProvider(ctrl)
	mgmtFacade := mock_facade.NewMockMgmtSvcFacade(ctrl)
	accountFacade := mock_facade.NewMockAccountFacade(ctrl)
	svc := event_svc.NewClusterEventService(
		billingFacade,
		clusterRepo,
		clusterTidbPool,
		canaryRepo,
		dbProvider,
		mgmtFacade,
		accountFacade,
	)
	handler := NewClusterEventHandler(svc)

	{
		event := &core_event.ClusterEvent{IsDevTier: false}
		g.Expect(handler.Handle(context.Background(), event)).To(Succeed())
	}
	{
		event := &core_event.ClusterEvent{
			ClusterID: 1,
			TenantID:  101,
			ProjectID: 1001,
			IsDevTier: true,
			EventType: core_event.ClusterEventTypeDeleted,
		}
		setting := &facade.SpendLimitSetting{
			SpendLimitSettingID: 8001,
			TenantID:            101,
			RangeID:             1,
			RangeType:           "cluster",
		}
		clusterRepo.EXPECT().Remove(gomock.Any(), uint64(1)).Return(nil)
		billingFacade.EXPECT().GetSpendLimit(gomock.Any(), uint64(101), uint64(1)).Return(setting, nil)
		billingFacade.EXPECT().DeleteSpendLimit(gomock.Any(), uint64(101), uint64(8001)).Return(nil)
		g.Expect(handler.Handle(context.Background(), event)).To(Succeed())
	}
}
