module AWS.ELB.Types
    where

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

data LoadBalancerDescription = LoadBalancerDescription
    { lbSecurityGroups :: [Text]
    , lbLoadBalancerName :: Text
    , lbCreatedTime :: UTCTime
    , lbHealthCheck :: HealthCheck
    , lbVPCId :: Maybe Text
    , lbListenerDescriptions :: [ListenerDescription]
    , lbInstances :: [Instance]
    , lbPolicies :: Policies
    , lbAvailabilityZones :: [Text]
    , lbCanonicalHostedZoneName :: Text
    , lbCanonicalHostedZoneNameID :: Text
    , lbScheme :: Text
    , lbSourceSecurityGroup :: Maybe SourceSecurityGroup
    , lbDNSName :: Text
    , lbBackendServerDescriptions :: [BackendServerDescription]
    , lbSubnets :: [Text]
    }
  deriving (Show, Eq)

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

data HealthCheck = HealthCheck
    { hcInterval :: Int
    , hcTarget :: Text
    , hcHealthyThreshold :: Int
    , hcTimeout :: Int
    , hcUnhealthyThreshold :: Int
    }
  deriving (Show, Eq)

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

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

data Listener = Listener
    { lProtocol :: Text
    , lLoadBalancerPort :: Int
    , lInstanceProtocol :: Text
    , lSSLCertificateId :: Maybe Text
    , lInstancePort :: Int
    }
  deriving (Show, Eq)

data Policies = Policies
    { pAppCookieStickinessPolicies :: [AppCookieStickinessPolicy]
    , pOtherPolicies :: [Text]
    , pLBCookieStickinessPolicies :: [LBCookieStickinessPolicy]
    }
  deriving (Show, Eq)

data AppCookieStickinessPolicy = AppCookieStickinessPolicy
    { acspCookieName :: Text
    , acspPolicyName :: Text
    }
  deriving (Show, Eq)

data LBCookieStickinessPolicy = LBCookieStickinessPolicy
    { lbcspCookieExpirationPeriod :: Integer
    , lbcspPolicyName :: Text
    }
  deriving (Show, Eq)

data SourceSecurityGroup = SourceSecurityGroup
    { ssgOwnerAlias :: Text
    , ssgGroupName :: Text
    }
  deriving (Show, Eq)