package gatewayroute

import (
	appmesh "github.com/aws/aws-app-mesh-controller-for-k8s/apis/appmesh/v1beta2"
	"github.com/aws/aws-app-mesh-controller-for-k8s/pkg/references"
	"k8s.io/apimachinery/pkg/runtime"
	"k8s.io/apimachinery/pkg/types"
)

const (
	ReferenceKindVirtualService = "VirtualService"
)

// ExtractVirtualServiceReferences extracts all virtualServiceReferences for this gatewayRoute
func ExtractVirtualServiceReferences(gr *appmesh.GatewayRoute) []appmesh.VirtualServiceReference {
	var vsRefs []appmesh.VirtualServiceReference

	if gr.Spec.GRPCRoute != nil && gr.Spec.GRPCRoute.Action.Target.VirtualService.VirtualServiceRef != nil {
		vsRefs = append(vsRefs, *gr.Spec.GRPCRoute.Action.Target.VirtualService.VirtualServiceRef)
	}
	if gr.Spec.HTTPRoute != nil && gr.Spec.HTTPRoute.Action.Target.VirtualService.VirtualServiceRef != nil {
		vsRefs = append(vsRefs, *gr.Spec.HTTPRoute.Action.Target.VirtualService.VirtualServiceRef)
	}
	if gr.Spec.HTTP2Route != nil && gr.Spec.HTTP2Route.Action.Target.VirtualService.VirtualServiceRef != nil {
		vsRefs = append(vsRefs, *gr.Spec.HTTP2Route.Action.Target.VirtualService.VirtualServiceRef)
	}

	return vsRefs
}

func VirtualServiceReferenceIndexFunc(obj runtime.Object) []types.NamespacedName {
	gr := obj.(*appmesh.GatewayRoute)
	vsRefs := ExtractVirtualServiceReferences(gr)
	var vsKeys []types.NamespacedName
	for _, vsRef := range vsRefs {
		vsKeys = append(vsKeys, references.ObjectKeyForVirtualServiceReference(gr, vsRef))
	}
	return vsKeys
}