package byocvpcpeering

import (
	"context"

	dataplanemanagerv1 "github.com/tidbcloud/cluster-service-ng/api/tidbcloud/dataplane-manager/v1"

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

func (s *serviceImpl) ListVpcPeerings(
	ctx context.Context,
	req *globalngv1.ListVpcPeeringsRequest,
) ([]*entity.VpcPeering, bizerr.BizError) {
	ctx, span := tracer.Start(ctx, "ByocVpcPeeringService.ListVpcPeerings")
	defer span.End()

	if req.GetClusterId() == 0 {
		return nil, bizerr.New(bizerr.ErrCodeParams, "cluster_id is required")
	}
	cluster, err := s.clusterRepo.Get(ctx, req.GetClusterId(), false)
	if err != nil {
		return nil, err
	}
	if cluster.GetDataplaneId() == "" {
		return nil, bizerr.New(bizerr.ErrCodeParams, "dataplane_id is required")
	}
	region, err := s.regionRepo.Get(ctx, cluster.RegionId)
	if err != nil {
		return nil, err
	}

	resp, err := s.regionalCli.ListVpcPeerings(ctx, region, &dataplanemanagerv1.ListVpcPeeringsRequest{
		DataPlaneId: cluster.GetDataplaneId(),
	})
	if err != nil {
		return nil, err
	}

	out := make([]*entity.VpcPeering, 0, len(resp.GetVpcPeerings()))
	for _, each := range resp.GetVpcPeerings() {
		converted, err := cvtDataplanePeeringToGlobal(cluster.GetClusterId(), each)
		if err != nil {
			return nil, err
		}
		out = append(out, converted)
	}

	return out, nil
}
