package service

import (
	"context"

	scalerpb "github.com/tidbcloud/aws-shared-provider/pkg/tidbworker/proto/scaler"
	"github.com/tidbcloud/aws-shared-provider/pkg/tidbworker/schema/gc"
	"gorm.io/gorm/clause"
)

func (s *ScalerService) RegisterGC(
	ctx context.Context,
	request *scalerpb.RegisterGCRequest,
) (*scalerpb.Response, error) {
	if request == nil || request.GetHeader() == nil {
		return scalerResponse(ErrBadRequest), nil
	}

	err := s.GetDB().WithContext(ctx).Clauses(clause.OnConflict{
		DoNothing: true,
	}).Create(&gc.Task{
		KeyspaceName: request.GetHeader().GetKeyspaceName(),
		TidbPool:     request.GetHeader().GetTidbPool(),
		DeletionTs:   request.GetDeletionTs(),
		State:        gc.StatePending,
	}).Error

	return scalerResponse(err), nil
}

func (s *ScalerService) RecycleGC(
	ctx context.Context,
	request *scalerpb.RecycleGCRequest,
) (*scalerpb.Response, error) {
	if request == nil || request.GetHeader() == nil {
		return scalerResponse(ErrBadRequest), nil
	}

	err := s.GetDB().WithContext(ctx).
		Model(&gc.Task{}).
		Where("keyspace_name = ?", request.GetHeader().GetKeyspaceName()).
		Where("deletion_ts < ?", request.GetSafePoint()).
		Update("state", gc.StateDone).
		Error
	return scalerResponse(err), nil
}
