package crrf

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/pkg/log"
	"github.com/tidbcloud/pkgv2/bizerr"
	"go.uber.org/zap"
)

type CRRFWithClusterDeleting struct{}

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

func (b *CRRFWithClusterDeleting) WatchForEvents() []core_event.ClusterEventType {
	return []core_event.ClusterEventType{core_event.ClusterEventTypeDeleting}
}

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

func (b *CRRFWithClusterDeleting) Execute(
	ctx context.Context, event *core_event.ClusterEvent, cluster *core.Cluster,
) error {
	logger := log.GetLogger(ctx).Named("CRRFWithClusterDeleting")
	logger.Info("crrf event: WithClusterDeleting", zap.Uint64("clusterID", event.ClusterID))
	app := container.Global()

	if err := app.CRRFSettingRepo.DeleteByClusterID(ctx, event.ClusterID); err != nil {
		if err.RawErrCode() == bizerr.ErrCodeRecordNotFound {
			logger.Info("crrf setting not found", zap.Uint64("clusterID", event.ClusterID))
		} else {
			logger.Error("failed to delete crrf setting", zap.Uint64("clusterID", event.ClusterID), zap.Error(err))
			return err
		}
	}
	return nil
}
