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 BackupSettingWithClusterNormal struct{}

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

func (b *BackupSettingWithClusterNormal) WatchForEvents() []core_event.ClusterEventType {
	return []core_event.ClusterEventType{
		core_event.ClusterEventTypeNormal,
		core_event.ClusterEventTypeLaunching,
		core_event.ClusterEventTypeRestoring,
	}
}

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

func (b *BackupSettingWithClusterNormal) Execute(
	ctx context.Context, event *core_event.ClusterEvent, cluster *core.Cluster,
) error {
	logger := log.GetLogger(ctx).Named("BackupSettingWithClusterNormal")
	logger.Info("backup event: UpdateWithClusterReady", zap.Uint64("clusterID", event.ClusterID))
	if cluster.DeletedAt != nil {
		logger.Warn("cluster is deleted, skip it", zap.Uint64("clusterID", event.ClusterID))
		return nil
	}

	app := container.Global()
	if cluster.IsDevTier {
		logger.Info("dev tier cluster, skip")
		return nil
	}

	err := app.BackupSettingModel.CreateBackupSetting(ctx, &domain.CreateBackupSettingReqV2{
		TenantID:  pointer.To(cluster.TenantId),
		ProjectID: pointer.To(cluster.ProjectId),
		ClusterID: pointer.To(event.ClusterID),

		CloudProvider: pointer.To(domain.InfraProviderType(cluster.InfraProviderType)),
	})
	if err != nil {
		logger.Error("create backup setting failed", zap.Error(err))
		return err
	}
	return nil
}
