{-# LANGUAGE TypeFamilies
           , MultiParamTypeClasses
           , FlexibleInstances
           , OverloadedStrings
           , TemplateHaskell
           , RecordWildCards
           #-}

module Aws.Elb.Commands.ModifyLoadBalancerAttributes where

import Aws.Elb.TH

type S3BucketName = Text
type S3BucketPrefix = Text
data EmitInterval = Min5 | Min60 deriving (Show)

data LoadBalancerAttribute = AccessLog Bool EmitInterval S3BucketName S3BucketPrefix
                           | ConnectionDraining Bool Int
                           | CrossZoneLoadBalancing Bool
                           deriving (Show)

data ModifyLoadBalancerAttributes = ModifyLoadBalancerAttributes
                        { mlba_name :: Text
                        , mlba_attributes :: [LoadBalancerAttribute]
                        } deriving (Show)

attributeQuery (AccessLog False _ _ _)
      = [ ("LoadBalancerAttributes.AccessLog.Enabled", qBool False)
        ]
attributeQuery (AccessLog enabled interval bucket prefix)
      = [ ("LoadBalancerAttributes.AccessLog.Enabled", qBool enabled)
        , ("LoadBalancerAttributes.AccessLog.EmitInterval", int interval)
        , ("LoadBalancerAttributes.AccessLog.S3BucketName", qArg bucket)
        , ("LoadBalancerAttributes.AccessLog.S3BucketPrefix", qArg prefix)
        ] where int Min5 = qShow 5
                int Min60 = qShow 60
attributeQuery (ConnectionDraining False timeout)
      = [ ("LoadBalancerAttributes.ConnectionDraining.Enabled", qBool False)
        ]
attributeQuery (ConnectionDraining enabled timeout)
      = [ ("LoadBalancerAttributes.ConnectionDraining.Enabled", qBool enabled)
        , ("LoadBalancerAttributes.ConnectionDraining.Timeout", qShow timeout)
        ]
attributeQuery (CrossZoneLoadBalancing enabled)
      = [ ("LoadBalancerAttributes.CrossZoneLoadBalancing.Enabled", qBool enabled)
        ]

instance SignQuery ModifyLoadBalancerAttributes where
    type ServiceConfiguration ModifyLoadBalancerAttributes = QueryAPIConfiguration
    signQuery ModifyLoadBalancerAttributes{..} = elbSignQuery $
                                                    [ ("Action", qArg "ModifyLoadBalancerAttributes")
                                                    , defVersion
                                                    , ("LoadBalancerName", qArg mlba_name)
                                                    ] +++ concatMap attributeQuery mlba_attributes

ELBVALUETRANSACTION(ModifyLoadBalancerAttributes,"ModifyLoadBalancerAttributesResult")