package cluster

import (
	"context"
	"strconv"

	clusterngv1beta "github.com/tidbcloud/cluster-service-ng/api/cluster-service-ng/v1beta"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func (s *serviceImpl) ForceUpdateGatewayIdentity(
	ctx context.Context,
	req *globalngv1.ForceUpdateGatewayIdentityRequest,
) bizerr.BizError {
	ctx, span := tracer.Start(ctx, "Domain.ForceUpdateGatewayIdentity")
	defer span.End()

	if req.ClusterId == 0 {
		return bizerr.New(bizerr.ErrCodeParams, "cluster_id is required")
	}

	if req.GetGatewayIdentity() == "" {
		return bizerr.New(bizerr.ErrCodeParams, "gateway_identity is required")
	}

	cluster, err := s.clusterRepo.Get(ctx, req.ClusterId, false)
	if err != nil {
		return err
	}
	if cluster == nil {
		tilog.Warn(ctx, "cluster not found", zap.Uint64("cluster_id", req.ClusterId))
		return bizerr.New(bizerr.ErrCodeRecordNotFound, "cluster not found")
	}

	region, err := s.regionRepo.Get(ctx, cluster.RegionId)
	if err != nil {
		return err
	}

	return s.regionalCli.ForceUpdateGatewayIdentity(ctx, region, &clusterngv1beta.ForceUpdateGatewayIdentityRequest{
		ClusterId:       strconv.FormatUint(cluster.ClusterId, 10),
		GatewayIdentity: req.GetGatewayIdentity(),
	})
}
