package cvt

import (
	"fmt"
	"strings"

	"github.com/pingcap/dbaas/central/config"
	"github.com/pingcap/dbaas/central/db/entity"
	"github.com/tidbcloud/idl/pbgen/proto/central"
	"github.com/tidbcloud/idl/pbgen/proto/core"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
)

func VpcPeeringStatus(status core.NetworkPeer_Status) entity.PeeringStatus {
	switch status {
	case core.NetworkPeer_STATUS_PENDING:
		return cloudv1.NetworkPeerPhasePending
	case core.NetworkPeer_STATUS_ACTIVE:
		return cloudv1.NetworkPeerPhaseActive
	default:
		panic(fmt.Sprintf("unknown peering status: %s", status))
	}
}

func AwsVpcPeering(peering *core.NetworkPeer) *central.AwsVpcPeering {
	return &central.AwsVpcPeering{
		Region:          peering.Region,
		PrivateHostZone: peering.Aws.PrivateHostZone,
		VpcPeeringId:    peering.Aws.VpcPeeringId,
		VpcCidr:         peering.VpcCidr,
		TenantVpcCidr:   peering.PeerVpcCidr,
		TenantVpcId:     peering.PeerNetwork,
		Status:          strings.ToLower(string(VpcPeeringStatus(peering.Status))),
		Id:              peering.Id,
	}
}

func GcpVpcPeering(peering *core.NetworkPeer) *central.GcpVpcPeering {
	return &central.GcpVpcPeering{
		Region:            peering.Region,
		NetworkName:       peering.Network,
		ProjectId:         config.Global().InfraConfig.GcpProject,
		TenantProjectId:   peering.Gcp.PeerProjectId,
		TenantNetworkName: peering.PeerNetwork,
		Status:            strings.ToLower(string(VpcPeeringStatus(peering.Status))),
		VpcCidr:           peering.VpcCidr,
		Id:                peering.Id,
		TenantVpcCidr:     peering.PeerVpcCidr,
	}
}
