package awsupbound

import (
	"testing"

	xpv1 "github.com/crossplane/crossplane-runtime/apis/common/v1"
	"github.com/stretchr/testify/assert"
	ec2v1beta1 "github.com/upbound/provider-aws/apis/ec2/v1beta1"
)

func TestIsVPCEndpointReusable(t *testing.T) {
	svc := "svc-test"
	vpc := "vpc-123"
	et := "Interface"

	tests := []struct {
		name         string
		mockEndpoint func() *ec2v1beta1.VPCEndpoint
		want         bool
	}{
		{
			name: "ready and matching",
			mockEndpoint: func() *ec2v1beta1.VPCEndpoint {
				ep := &ec2v1beta1.VPCEndpoint{}
				ep.Status.SetConditions(xpv1.Available())
				ep.Spec.ForProvider.ServiceName = &svc
				ep.Spec.ForProvider.VPCID = &vpc
				ep.Spec.ForProvider.VPCEndpointType = &et
				return ep
			},
			want: true,
		},
		{
			name: "deleting",
			mockEndpoint: func() *ec2v1beta1.VPCEndpoint {
				ep := &ec2v1beta1.VPCEndpoint{}
				ep.Status.SetConditions(xpv1.Deleting())
				ep.Spec.ForProvider.ServiceName = &svc
				ep.Spec.ForProvider.VPCID = &vpc
				ep.Spec.ForProvider.VPCEndpointType = &et
				return ep
			},
			want: false,
		},
		{
			name: "mismatch type",
			mockEndpoint: func() *ec2v1beta1.VPCEndpoint {
				ep := &ec2v1beta1.VPCEndpoint{}
				ep.Status.SetConditions(xpv1.Available())
				ep.Spec.ForProvider.ServiceName = &svc
				ep.Spec.ForProvider.VPCID = &vpc
				wrongType := "Gateway"
				ep.Spec.ForProvider.VPCEndpointType = &wrongType
				return ep
			},
			want: false,
		},
		{
			name: "mismatch service",
			mockEndpoint: func() *ec2v1beta1.VPCEndpoint {
				ep := &ec2v1beta1.VPCEndpoint{}
				ep.Status.SetConditions(xpv1.Available())
				wrongSvc := "svc-other"
				ep.Spec.ForProvider.ServiceName = &wrongSvc
				ep.Spec.ForProvider.VPCID = &vpc
				ep.Spec.ForProvider.VPCEndpointType = &et
				return ep
			},
			want: false,
		},
		{
			name: "mismatch vpc",
			mockEndpoint: func() *ec2v1beta1.VPCEndpoint {
				ep := &ec2v1beta1.VPCEndpoint{}
				ep.Status.SetConditions(xpv1.Available())
				ep.Spec.ForProvider.ServiceName = &svc
				wrongVpc := "vpc-other"
				ep.Spec.ForProvider.VPCID = &wrongVpc
				ep.Spec.ForProvider.VPCEndpointType = &et
				return ep
			},
			want: false,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			assert.Equal(t, tt.want, isVPCEndpointReusable(tt.mockEndpoint(), et, svc, vpc))
		})
	}
}
