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"
	"go.uber.org/multierr"
)

const (
	BackupClusterEventGroup = "backup-cluster-consumer"
	BackupDisplayEventGroup = "backup-display-consumer"
)

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

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

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

type BackupClusterEventHandler struct {
	backupEventSvc            *event_svc.BackupEventService
	virtualizedBackupEventSvc *event_svc.VirtualizedBackupEventService
}

func NewBackupClusterEventHandler(
	backupEventSvc *event_svc.BackupEventService,
	virtualizedBackupEventSvc *event_svc.VirtualizedBackupEventService,
) *BackupClusterEventHandler {
	return &BackupClusterEventHandler{
		backupEventSvc:            backupEventSvc,
		virtualizedBackupEventSvc: virtualizedBackupEventSvc,
	}
}

func (h *BackupClusterEventHandler) Handle(ctx context.Context, event *core_event.ClusterEvent) error {
	if !event.IsDevTier {
		return nil
	}
	newCtx := context.WithValue(ctx, config.CtxWorkerNameKey, "backupClusterEventHandler")
	virtualizedErr := h.virtualizedBackupEventSvc.HandleClusterEvent(newCtx, event)
	legacyErr := h.backupEventSvc.HandleClusterEvent(newCtx, event)
	return multierr.Append(virtualizedErr, legacyErr)
}
