{-# LANGUAGE DataKinds                   #-}
{-# LANGUAGE DeriveGeneric               #-}
{-# LANGUAGE FlexibleInstances           #-}
{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
{-# LANGUAGE LambdaCase                  #-}
{-# LANGUAGE NoImplicitPrelude           #-}
{-# LANGUAGE OverloadedStrings           #-}
{-# LANGUAGE RecordWildCards             #-}
{-# LANGUAGE TypeFamilies                #-}

{-# OPTIONS_GHC -fno-warn-unused-imports #-}

-- Module      : Network.AWS.Route53.UpdateHealthCheck
-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
-- License     : This Source Code Form is subject to the terms of
--               the Mozilla Public License, v. 2.0.
--               A copy of the MPL can be found in the LICENSE file or
--               you can obtain it at http://mozilla.org/MPL/2.0/.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--
-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- | This action updates an existing health check.
--
-- To update a health check, send a 'POST' request to the '2013-04-01/healthcheck//health check ID/ resource. The request body must include an XML document with
-- an 'UpdateHealthCheckRequest' element. The response returns an 'UpdateHealthCheckResponse' element, which contains metadata about the health check.
--
-- <http://docs.aws.amazon.com/Route53/latest/APIReference/API_UpdateHealthCheck.html>
module Network.AWS.Route53.UpdateHealthCheck
    (
    -- * Request
      UpdateHealthCheck
    -- ** Request constructor
    , updateHealthCheck
    -- ** Request lenses
    , uhcFailureThreshold
    , uhcFullyQualifiedDomainName
    , uhcHealthCheckId
    , uhcHealthCheckVersion
    , uhcIPAddress
    , uhcPort
    , uhcResourcePath
    , uhcSearchString

    -- * Response
    , UpdateHealthCheckResponse
    -- ** Response constructor
    , updateHealthCheckResponse
    -- ** Response lenses
    , uhcrHealthCheck
    ) where

import Network.AWS.Prelude
import Network.AWS.Request.RestXML
import Network.AWS.Route53.Types
import qualified GHC.Exts

data UpdateHealthCheck = UpdateHealthCheck
    { _uhcFailureThreshold         :: Maybe Nat
    , _uhcFullyQualifiedDomainName :: Maybe Text
    , _uhcHealthCheckId            :: Text
    , _uhcHealthCheckVersion       :: Maybe Nat
    , _uhcIPAddress                :: Maybe Text
    , _uhcPort                     :: Maybe Nat
    , _uhcResourcePath             :: Maybe Text
    , _uhcSearchString             :: Maybe Text
    } deriving (Eq, Ord, Read, Show)

-- | 'UpdateHealthCheck' constructor.
--
-- The fields accessible through corresponding lenses are:
--
-- * 'uhcFailureThreshold' @::@ 'Maybe' 'Natural'
--
-- * 'uhcFullyQualifiedDomainName' @::@ 'Maybe' 'Text'
--
-- * 'uhcHealthCheckId' @::@ 'Text'
--
-- * 'uhcHealthCheckVersion' @::@ 'Maybe' 'Natural'
--
-- * 'uhcIPAddress' @::@ 'Maybe' 'Text'
--
-- * 'uhcPort' @::@ 'Maybe' 'Natural'
--
-- * 'uhcResourcePath' @::@ 'Maybe' 'Text'
--
-- * 'uhcSearchString' @::@ 'Maybe' 'Text'
--
updateHealthCheck :: Text -- ^ 'uhcHealthCheckId'
                  -> UpdateHealthCheck
updateHealthCheck p1 = UpdateHealthCheck
    { _uhcHealthCheckId            = p1
    , _uhcHealthCheckVersion       = Nothing
    , _uhcIPAddress                = Nothing
    , _uhcPort                     = Nothing
    , _uhcResourcePath             = Nothing
    , _uhcFullyQualifiedDomainName = Nothing
    , _uhcSearchString             = Nothing
    , _uhcFailureThreshold         = Nothing
    }

-- | The number of consecutive health checks that an endpoint must pass or fail
-- for Route 53 to change the current status of the endpoint from unhealthy to
-- healthy or vice versa.
--
-- Valid values are integers between 1 and 10. For more information, see "How
-- Amazon Route 53 Determines Whether an Endpoint Is Healthy" in the Amazon
-- Route 53 Developer Guide.
--
-- Specify this value only if you want to change it.
uhcFailureThreshold :: Lens' UpdateHealthCheck (Maybe Natural)
uhcFailureThreshold =
    lens _uhcFailureThreshold (\s a -> s { _uhcFailureThreshold = a })
        . mapping _Nat

-- | Fully qualified domain name of the instance to be health checked.
--
-- Specify this value only if you want to change it.
uhcFullyQualifiedDomainName :: Lens' UpdateHealthCheck (Maybe Text)
uhcFullyQualifiedDomainName =
    lens _uhcFullyQualifiedDomainName
        (\s a -> s { _uhcFullyQualifiedDomainName = a })

-- | The ID of the health check to update.
uhcHealthCheckId :: Lens' UpdateHealthCheck Text
uhcHealthCheckId = lens _uhcHealthCheckId (\s a -> s { _uhcHealthCheckId = a })

-- | Optional. When you specify a health check version, Route 53 compares this
-- value with the current value in the health check, which prevents you from
-- updating the health check when the versions don't match. Using 'HealthCheckVersion' lets you prevent overwriting another change to the health check.
uhcHealthCheckVersion :: Lens' UpdateHealthCheck (Maybe Natural)
uhcHealthCheckVersion =
    lens _uhcHealthCheckVersion (\s a -> s { _uhcHealthCheckVersion = a })
        . mapping _Nat

-- | The IP address of the resource that you want to check.
--
-- Specify this value only if you want to change it.
uhcIPAddress :: Lens' UpdateHealthCheck (Maybe Text)
uhcIPAddress = lens _uhcIPAddress (\s a -> s { _uhcIPAddress = a })

-- | The port on which you want Route 53 to open a connection to perform health
-- checks.
--
-- Specify this value only if you want to change it.
uhcPort :: Lens' UpdateHealthCheck (Maybe Natural)
uhcPort = lens _uhcPort (\s a -> s { _uhcPort = a }) . mapping _Nat

-- | The path that you want Amazon Route 53 to request when performing health
-- checks. The path can be any value for which your endpoint will return an HTTP
-- status code of 2xx or 3xx when the endpoint is healthy, for example the file
-- /docs/route53-health-check.html.
--
-- Specify this value only if you want to change it.
uhcResourcePath :: Lens' UpdateHealthCheck (Maybe Text)
uhcResourcePath = lens _uhcResourcePath (\s a -> s { _uhcResourcePath = a })

-- | If the value of 'Type' is 'HTTP_STR_MATCH' or 'HTTP_STR_MATCH', the string that you
-- want Route 53 to search for in the response body from the specified resource.
-- If the string appears in the response body, Route 53 considers the resource
-- healthy.
--
-- Specify this value only if you want to change it.
uhcSearchString :: Lens' UpdateHealthCheck (Maybe Text)
uhcSearchString = lens _uhcSearchString (\s a -> s { _uhcSearchString = a })

newtype UpdateHealthCheckResponse = UpdateHealthCheckResponse
    { _uhcrHealthCheck :: HealthCheck
    } deriving (Eq, Read, Show)

-- | 'UpdateHealthCheckResponse' constructor.
--
-- The fields accessible through corresponding lenses are:
--
-- * 'uhcrHealthCheck' @::@ 'HealthCheck'
--
updateHealthCheckResponse :: HealthCheck -- ^ 'uhcrHealthCheck'
                          -> UpdateHealthCheckResponse
updateHealthCheckResponse p1 = UpdateHealthCheckResponse
    { _uhcrHealthCheck = p1
    }

uhcrHealthCheck :: Lens' UpdateHealthCheckResponse HealthCheck
uhcrHealthCheck = lens _uhcrHealthCheck (\s a -> s { _uhcrHealthCheck = a })

instance ToPath UpdateHealthCheck where
    toPath UpdateHealthCheck{..} = mconcat
        [ "/2013-04-01/healthcheck/"
        , toText _uhcHealthCheckId
        ]

instance ToQuery UpdateHealthCheck where
    toQuery = const mempty

instance ToHeaders UpdateHealthCheck

instance ToXMLRoot UpdateHealthCheck where
    toXMLRoot UpdateHealthCheck{..} = namespaced ns "UpdateHealthCheck"
        [ "HealthCheckVersion"       =@ _uhcHealthCheckVersion
        , "IPAddress"                =@ _uhcIPAddress
        , "Port"                     =@ _uhcPort
        , "ResourcePath"             =@ _uhcResourcePath
        , "FullyQualifiedDomainName" =@ _uhcFullyQualifiedDomainName
        , "SearchString"             =@ _uhcSearchString
        , "FailureThreshold"         =@ _uhcFailureThreshold
        ]

instance ToXML UpdateHealthCheck

instance AWSRequest UpdateHealthCheck where
    type Sv UpdateHealthCheck = Route53
    type Rs UpdateHealthCheck = UpdateHealthCheckResponse

    request  = post
    response = xmlResponse

instance FromXML UpdateHealthCheckResponse where
    parseXML x = UpdateHealthCheckResponse
        <$> x .@  "HealthCheck"