package awsec2

import (
	_jsii_ "github.com/aws/jsii-runtime-go/runtime"

	"github.com/aws/aws-cdk-go/awscdk/v2"
	"github.com/aws/aws-cdk-go/awscdk/v2/awsec2/internal"
	"github.com/aws/constructs-go/constructs/v10"
)

type IVpc interface {
	awscdk.IResource
	IVPCRef
	// Adds a new client VPN endpoint to this VPC.
	AddClientVpnEndpoint(id *string, options *ClientVpnEndpointOptions) ClientVpnEndpoint
	// Adds a new Flow Log to this VPC.
	AddFlowLog(id *string, options *FlowLogOptions) FlowLog
	// Adds a new gateway endpoint to this VPC.
	AddGatewayEndpoint(id *string, options *GatewayVpcEndpointOptions) GatewayVpcEndpoint
	// Adds a new interface endpoint to this VPC.
	AddInterfaceEndpoint(id *string, options *InterfaceVpcEndpointOptions) InterfaceVpcEndpoint
	// Adds a new VPN connection to this VPC.
	AddVpnConnection(id *string, options *VpnConnectionOptions) VpnConnection
	// Adds a VPN Gateway to this VPC.
	EnableVpnGateway(options *EnableVpnGatewayOptions)
	// Return information on the subnets appropriate for the given selection strategy.
	//
	// Requires that at least one subnet is matched, throws a descriptive
	// error message otherwise.
	SelectSubnets(selection *SubnetSelection) *SelectedSubnets
	// AZs for this VPC.
	AvailabilityZones() *[]*string
	// Dependable that can be depended upon to force internet connectivity established on the VPC.
	InternetConnectivityEstablished() constructs.IDependable
	// List of isolated subnets in this VPC.
	IsolatedSubnets() *[]ISubnet
	// List of private subnets in this VPC.
	PrivateSubnets() *[]ISubnet
	// List of public subnets in this VPC.
	PublicSubnets() *[]ISubnet
	// ARN for this VPC.
	VpcArn() *string
	// CIDR range for this VPC.
	VpcCidrBlock() *string
	// Identifier for this VPC.
	VpcId() *string
	// Identifier for the VPN gateway.
	VpnGatewayId() *string
}

// The jsii proxy for IVpc
type jsiiProxy_IVpc struct {
	internal.Type__awscdkIResource
	jsiiProxy_IVPCRef
}

func (i *jsiiProxy_IVpc) AddClientVpnEndpoint(id *string, options *ClientVpnEndpointOptions) ClientVpnEndpoint {
	if err := i.validateAddClientVpnEndpointParameters(id, options); err != nil {
		panic(err)
	}
	var returns ClientVpnEndpoint

	_jsii_.Invoke(
		i,
		"addClientVpnEndpoint",
		[]interface{}{id, options},
		&returns,
	)

	return returns
}

func (i *jsiiProxy_IVpc) AddFlowLog(id *string, options *FlowLogOptions) FlowLog {
	if err := i.validateAddFlowLogParameters(id, options); err != nil {
		panic(err)
	}
	var returns FlowLog

	_jsii_.Invoke(
		i,
		"addFlowLog",
		[]interface{}{id, options},
		&returns,
	)

	return returns
}

func (i *jsiiProxy_IVpc) AddGatewayEndpoint(id *string, options *GatewayVpcEndpointOptions) GatewayVpcEndpoint {
	if err := i.validateAddGatewayEndpointParameters(id, options); err != nil {
		panic(err)
	}
	var returns GatewayVpcEndpoint

	_jsii_.Invoke(
		i,
		"addGatewayEndpoint",
		[]interface{}{id, options},
		&returns,
	)

	return returns
}

func (i *jsiiProxy_IVpc) AddInterfaceEndpoint(id *string, options *InterfaceVpcEndpointOptions) InterfaceVpcEndpoint {
	if err := i.validateAddInterfaceEndpointParameters(id, options); err != nil {
		panic(err)
	}
	var returns InterfaceVpcEndpoint

	_jsii_.Invoke(
		i,
		"addInterfaceEndpoint",
		[]interface{}{id, options},
		&returns,
	)

	return returns
}

func (i *jsiiProxy_IVpc) AddVpnConnection(id *string, options *VpnConnectionOptions) VpnConnection {
	if err := i.validateAddVpnConnectionParameters(id, options); err != nil {
		panic(err)
	}
	var returns VpnConnection

	_jsii_.Invoke(
		i,
		"addVpnConnection",
		[]interface{}{id, options},
		&returns,
	)

	return returns
}

func (i *jsiiProxy_IVpc) EnableVpnGateway(options *EnableVpnGatewayOptions) {
	if err := i.validateEnableVpnGatewayParameters(options); err != nil {
		panic(err)
	}
	_jsii_.InvokeVoid(
		i,
		"enableVpnGateway",
		[]interface{}{options},
	)
}

func (i *jsiiProxy_IVpc) SelectSubnets(selection *SubnetSelection) *SelectedSubnets {
	if err := i.validateSelectSubnetsParameters(selection); err != nil {
		panic(err)
	}
	var returns *SelectedSubnets

	_jsii_.Invoke(
		i,
		"selectSubnets",
		[]interface{}{selection},
		&returns,
	)

	return returns
}

func (i *jsiiProxy_IVpc) ApplyRemovalPolicy(policy awscdk.RemovalPolicy) {
	if err := i.validateApplyRemovalPolicyParameters(policy); err != nil {
		panic(err)
	}
	_jsii_.InvokeVoid(
		i,
		"applyRemovalPolicy",
		[]interface{}{policy},
	)
}

func (j *jsiiProxy_IVpc) AvailabilityZones() *[]*string {
	var returns *[]*string
	_jsii_.Get(
		j,
		"availabilityZones",
		&returns,
	)
	return returns
}

func (j *jsiiProxy_IVpc) InternetConnectivityEstablished() constructs.IDependable {
	var returns constructs.IDependable
	_jsii_.Get(
		j,
		"internetConnectivityEstablished",
		&returns,
	)
	return returns
}

func (j *jsiiProxy_IVpc) IsolatedSubnets() *[]ISubnet {
	var returns *[]ISubnet
	_jsii_.Get(
		j,
		"isolatedSubnets",
		&returns,
	)
	return returns
}

func (j *jsiiProxy_IVpc) PrivateSubnets() *[]ISubnet {
	var returns *[]ISubnet
	_jsii_.Get(
		j,
		"privateSubnets",
		&returns,
	)
	return returns
}

func (j *jsiiProxy_IVpc) PublicSubnets() *[]ISubnet {
	var returns *[]ISubnet
	_jsii_.Get(
		j,
		"publicSubnets",
		&returns,
	)
	return returns
}

func (j *jsiiProxy_IVpc) VpcArn() *string {
	var returns *string
	_jsii_.Get(
		j,
		"vpcArn",
		&returns,
	)
	return returns
}

func (j *jsiiProxy_IVpc) VpcCidrBlock() *string {
	var returns *string
	_jsii_.Get(
		j,
		"vpcCidrBlock",
		&returns,
	)
	return returns
}

func (j *jsiiProxy_IVpc) VpcId() *string {
	var returns *string
	_jsii_.Get(
		j,
		"vpcId",
		&returns,
	)
	return returns
}

func (j *jsiiProxy_IVpc) VpnGatewayId() *string {
	var returns *string
	_jsii_.Get(
		j,
		"vpnGatewayId",
		&returns,
	)
	return returns
}

func (j *jsiiProxy_IVpc) Env() *awscdk.ResourceEnvironment {
	var returns *awscdk.ResourceEnvironment
	_jsii_.Get(
		j,
		"env",
		&returns,
	)
	return returns
}

func (j *jsiiProxy_IVpc) Node() constructs.Node {
	var returns constructs.Node
	_jsii_.Get(
		j,
		"node",
		&returns,
	)
	return returns
}

func (j *jsiiProxy_IVpc) Stack() awscdk.Stack {
	var returns awscdk.Stack
	_jsii_.Get(
		j,
		"stack",
		&returns,
	)
	return returns
}

