package subscriber

import (
	"context"

	core_event "github.com/tidbcloud/core-svc/event"
	"github.com/tidbcloud/serverless-service/internal/config"
	eb "github.com/tidbcloud/serverless-service/internal/infra/eventbus"
	"github.com/tidbcloud/serverless-service/internal/service/event_svc"
	"github.com/tidbcloud/tiinf/transport/tieventbus"
)

const BranchClusterEventGroup = "branch-cluster-consumer"

type BranchClusterEventSubscriber struct {
	subscriber eb.Subscriber[core_event.ClusterEvent]
}

func NewBranchClusterEventSubscriber(
	eventbus tieventbus.Eventbus,
) *BranchClusterEventSubscriber {
	return &BranchClusterEventSubscriber{
		subscriber: eb.Subscriber[core_event.ClusterEvent]{
			Eventbus: eventbus,
		},
	}
}

func (s *BranchClusterEventSubscriber) RegisterHandlers(handlers ...eb.EventHandler[core_event.ClusterEvent]) {
	s.subscriber.RegisterHandlers(BranchClusterEventGroup, CMEventType, handlers...)
}

type BranchClusterEventHandler struct {
	branchSvc *event_svc.BranchSyncEventService
}

func NewBranchClusterEventHandler(branchSvc *event_svc.BranchSyncEventService) *BranchClusterEventHandler {
	return &BranchClusterEventHandler{branchSvc: branchSvc}
}

func (h *BranchClusterEventHandler) Handle(ctx context.Context, event *core_event.ClusterEvent) error {
	if !event.IsDevTier {
		return nil
	}
	newCtx := context.WithValue(ctx, config.CtxWorkerNameKey, "branchClusterEventHandler")
	return h.branchSvc.HandleClusterEvent(newCtx, event)
}
