package byocvpcpeering

import (
	"context"
	"strconv"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	openapingv1beta2 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/nextgen/v1beta2"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/pkg/apimiddleware/bizerror"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/pkg/common"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
	"github.com/tidbcloud/tidb-management-service/utilities/grpc/metadata"
)

func (s *serverImpl) ListVpcPeerings(
	ctx context.Context,
	req *openapingv1beta2.ListVpcPeeringsRequest,
) (*openapingv1beta2.ListVpcPeeringsResponse, error) {
	ctx, span := tracer.Start(ctx, "ListVpcPeerings")
	defer span.End()

	if _, err := metadata.ExtractRequestMetaWithCheckPermission(ctx); err != nil {
		return nil, bizerr.WrapErrorWithCode(err, bizerr.ErrCodeParams, "failed to extract request metadata")
	}

	tidbID, err := strconv.ParseUint(req.GetTidbId(), 10, 64)
	if err != nil {
		return nil, bizerr.WrapErrorWithCode(err, bizerr.ErrCodeParams, "invalid tidb id")
	}

	resp, err := s.nextgenCli.ListVpcPeerings(ctx, &globalngv1.ListVpcPeeringsRequest{
		ClusterId: tidbID,
	})
	if err != nil {
		return nil, wrapListError(err)
	}

	openapiPeerings := make([]*openapingv1beta2.VpcPeering, 0, len(resp.GetVpcPeerings()))
	for _, each := range resp.GetVpcPeerings() {
		openapiPeerings = append(openapiPeerings, cvtGlobalToOpenapiVpcPeering(each))
	}

	paged, nextPageToken, err := common.LocalPagination(
		openapiPeerings,
		req,
		common.ListDefaultPageSize,
		common.ListMaxPageSize,
	)
	if err != nil {
		return nil, bizerror.NewInternal(err, "failed to paginate byoc vpc peerings")
	}

	return &openapingv1beta2.ListVpcPeeringsResponse{
		VpcPeerings:   paged,
		NextPageToken: nextPageToken,
		TotalSize:     int32(len(openapiPeerings)),
	}, nil
}
