package privatelink

import (
	"context"
	"strconv"

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

func (svc *service) PurgePrivateLinkServiceMetadata(
	ctx context.Context,
	req *globaldedicatedv1.PurgePrivateLinkServiceMetadataRequest,
) bizerr.BizError {
	ctx, span := tracer.Start(ctx, "Domain.PurgePrivateLinkServiceMetadataSvc")
	defer span.End()

	if req.TidbGroupId == 0 {
		return bizerr.New(bizerr.ErrCodeParams, "tidb group id is required")
	}

	cluster, err := svc.clusterRepo.Get(ctx, req.ClusterId, false)
	if err != nil {
		return err
	}

	region, err := svc.regionRepo.SelectRegionById(ctx, cluster.RegionId, cluster.OrganizationId)
	if err != nil {
		return err
	}

	tErr := svc.transaction.Transaction(ctx, func(ctx context.Context) error {
		regionalReq := &regionserver.PurgePrivateLinkMetadataRequest{
			ClusterId:   strconv.FormatUint(cluster.ClusterId, 10),
			TidbGroupId: strconv.FormatUint(req.TidbGroupId, 10),
		}

		if _, err := svc.privateLinkEndpointRepo.DeleteByTidbGroupID(ctx, req.ClusterId, req.TidbGroupId); err != nil {
			return bizerr.WrapError(err, "delete endpoint from MetaDB")
		}

		if _, err := svc.regionServerCli.PurgePrivateLinkMetadata(ctx, region, regionalReq); err != nil {
			return bizerr.WrapError(err, "purge PrivateLink metadata from region server")
		}

		return nil
	})
	if tErr != nil {
		return bizerr.WrapError(tErr, "purge PrivateLink service metadata failed")
	}

	return nil
}
