{-# LANGUAGE TemplateHaskell #-}

module AWS.EC2.Types.VPC
    ( Attachment(..)
    , AttachmentState(..)
    , CreateVpnGatewayType(..)
    , CustomerGateway(..)
    , CustomerGatewayState(..)
    , DhcpConfiguration(..)
    , DhcpOptions(..)
    , DhcpValue(..)
    , InternetGateway(..)
    , InternetGatewayAttachment(..)
    , InternetGatewayAttachmentState(..)
    , Vpc(..)
    , VpcState(..)
    , VpnConnection(..)
    , VpnConnectionOptionsRequest(..)
    , VpnConnectionState(..)
    , VpnGateway(..)
    , VpnGatewayState(..)
    , VpnStaticRoute(..)
    , VpnStaticRouteSource(..)
    , VpnStaticRouteState(..)
    , VpnTunnelTelemetry(..)
    ) where

import AWS.EC2.Types.Common (ResourceTag)
import AWS.Lib.FromText

data Attachment = Attachment
    { attachmentVpcId :: Text
    , attachmentState :: AttachmentState
    }
  deriving (Show, Read, Eq)

data AttachmentState
    = AttachmentStateAttaching
    | AttachmentStateAttached
    | AttachmentStateDetaching
    | AttachmentStateDetached
  deriving (Show, Read, Eq)

data CreateVpnGatewayType = CreateVpnGatewayTypeIpsec1

data CustomerGateway = CustomerGateway
    { customerGatewayId :: Text
    , customerGatewayState :: CustomerGatewayState
    , customerGatewayType :: Text
    , customerGatewayIpAddress :: IPv4
    , customerGatewayBgpAsn :: Int
    , customerGatewayTagSet :: [ResourceTag]
    }
  deriving (Show, Read, Eq)

data CustomerGatewayState
    = CustomerGatewayStatePending
    | CustomerGatewayStateAvailable
    | CustomerGatewayStateDeleting
    | CustomerGatewayStateDeleted
  deriving (Show, Read, Eq)

data DhcpOptions = DhcpOptions
    { dhcpOptionsId :: Text
    , dhcpOptionsDhcpConfigurationSet :: [DhcpConfiguration]
    , dhcpOptionsTagSet :: [ResourceTag]
    }
  deriving (Show, Read, Eq)

data DhcpConfiguration = DhcpConfiguration
    { dhcpConfigurationKey :: Text
    , dhcpConfigurationDhcpValueSet :: [DhcpValue]
    }
  deriving (Show, Read, Eq)

data DhcpValue = DhcpValue
    { dhcpValueValue :: Text
    }
  deriving (Show, Read, Eq)

data InternetGateway = InternetGateway
    { internetGatewayInternetGatewayId :: Text
    , internetGatewayAttachmentSet :: [InternetGatewayAttachment]
    , internetGatewayTagSet :: [ResourceTag]
    }
  deriving (Show, Read, Eq)

data InternetGatewayAttachment = InternetGatewayAttachment
    { internetGatewayAttachmentVpcId :: Text
    , internetGatewayAttachmentState :: InternetGatewayAttachmentState
    }
  deriving (Show, Read, Eq)

data InternetGatewayAttachmentState
    = InternetGatewayAttachmentStateAttaching
    | InternetGatewayAttachmentStateAttached
    | InternetGatewayAttachmentStateDetaching
    | InternetGatewayAttachmentStateDetached
    | InternetGatewayAttachmentStateAvailable
  deriving (Show, Read, Eq)

data Vpc = Vpc
    { vpcId :: Text
    , vpcState :: VpcState
    , vpcCidrBlock :: AddrRange IPv4
    , vpcDhcpOptionsId :: Text
    , vpcTagSet :: [ResourceTag]
    , vpcInstanceTenancy :: Text
    , vpcIsDefault :: Maybe Text
    }
  deriving (Show, Read, Eq)

data VpcState
    = VpcStatePending
    | VpcStateAvailable
  deriving (Show, Read, Eq)

data VpnConnection = VpnConnection
    { vpnConnectionId :: Text
    , vpnConnectionState :: VpnConnectionState
    , vpnConnectionCustomerGatewayConfiguration :: Maybe Text
    , vpnConnectionType :: Maybe Text
    , vpnConnectionCustomerGatewayId :: Text
    , vpnConnectionVpnGatewayId :: Text
    , vpnConnectionTagSet :: [ResourceTag]
    , vpnConnectionVgwTelemetry :: [VpnTunnelTelemetry]
    , vpnConnectionOptions :: Maybe VpnConnectionOptionsRequest
    , vpnConnectionRoutes :: Maybe VpnStaticRoute
    }
  deriving (Show, Read, Eq)

data VpnConnectionOptionsRequest = VpnConnectionOptionsRequest
    { vpnConnectionOptionsRequestStaticRoutesOnly :: Bool
    }
  deriving (Show, Read, Eq)

data VpnConnectionState
    = VpnConnectionStatePending
    | VpnConnectionStateAvailable
    | VpnConnectionStateDeleting
    | VpnConnectionStateDeleted
  deriving (Show, Read, Eq)

data VpnGateway = VpnGateway
    { vpnGatewayId :: Text
    , vpnGatewayState :: VpnGatewayState
    , vpnGatewayType :: Text
    , vpnGatewayAvailabilityZone :: Maybe Text
    , vpnGatewayAttachments :: [Attachment]
    , vpnGatewayTagSet :: [ResourceTag]
    }
  deriving (Show, Read, Eq)

data VpnGatewayState
    = VpnGatewayStatePending
    | VpnGatewayStateAvailable
    | VpnGatewayStateDeleting
    | VpnGatewayStateDeleted
  deriving (Show, Read, Eq)

data VpnStaticRoute = VpnStaticRoute
    { vpnStaticRouteDestinationCidrBlock :: Text
    , vpnStaticRouteSource :: VpnStaticRouteSource
    , vpnStaticRouteState :: VpnStaticRouteState
    }
  deriving (Show, Read, Eq)

data VpnStaticRouteSource = VpnStaticRouteSourceStatic
  deriving (Show, Read, Eq)

data VpnStaticRouteState
    = VpnStaticRouteStatePending
    | VpnStaticRouteStateAvailable
    | VpnStaticRouteStateDeleting
    | VpnStaticRouteStateDeleted
  deriving (Show, Read, Eq)

data VpnTunnelTelemetry = VpnTunnelTelemetry
    { vpnTunnelTelemetryOutsideIpAddress :: IPv4
    , vpnTunnelTelemetryStatus :: VpnTunnelTelemetryStatus
    , vpnTunnelTelemetryLastStatusChange :: UTCTime
    , vpnTunnelTelemetryStatusMessage :: Text
    , vpnTunnelTelemetryAcceptRouteCount :: Int
    }
  deriving (Show, Read, Eq)

data VpnTunnelTelemetryStatus
    = VpnTunnelTelemetryStatusUp
    | VpnTunnelTelemetryStatusDown
  deriving (Show, Read, Eq)

deriveFromText "AttachmentState"
    ["attaching", "attached", "detaching", "detached"]
deriveFromText "CustomerGatewayState"
    ["pending", "available", "deleting", "deleted"]
deriveFromText "InternetGatewayAttachmentState"
    ["attaching", "attached", "detaching", "detached", "available"]
deriveFromText "VpcState" ["pending", "available"]
deriveFromText "VpnConnectionState"
    ["pending", "available", "deleting", "deleted"]
deriveFromText "VpnGatewayState"
    ["pending", "available", "deleting", "deleted"]
deriveFromText "VpnStaticRouteSource" ["Static"]
deriveFromText "VpnStaticRouteState"
    ["pending", "available", "deleting", "deleted"]
deriveFromText "VpnTunnelTelemetryStatus" ["UP", "DOWN"]