module AWS.ELB.Types
    where

import Data.Text (Text)
import Data.Time (UTCTime)

data LoadBalancer = LoadBalancer
    { loadBalancerSecurityGroups :: [Text]
    , loadBalancerCreatedTime :: UTCTime
    , loadBalancerLoadBalancerName :: Text
    , loadBalancerHealthCheck :: HealthCheck
    , loadBalancerVPCId :: Maybe Text
    , loadBalancerListenerDescriptions :: [ListenerDescription]
    , loadBalancerInstances :: [Instance]
    , loadBalancerPolicies :: Policies
    , loadBalancerAvailabilityZones :: [Text]
    , loadBalancerCanonicalHostedZoneName :: Maybe Text
    , loadBalancerCanonicalHostedZoneNameID :: Maybe Text
    , loadBalancerScheme :: Text
    , loadBalancerSourceSecurityGroup :: Maybe SourceSecurityGroup
    , loadBalancerDNSName :: Text
    , loadBalancerBackendServerDescriptions
        :: [BackendServerDescription]
    , loadBalancerSubnets :: [Text]
    }
  deriving (Show, Eq)

data BackendServerDescription = BackendServerDescription
    { backendServerInstancePort :: Int
    , backendServerPolicyNames :: [Text]
    }
  deriving (Show, Eq)

data HealthCheck = HealthCheck
    { healthCheckInterval :: Int
    , healthCheckTarget :: Text
    , healthCheckHealthyThreshold :: Int
    , healthCheckTimeout :: Int
    , healthCheckUnhealthyThreshold :: Int
    }
  deriving (Show, Eq)

data Instance = Instance
    { instanceId :: Text
    }
  deriving (Show, Eq)

data ListenerDescription = ListenerDescription
    { listenerDescriptionPolicyNames :: [Text]
    , listenerDescriptionListener :: Listener
    }
  deriving (Show, Eq)

data Listener = Listener
    { listenerProtocol :: Text
    , listenerLoadBalancerPort :: Int
    , listenerInstanceProtocol :: Text
    , listenerSSLCertificateId :: Maybe Text
    , listenerInstancePort :: Int
    }
  deriving (Show, Eq)

data Policies = Policies
    { policiesAppCookieStickinessPolicies :: [AppCookieStickinessPolicy]
    , policiesOtherPolicies :: [Text]
    , policiesLBCookieStickinessPolicies :: [LBCookieStickinessPolicy]
    }
  deriving (Show, Eq)

data AppCookieStickinessPolicy = AppCookieStickinessPolicy
    { appCookieStickinessPolicyCookieName :: Text
    , appCookieStickinessPolicyPolicyName :: Text
    }
  deriving (Show, Eq)

data LBCookieStickinessPolicy = LBCookieStickinessPolicy
    { lbCookieStickinessPolicyCookieExpirationPeriod :: Integer
    , lbCookieStickinessPolicyPolicyName :: Text
    }
  deriving (Show, Eq)

data SourceSecurityGroup = SourceSecurityGroup
    { sourceSecurityGroupOwnerAlias :: Text
    , sourceSecurityGroupGroupName :: Text
    }
  deriving (Show, Eq)