package opworker

import (
	"context"

	"github.com/tidbcloud/account/central/utils"
	"github.com/tidbcloud/account/commons/config"
	dbusersvc "github.com/tidbcloud/account/internel/svc/dbuser"
	"github.com/tidbcloud/account/internel/svc/user"

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

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

	"github.com/tidbcloud/account/central/worker/dbuser"

	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"
)

type DBUserWorker struct{ GlobalWorker }

func (w DBUserWorker) Run(ctx context.Context) error {

	bm := utils.Begin(ctx, "DBUserWorker")
	defer bm.OnExit(ctx)

	dbUserSvc, _ := dbusersvc.GetDBUserSvc()
	userSvc, _ := user.GetUserSvc()

	orgId := config.ShareKeyOrg
	filter := dbuserDao.OrgKeyFilter{
		OrgIDs: []entity.ID{entity.ID(orgId)},
		Status: []entity.OrgKeyStatus{entity.OrgKeyStatusActive},
	}

	orgKeys, err := dbUserSvc.ListOrgKeys(ctx, filter)
	if err != nil || len(orgKeys) == 0 {
		tilog.Info(ctx, "-----ListOrgKeys is nil ,DBUserWorker  is closed , ignore-----")
		return nil
	}

	tilog.Info(ctx, "DBUserWorker start")
	err = dbuser.RunOrgKeyJob(ctx, dbUserSvc)
	if err != nil {
		tilog.Error(ctx, "runOrgKeyJob is down", zap.Error(err))
		return err
	}
	err = dbuser.RunClusterKeyJob(ctx, dbUserSvc)
	if err != nil {
		tilog.Error(ctx, "runClusterKeyJob is down", zap.Error(err))
		return err
	}
	err = dbuser.RunUserActionJob(ctx, dbUserSvc, userSvc)
	if err != nil {
		tilog.Error(ctx, "runUserActionJob is down", zap.Error(err))
		return err
	}

	err = dbuser.RunDBUserClusterJob(ctx, dbUserSvc, userSvc)
	if err != nil {
		tilog.Error(ctx, "dbUserClusterJob is down", zap.Error(err))
		return err
	}

	return err

}

/*
func pubshEvent(ctx context.Context, tiDBUserSrv tidbuser.DBUserIface) error {
	data := tidbuser.ClusterMsg{
		ClusterId: 123,
		Action:    time.Now().String(),
	}
	MyEvent := &eventbus.Event{
		EventID:   config.Group,
		EventType: config.EventType,
		EventData: data,
	}
	err := eventbus.Get().PublishEvent(config.EventType, MyEvent)
	return err

}
*/
