package infra

import (
	"context"

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

	"github.com/tidbcloud/core-svc/idl/pbgen/proto/core"
	"github.com/tidbcloud/pkgv2/clusterproxy"
	"github.com/tidbcloud/tiinf/errs"
)

type DeleteUserParams struct {
	Cluster  *core.Cluster
	Operator *clusterproxy.ClusterOperator
	Username string
}

func DeleteUser(ctx context.Context, params *DeleteUserParams) error {
	if params == nil {
		return errs.NewBadRequest("params is nil", nil)
	}
	if err := checkClusterOperatorUsername(params.Cluster, params.Operator, params.Username); err != nil {
		return err
	}

	tilog.Info(ctx, "InfraProxy DeleteUser param", zap.Any("clusterId", params.Cluster.Id), zap.Any("operator", params.Operator.Username), zap.Any("username", params.Username))

	proxy, err := GetClusterProxy(ctx, params.Cluster)
	if err != nil {
		tilog.Warn(ctx, "InfraProxy DeleteUser GetClusterProxy error", zap.Any("clusterId", params.Cluster.Id))
		return err
	}
	sql := buildDropUserSql(params.Username)
	tilog.Info(ctx, "InfraProxy DeleteUser buildDropUserSql", zap.Any("sql", sql))

	err = proxy.ExecuteSQLV2(ctx, params.Operator, sql)
	tilog.Info(ctx, "InfraProxy DeleteUser ExecuteSQLV2 result", zap.Any("clusterId", params.Cluster.Id), zap.Any("operator", params.Operator.Username), zap.Any("sql", sql), zap.Any("err", err))

	return err
}

func checkClusterOperatorUsername(cluster *core.Cluster, operator *clusterproxy.ClusterOperator, username string) error {
	if cluster == nil {
		return errs.NewBadRequest("cluster is nil", nil)
	}
	if operator == nil {
		return errs.NewBadRequest("operator is nil", nil)
	}
	if username == "" {
		return errs.NewBadRequest("username is blank", nil)
	}
	return nil
}
