package backup_setting

import (
	"context"

	"github.com/AlekSi/pointer"
	"github.com/samber/lo"
	core_event "github.com/tidbcloud/core-svc/event"
	"github.com/tidbcloud/core-svc/idl/pbgen/proto/core"
	"github.com/tidbcloud/dataflow-service/app/container"
	"github.com/tidbcloud/dataflow-service/app/models/domain"
	"github.com/tidbcloud/dataflow-service/pkg/log"
	"go.uber.org/zap"
)

type BackupSettingWithClusterDeleted struct{}

func (b *BackupSettingWithClusterDeleted) Name() string {
	return "BackupSettingWithClusterDeleted"
}

func (b *BackupSettingWithClusterDeleted) WatchForEvents() []core_event.ClusterEventType {
	return []core_event.ClusterEventType{core_event.ClusterEventTypeDeleted}
}

func (b *BackupSettingWithClusterDeleted) Match(event *core_event.ClusterEvent) bool {
	return lo.Contains(b.WatchForEvents(), event.EventType)
}

func (b *BackupSettingWithClusterDeleted) Execute(
	ctx context.Context, event *core_event.ClusterEvent, cluster *core.Cluster,
) error {
	logger := log.GetLogger(ctx).Named("BackupSettingWithClusterDeleted")
	logger.Info("backup event: WithClusterDeleted", zap.Uint64("clusterID", event.ClusterID))

	if cluster.IsDevTier {
		return nil
	}

	app := container.Global()
	err := app.BackupSettingModel.DeleteBackupSetting(ctx, &domain.DeleteBackupSettingReqV2{
		ClusterID: pointer.To(event.ClusterID),
	})
	if err != nil {
		logger.Error("new arch, delete backup setting failed", zap.Error(err))
		return err
	}
	logger.Info("new arch, delete backup setting success", zap.Any("ClusterID", event.ClusterID))
	return nil
}
