package dbuser

import (
	"context"
	"fmt"
	"time"

	"github.com/tidbcloud/account/internel/svc/dbuser"
	"github.com/tidbcloud/account/internel/svc/user"

	"go.opentelemetry.io/otel"

	"github.com/tidbcloud/account/commons/config"

	dbUserDao "github.com/tidbcloud/account/internel/dao/dbuser"

	"github.com/tidbcloud/account/central/utils"

	"go.uber.org/zap"

	"github.com/tidbcloud/tiinf/monitor/tilog"

	"github.com/tidbcloud/account/internel/dao/entity"
)

func RunDBUserCheckJob(c context.Context) error {
	ctx, span := otel.Tracer(config.TraceComponentNameWorker).Start(context.Background(), "RunDBUserCheckJob")
	defer span.End()
	dbUserSrv, _ := dbuser.GetDBUserSvc()
	userSrv, _ := user.GetUserSvc()
	t := time.Now().Add(time.Hour * -config.CommandIgnoreTime)

	filter := dbUserDao.CommandDBUserClusterFilter{
		Status:       []entity.CommandStatus{entity.CommandStatusWaiting, entity.CommandStatusFail},
		Actions:      []entity.CommandAction{entity.CommandActionCheck},
		CreatedAtGte: &t,
	}
	checkCommands, err := dbUserSrv.ListCommandDBUserClusters(ctx, filter)
	bm := utils.Begin(ctx, "RunDBUserCheckJob", zap.Any("command size", len(checkCommands)))
	defer bm.OnExit(ctx)
	if err != nil {
		return err
	}
	tilog.Info(ctx, "RunDBUserCheckJob Command "+fmt.Sprintf("size=%d", len(checkCommands)))

	var ckIds []uint64
	for _, c := range checkCommands {
		ckIds = append(ckIds, c.ID.Uint64())
	}

	tilog.Info(ctx, "check command "+fmt.Sprintf("size=%d", len(checkCommands)), zap.Any("id", ckIds))

	runCommand(checkCommands, ctx, dbUserSrv, userSrv)

	return nil

}
