package cluster_svc

import (
	"context"
	"time"

	"github.com/tidbcloud/pkgv2/tracing"
	"github.com/tidbcloud/serverless-service/internal/domain/facade"
	"github.com/tidbcloud/serverless-service/internal/domain/repo"
	"github.com/tidbcloud/serverless-service/internal/utils"
	"go.uber.org/zap"
)

const (
	ExpireDuration = time.Hour * 24 * 7 // 7 days
	CleanUpLimit   = 10000
)

type CleanupTidbPoolService struct {
	timeFacade          facade.TimeFacade
	clusterTidbPoolRepo repo.ClusterTidbPoolRepo
}

func NewCleanupTidbPoolService(
	timeFacade facade.TimeFacade,
	clusterTidbPoolRepo repo.ClusterTidbPoolRepo,
) *CleanupTidbPoolService {
	return &CleanupTidbPoolService{
		timeFacade:          timeFacade,
		clusterTidbPoolRepo: clusterTidbPoolRepo,
	}
}

func (s *CleanupTidbPoolService) Execute(ctx context.Context) (err error) {
	ctx, span := Tracer.Start(ctx, "cleanuptidbpool.Execute")
	defer func() { tracing.EndSpan(span, err) }()

	now := s.timeFacade.Now()
	deleteBefore := now.Add(-ExpireDuration)

	err = s.clusterTidbPoolRepo.CleanUp(ctx, deleteBefore, CleanUpLimit)
	utils.GetWorkerLoggerFromContext(ctx).Info("clean up stale tidb pool policy",
		zap.String("delete_before", deleteBefore.Local().String()), zap.Error(err))

	return err
}
