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 (
	CMEventGroup = "default-consumer"
	CMEventType  = "ClusterEvent"
)

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

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

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

type ClusterEventHandler struct {
	clusterSvc *event_svc.ClusterEventService
}

func NewClusterEventHandler(clusterSvc *event_svc.ClusterEventService) *ClusterEventHandler {
	return &ClusterEventHandler{clusterSvc: clusterSvc}
}

func (h *ClusterEventHandler) Handle(ctx context.Context, event *core_event.ClusterEvent) error {
	if !event.IsDevTier {
		return nil
	}
	newCtx := context.WithValue(ctx, config.CtxWorkerNameKey, "clusterEventHandler")
	return h.clusterSvc.HandleEvent(newCtx, event)
}
