package vpcpeering

import (
	"context"

	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
)

type ExternalPeeringQueryer interface {
	ListByVPC(ctx context.Context, vpcCtx VPCContext) ([]ExternalPeering, error)
	GetByConnectionID(ctx context.Context, vpcCtx VPCContext, connectionID string) (*ExternalPeering, error)
}

func externalPeeringDedupKey(p ExternalPeering) string {
	return p.Provider + "|" + p.CurrentSide.VpcID + "|" + p.DestinationSide.VpcID + "|" +
		p.DestinationSide.AccountID + "|" + p.DestinationSide.Region
}

func externalPeeringFromCR(cr *v1alpha1.VPCPeering) ExternalPeering {
	peering := ExternalPeering{
		Provider:     cr.Spec.Provider,
		ConnectionID: cr.Status.ExternalName,
		Message:      cr.Status.Reason,
		CurrentSide: PeeringSide{
			VpcID:     cr.Annotations[v1alpha1.AnnotationKeySourceVPCID],
			AccountID: cr.Annotations[v1alpha1.AnnotationKeySourceAccountID],
			Region:    cr.Spec.Region,
			CIDR:      cr.Annotations[v1alpha1.AnnotationKeySourceVPCCIDR],
		},
	}

	if cr.Spec.Target.AWS != nil {
		peering.DestinationSide = PeeringSide{
			VpcID:     cr.Spec.Target.AWS.VpcID,
			AccountID: cr.Spec.Target.AWS.AccountID,
			Region:    cr.Spec.Target.AWS.Region,
			CIDR:      cr.Spec.Target.AWS.PeerCIDR,
		}
	}
	if cr.Spec.Target.AliCloud != nil {
		peering.DestinationSide = PeeringSide{
			VpcID:     cr.Spec.Target.AliCloud.VpcID,
			AccountID: cr.Spec.Target.AliCloud.UID,
			Region:    cr.Spec.Target.AliCloud.Region,
			CIDR:      cr.Spec.Target.AliCloud.PeerCIDR,
		}
	}

	return peering
}
