package aws

import (
	"context"

	"github.com/aws/aws-sdk-go-v2/aws"
	ec2api "github.com/aws/aws-sdk-go-v2/service/ec2"
)

var _ Ec2Client = &ec2api.Client{}

type Ec2Client interface {
	DescribeRouteTables(ctx context.Context, params *ec2api.DescribeRouteTablesInput, optFns ...func(*ec2api.Options)) (*ec2api.DescribeRouteTablesOutput, error)
	DescribeSubnets(ctx context.Context, params *ec2api.DescribeSubnetsInput, optFns ...func(*ec2api.Options)) (*ec2api.DescribeSubnetsOutput, error)
	DescribePrefixLists(ctx context.Context, params *ec2api.DescribePrefixListsInput, optFns ...func(*ec2api.Options)) (*ec2api.DescribePrefixListsOutput, error)
	CreateVpcEndpoint(ctx context.Context, params *ec2api.CreateVpcEndpointInput, optFns ...func(*ec2api.Options)) (*ec2api.CreateVpcEndpointOutput, error)
	DeleteVpcEndpoints(ctx context.Context, params *ec2api.DeleteVpcEndpointsInput, optFns ...func(*ec2api.Options)) (*ec2api.DeleteVpcEndpointsOutput, error)
	DescribeVpcEndpoints(ctx context.Context, params *ec2api.DescribeVpcEndpointsInput, optFns ...func(*ec2api.Options)) (*ec2api.DescribeVpcEndpointsOutput, error)
	DescribeVpcEndpointServices(ctx context.Context, params *ec2api.DescribeVpcEndpointServicesInput, optFns ...func(*ec2api.Options)) (*ec2api.DescribeVpcEndpointServicesOutput, error)
	ModifyInstanceAttribute(ctx context.Context, params *ec2api.ModifyInstanceAttributeInput, optFns ...func(*ec2api.Options)) (*ec2api.ModifyInstanceAttributeOutput, error)
	CreateVpcPeeringConnection(ctx context.Context, params *ec2api.CreateVpcPeeringConnectionInput, optFns ...func(*ec2api.Options)) (*ec2api.CreateVpcPeeringConnectionOutput, error)
	AuthorizeSecurityGroupIngress(ctx context.Context, params *ec2api.AuthorizeSecurityGroupIngressInput, optFns ...func(*ec2api.Options)) (*ec2api.AuthorizeSecurityGroupIngressOutput, error)

	CreateVpcEndpointServiceConfiguration(ctx context.Context, params *ec2api.CreateVpcEndpointServiceConfigurationInput, optFns ...func(*ec2api.Options)) (*ec2api.CreateVpcEndpointServiceConfigurationOutput, error)
	DescribeVpcEndpointServiceConfigurations(ctx context.Context, params *ec2api.DescribeVpcEndpointServiceConfigurationsInput, optFns ...func(*ec2api.Options)) (*ec2api.DescribeVpcEndpointServiceConfigurationsOutput, error)
	DeleteVpcEndpointServiceConfigurations(ctx context.Context, params *ec2api.DeleteVpcEndpointServiceConfigurationsInput, optFns ...func(*ec2api.Options)) (*ec2api.DeleteVpcEndpointServiceConfigurationsOutput, error)
	StartVpcEndpointServicePrivateDnsVerification(ctx context.Context, params *ec2api.StartVpcEndpointServicePrivateDnsVerificationInput, optFns ...func(*ec2api.Options)) (*ec2api.StartVpcEndpointServicePrivateDnsVerificationOutput, error)
	ModifyVpcEndpointServicePermissions(ctx context.Context, param *ec2api.ModifyVpcEndpointServicePermissionsInput, optFns ...func(*ec2api.Options)) (*ec2api.ModifyVpcEndpointServicePermissionsOutput, error)
	DescribeVpcEndpointServicePermissions(ctx context.Context, param *ec2api.DescribeVpcEndpointServicePermissionsInput, optFns ...func(*ec2api.Options)) (*ec2api.DescribeVpcEndpointServicePermissionsOutput, error)
	DescribeVpcEndpointConnections(ctx context.Context, param *ec2api.DescribeVpcEndpointConnectionsInput, optFns ...func(*ec2api.Options)) (*ec2api.DescribeVpcEndpointConnectionsOutput, error)
	RejectVpcEndpointConnections(ctx context.Context, param *ec2api.RejectVpcEndpointConnectionsInput, optFns ...func(*ec2api.Options)) (*ec2api.RejectVpcEndpointConnectionsOutput, error)
	AcceptVpcEndpointConnections(ctx context.Context, param *ec2api.AcceptVpcEndpointConnectionsInput, optFns ...func(*ec2api.Options)) (*ec2api.AcceptVpcEndpointConnectionsOutput, error)
}

func newEc2(cfg aws.Config) Ec2Client {
	c := ec2api.NewFromConfig(cfg)
	return c
}

func WithEC2Region(region string) func(*ec2api.Options) {
	return func(options *ec2api.Options) {
		options.Region = region
	}
}
