package dbuser

import (
	"context"
	"time"

	"github.com/tidbcloud/account/central/events/publish"

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

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

// Command_DBUser_Cluster

func (r *DBUserSvc) CreateCommandDBUserCluster(ctx context.Context, clusterId uint64, orgId uint64, operator uint64, userId uint64, dbUser string, status entity.CommandStatus, action entity.CommandAction, targetType entity.ClusterUserTargetType, dbRole string, operatorType entity.ClusterUserTargetType) error {
	err := r.hub.DBUser.CreateCommandDBUserCluster(ctx, r.db, clusterId, orgId, operator, userId, dbUser, status, action, targetType, dbRole, operatorType)
	if err != nil {
		return err
	}
	_ = publish.PublishClusterDbUserEvent(ctx, &publish.ClusterDbUserEventData{
		ClusterID: clusterId,
		DbUser:    dbUser,
		DbRole:    dbRole,
		Action:    string(action),
	})
	return nil
}

func (r *DBUserSvc) BatchCreateCommandDBUserCluster(ctx context.Context, objs []entity.CommandDBUserCluster) error {
	err := r.hub.DBUser.BatchCreateCommandDBUserCluster(ctx, r.db, objs)
	if err != nil {
		return err
	}
	for _, cmd := range objs {
		_ = publish.PublishClusterDbUserEvent(ctx, &publish.ClusterDbUserEventData{
			ClusterID: cmd.ClusterID.Uint64(),
			DbUser:    cmd.DbUser,
			DbRole:    cmd.DbRole,
			Action:    string(cmd.Action),
		})
	}
	return nil
}

func (r *DBUserSvc) CreateCommandDBUserClusterWithTime(ctx context.Context, clusterId uint64, orgId uint64, operator uint64, userId uint64, dbUser string, status entity.CommandStatus, action entity.CommandAction, targetType entity.ClusterUserTargetType, createTime time.Time, dbRole string, operatorType entity.ClusterUserTargetType) error {
	err := r.hub.DBUser.CreateCommandDBUserClusterWithTime(ctx, r.db, clusterId, orgId, operator, userId, dbUser, status, action, targetType, createTime, dbRole, operatorType)
	if err != nil {
		return err
	}
	_ = publish.PublishClusterDbUserEvent(ctx, &publish.ClusterDbUserEventData{
		ClusterID: clusterId,
		DbUser:    dbUser,
		DbRole:    dbRole,
		Action:    string(action),
	})
	return nil
}

func (r *DBUserSvc) ListCommandDBUserClusters(ctx context.Context, filter dbuser.CommandDBUserClusterFilter) ([]entity.CommandDBUserCluster, error) {

	return r.hub.DBUser.ListCommandDBUserClusters(ctx, r.db, filter)
}

func (r *DBUserSvc) UpdateCommandDBUserCluster(ctx context.Context, c entity.CommandDBUserCluster) error {

	return r.hub.DBUser.UpdateCommandDBUserCluster(ctx, r.db, c)
}

func (r *DBUserSvc) UpdateCommandDBUserPushing(ctx context.Context, id uint64, to uint32) error {

	return r.hub.DBUser.UpdateCommandDBUserPushing(ctx, r.db, id, to)
}

func (r *DBUserSvc) UpdateCommandDBUserPushingByFrom(ctx context.Context, id uint64, from, to uint32) error {

	return r.hub.DBUser.UpdateCommandDBUserPushingByFrom(ctx, r.db, id, from, to)
}
