{-# 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.SWF.TerminateWorkflowExecution
-- 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)

-- | Records a WorkflowExecutionTerminated event and forces closure of the
-- workflow execution identified by the given domain, runId, and workflowId.
-- The child policy, registered with the workflow type or specified when
-- starting this execution, is applied to any open child workflow executions
-- of this workflow execution. If the identified workflow execution was in
-- progress, it is terminated immediately. Access Control You can use IAM
-- policies to control this action's access to Amazon SWF resources as
-- follows: Use a Resource element with the domain name to limit the action to
-- only specified domains. Use an Action element to allow or deny permission
-- to call this action. You cannot use an IAM policy to constrain this
-- action's parameters. If the caller does not have sufficient permissions to
-- invoke the action, or the parameter values fall outside the specified
-- constraints, the action fails by throwing OperationNotPermitted. For
-- details and example IAM policies, see Using IAM to Manage Access to Amazon
-- SWF Workflows.
--
-- <http://docs.aws.amazon.com/amazonswf/latest/apireference/API_TerminateWorkflowExecution.html>
module Network.AWS.SWF.TerminateWorkflowExecution
    (
    -- * Request
      TerminateWorkflowExecution
    -- ** Request constructor
    , terminateWorkflowExecution
    -- ** Request lenses
    , tweChildPolicy
    , tweDetails
    , tweDomain
    , tweReason
    , tweRunId
    , tweWorkflowId

    -- * Response
    , TerminateWorkflowExecutionResponse
    -- ** Response constructor
    , terminateWorkflowExecutionResponse
    ) where

import Network.AWS.Prelude
import Network.AWS.Request.JSON
import Network.AWS.SWF.Types
import qualified GHC.Exts

data TerminateWorkflowExecution = TerminateWorkflowExecution
    { _tweChildPolicy :: Maybe Text
    , _tweDetails     :: Maybe Text
    , _tweDomain      :: Text
    , _tweReason      :: Maybe Text
    , _tweRunId       :: Maybe Text
    , _tweWorkflowId  :: Text
    } deriving (Eq, Ord, Show)

-- | 'TerminateWorkflowExecution' constructor.
--
-- The fields accessible through corresponding lenses are:
--
-- * 'tweChildPolicy' @::@ 'Maybe' 'Text'
--
-- * 'tweDetails' @::@ 'Maybe' 'Text'
--
-- * 'tweDomain' @::@ 'Text'
--
-- * 'tweReason' @::@ 'Maybe' 'Text'
--
-- * 'tweRunId' @::@ 'Maybe' 'Text'
--
-- * 'tweWorkflowId' @::@ 'Text'
--
terminateWorkflowExecution :: Text -- ^ 'tweDomain'
                           -> Text -- ^ 'tweWorkflowId'
                           -> TerminateWorkflowExecution
terminateWorkflowExecution p1 p2 = TerminateWorkflowExecution
    { _tweDomain      = p1
    , _tweWorkflowId  = p2
    , _tweRunId       = Nothing
    , _tweReason      = Nothing
    , _tweDetails     = Nothing
    , _tweChildPolicy = Nothing
    }

-- | If set, specifies the policy to use for the child workflow executions of
-- the workflow execution being terminated. This policy overrides the child
-- policy specified for the workflow execution at registration time or when
-- starting the execution. The supported child policies are: TERMINATE: the
-- child executions will be terminated. REQUEST_CANCEL: a request to cancel
-- will be attempted for each child execution by recording a
-- WorkflowExecutionCancelRequested event in its history. It is up to the
-- decider to take appropriate actions when it receives an execution history
-- with this event. ABANDON: no action will be taken. The child executions
-- will continue to run.
tweChildPolicy :: Lens' TerminateWorkflowExecution (Maybe Text)
tweChildPolicy = lens _tweChildPolicy (\s a -> s { _tweChildPolicy = a })

-- | Optional details for terminating the workflow execution.
tweDetails :: Lens' TerminateWorkflowExecution (Maybe Text)
tweDetails = lens _tweDetails (\s a -> s { _tweDetails = a })

-- | The domain of the workflow execution to terminate.
tweDomain :: Lens' TerminateWorkflowExecution Text
tweDomain = lens _tweDomain (\s a -> s { _tweDomain = a })

-- | An optional descriptive reason for terminating the workflow execution.
tweReason :: Lens' TerminateWorkflowExecution (Maybe Text)
tweReason = lens _tweReason (\s a -> s { _tweReason = a })

-- | The runId of the workflow execution to terminate.
tweRunId :: Lens' TerminateWorkflowExecution (Maybe Text)
tweRunId = lens _tweRunId (\s a -> s { _tweRunId = a })

-- | The workflowId of the workflow execution to terminate.
tweWorkflowId :: Lens' TerminateWorkflowExecution Text
tweWorkflowId = lens _tweWorkflowId (\s a -> s { _tweWorkflowId = a })

data TerminateWorkflowExecutionResponse = TerminateWorkflowExecutionResponse
    deriving (Eq, Ord, Show, Generic)

-- | 'TerminateWorkflowExecutionResponse' constructor.
terminateWorkflowExecutionResponse :: TerminateWorkflowExecutionResponse
terminateWorkflowExecutionResponse = TerminateWorkflowExecutionResponse

instance ToPath TerminateWorkflowExecution where
    toPath = const "/"

instance ToQuery TerminateWorkflowExecution where
    toQuery = const mempty

instance ToHeaders TerminateWorkflowExecution

instance ToJSON TerminateWorkflowExecution where
    toJSON TerminateWorkflowExecution{..} = object
        [ "domain"      .= _tweDomain
        , "workflowId"  .= _tweWorkflowId
        , "runId"       .= _tweRunId
        , "reason"      .= _tweReason
        , "details"     .= _tweDetails
        , "childPolicy" .= _tweChildPolicy
        ]

instance AWSRequest TerminateWorkflowExecution where
    type Sv TerminateWorkflowExecution = SWF
    type Rs TerminateWorkflowExecution = TerminateWorkflowExecutionResponse

    request  = post "TerminateWorkflowExecution"
    response = nullResponse TerminateWorkflowExecutionResponse