package infraapi

import (
	"context"
	"testing"

	"github.com/pingcap/dbaas/central/db/entity"
	"github.com/pingcap/errors"
	"github.com/stretchr/testify/assert"
	apierrors "k8s.io/apimachinery/pkg/api/errors"
	"sigs.k8s.io/controller-runtime/pkg/client/fake"
)

const (
	providerAWS = "aws"
	providerGCP = "gcp"
)

func TestNetworkPeers(t *testing.T) {
	var (
		client = fake.NewFakeClientWithScheme(scheme)
		api    = &API{
			projectName: "test",
			client:      client,
		}
		ctx               = context.Background()
		tenantID          = uint64(123)
		projectID         = uint64(456)
		region            = "us-west-2"
		customRegion      = "us-est-1"
		peerAccountId     = "789"
		customerVpcId     = "vpc-456"
		customerVpcCidr   = "10.1.0.0/16"
		customerProjectId = "project-123"
	)

	err := api.CreateAwsNetworkPeer(
		ctx,
		tenantID,
		projectID,
		providerAWS,
		region,
		customRegion,
		peerAccountId,
		customerVpcId,
		customerVpcCidr,
		entity.PeeringTypeCustomer,
	)
	assert.Nil(t, err)

	// the 'IsAlreadyExisted' error can not be catch
	err = api.CreateAwsNetworkPeer(
		ctx,
		tenantID,
		projectID,
		providerAWS,
		region,
		customRegion,
		peerAccountId,
		customerVpcId,
		customerVpcCidr,
		entity.PeeringTypeCustomer,
	)
	assert.Nil(t, err)

	err = api.CreateGcpVpcPeer(
		ctx,
		providerGCP,
		projectID,
		tenantID,
		region,
		customerProjectId,
		customerVpcId,
		customRegion,
		entity.PeeringTypeCustomer,
	)
	assert.Nil(t, err)

	// the 'IsAlreadyExisted' error can not be catch
	err = api.CreateGcpVpcPeer(
		ctx,
		providerGCP,
		projectID,
		tenantID,
		region,
		customerProjectId,
		customerVpcId,
		customRegion,
		entity.PeeringTypeCustomer,
	)
	assert.Nil(t, err)

	gotAwsNp, err := api.GetNetworkPeer(ctx, providerAWS, projectID, region, customerVpcId)
	assert.Nil(t, err)
	assert.Equal(t, gotAwsNp.Name, "aws-us-west-2-vpc-456-networkpeer")
	gotGcpNp, err := api.GetNetworkPeer(ctx, providerGCP, projectID, region, customerVpcId)
	assert.Nil(t, err)
	assert.Equal(t, gotGcpNp.Name, "gcp-us-west-2-vpc-456-networkpeer")
	err = api.DeleteNetworkPeerIgnoreNotFound(ctx, providerGCP, projectID, region, customerVpcId)
	assert.Nil(t, err)
	gotGcpNp, err = api.GetNetworkPeer(ctx, providerGCP, projectID, region, customerVpcId)
	assert.True(t, apierrors.IsNotFound(errors.Cause(err)))
	assert.Nil(t, gotGcpNp)
	err = api.DeleteNetworkPeerIgnoreNotFound(ctx, providerAWS, projectID, region, customerVpcId)
	assert.Nil(t, err)
	gotAwsNp, err = api.GetNetworkPeer(ctx, providerAWS, projectID, region, customerVpcId)
	assert.True(t, apierrors.IsNotFound(errors.Cause(err)))
	assert.Nil(t, gotAwsNp)
}
