package jobs

import (
	"context"

	"github.com/tidbcloud/dataflow-service/app/container"
	"github.com/tidbcloud/dataflow-service/app/models/domain"
	app_entity "github.com/tidbcloud/dataflow-service/app/repo/entity"
	"github.com/tidbcloud/dataflow-service/pkg/log"
	"go.uber.org/zap"
)

func WaitNextTimeToEnablePitr(ctx context.Context, clusterID uint64) error {
	app := container.Global()
	logger := log.GetLogger(ctx)

	pitBackupSwitch, err := app.PitBackupSwitcher.GetOrCreatePitBackupSwitch(ctx, &domain.SwitchPitBackupReq{
		ClusterID: clusterID,
	})
	if err != nil {
		logger.Error("get pit backup switch error", zap.Error(err))
		return err
	}
	if pitBackupSwitch.PitBackupSwitch.Status != app_entity.PitBackupStatusEnabling {
		logger.Warn("pit backup switch status is not enabling, skip")
		return nil
	}

	// open gc
	cluster, err := app.CoreGrpcClient.GetAnyClusterByID(ctx, clusterID)
	if err != nil {
		logger.Error("get cluster error", zap.Error(err))
		return err
	}

	logBackups, err := app.LogBackupRepo.List(ctx, func(qs app_entity.LogBackupQuerySet) app_entity.LogBackupQuerySet {
		return qs.ClusterIDEq(app_entity.ID(cluster.Id)).DeletedAtIsNull()
	})
	if err != nil {
		logger.Error("list log backup error", zap.Error(err))
		return err
	}

	for _, logBackup := range logBackups {
		_, err := app.TiDBClusterGCSwitchModel.Enable(
			ctx,
			&domain.EnableTiDBClusterGCSwitchReq{
				TenantID:  cluster.TenantId,
				ProjectID: cluster.ProjectId,
				ClusterID: cluster.Id,

				BusinessID:   logBackup.ID.Uint64(),
				BusinessType: app_entity.TiDBClusterGCSwitchBusinessTypePiTBackup,
			})
		if err != nil {
			logger.Error("enable gc error", zap.Error(err))
			return err
		}
	}

	// adjust status
	pitBackupSwitch.PitBackupSwitch.Status = app_entity.PitBackupStatusWaitingForEnabling
	pitBackupSwitch.PitBackupSwitch.Action = app_entity.PitBackupSwitchAction{}
	err = app.PitBackupSwitchRepo.Save(ctx, pitBackupSwitch.PitBackupSwitch)
	if err != nil {
		logger.Error("save pit backup switch error", zap.Error(err))
		return err
	}
	return nil
}
