package backup

import (
	"context"

	"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/internal/config"
	"github.com/tidbcloud/dataflow-service/pkg/log"
	"go.uber.org/zap"
)

type BackupWithClusterCreating struct{}

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

func (b *BackupWithClusterCreating) WatchForEvents() []core_event.ClusterEventType {
	return []core_event.ClusterEventType{core_event.ClusterEventTypeCreating}
}

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

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

	if cluster.IsDevTier {
		logger.Info("serverless is no longer supported by dataflow service, skip it",
			zap.Uint64("clusterID", event.ClusterID),
			zap.String("clusterName", cluster.Name))
		return nil
	} else {
		// dedicated cluster
		if err := b.initBackupConfig(ctx, cluster); err != nil {
			logger.Error("backup event: ClusterCreating, init backup config error",
				zap.Uint64("clusterID", event.ClusterID),
				zap.Error(err),
			)
			return err
		}
	}

	return nil
}

func (b *BackupWithClusterCreating) initBackupConfig(ctx context.Context, cluster *core.Cluster) error {
	if !config.Global().DebugConfig.EnableConfigCenter {
		return nil
	}
	if !cluster.GetAttributes().GetUseNewDedicatedArch() {
		return nil
	}

	initConfigReq := &domain.InitConfigVersionReq{
		ClusterID:     cluster.Id,
		TenantID:      cluster.TenantId,
		Component:     domain.ConfigComponentBackup,
		Version:       cluster.Version,
		CloudProvider: domain.CloudProviderType(cluster.CloudProviderName),
	}
	return container.Global().ConfigCenterManager.InitConfigVersion(ctx, initConfigReq)
}
