package tidbgroup

import (
	"context"
	"strconv"

	"google.golang.org/protobuf/types/known/emptypb"

	globaldedicatedv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/dedicated/v1"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/service/workflow/common"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
	"github.com/tidbcloud/tidb-management-service/utilities/workflow"
)

func (s *service) DisableTidbGroupDNS(
	ctx context.Context,
	req *globaldedicatedv1.DisableTidbGroupDNSRequest,
) (*emptypb.Empty, bizerr.BizError) {
	ctx, span := tracer.Start(ctx, "Domain.disableTidbGroupDNSSvc")
	defer span.End()

	tidbGroup, err := s.tidbGroupRepo.Load(ctx, req.GetClusterId(), req.GetTidbGroupId())
	if err != nil {
		return nil, err
	}

	cluster, err := s.clusterRepo.GetAndLoadComponents(ctx, tidbGroup.ClusterId)
	if err != nil {
		return nil, err
	}

	if cluster.State != globaldedicatedv1.Cluster_AVAILABLE {
		return nil, bizerr.New(bizerr.ErrCodeParams, "cluster is not available for this action")
	}

	workFlowErr := s.workflow.RunDagWithBizId(
		ctx,
		common.DisableTidbGroupDNS,
		strconv.FormatUint(cluster.OrganizationId, 10),
		strconv.FormatUint(cluster.ProjectId, 10),
		strconv.FormatUint(cluster.ClusterId, 10),
		map[string]string{
			workflow.KeyTraceId:   workflow.GetTraceId(ctx),
			common.KeyClusterId:   strconv.FormatUint(cluster.ClusterId, 10),
			common.KeyTidbGroupId: strconv.FormatUint(tidbGroup.Id, 10),
		},
	)
	if workFlowErr != nil {
		return nil, bizerr.WrapErrorWithCode(workFlowErr, bizerr.ErrCodeUnknown, "create disable dns workflow failed")
	}

	return &emptypb.Empty{}, nil
}
