{-# 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.EMR.AddJobFlowSteps
-- 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.

-- | AddJobFlowSteps adds new steps to a running job flow. A maximum of 256 steps
-- are allowed in each job flow.
--
-- If your job flow is long-running (such as a Hive data warehouse) or complex,
-- you may require more than 256 steps to process your data. You can bypass the
-- 256-step limitation in various ways, including using the SSH shell to connect
-- to the master node and submitting queries directly to the software running on
-- the master node, such as Hive and Hadoop. For more information on how to do
-- this, go to <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/AddMoreThan256Steps.html Add More than 256 Steps to a Job Flow> in the /Amazon ElasticMapReduce Developer's Guide/.
--
-- A step specifies the location of a JAR file stored either on the master
-- node of the job flow or in Amazon S3. Each step is performed by the main
-- function of the main class of the JAR file. The main class can be specified
-- either in the manifest of the JAR or by using the MainFunction parameter of
-- the step.
--
-- Elastic MapReduce executes each step in the order listed. For a step to be
-- considered complete, the main function must exit with a zero exit code and
-- all Hadoop jobs started while the step was running must have completed and
-- run successfully.
--
-- You can only add steps to a job flow that is in one of the following
-- states: STARTING, BOOTSTRAPPING, RUNNING, or WAITING.
--
-- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_AddJobFlowSteps.html>
module Network.AWS.EMR.AddJobFlowSteps
    (
    -- * Request
      AddJobFlowSteps
    -- ** Request constructor
    , addJobFlowSteps
    -- ** Request lenses
    , ajfsJobFlowId
    , ajfsSteps

    -- * Response
    , AddJobFlowStepsResponse
    -- ** Response constructor
    , addJobFlowStepsResponse
    -- ** Response lenses
    , ajfsrStepIds
    ) where

import Network.AWS.Data (Object)
import Network.AWS.Prelude
import Network.AWS.Request.JSON
import Network.AWS.EMR.Types
import qualified GHC.Exts

data AddJobFlowSteps = AddJobFlowSteps
    { _ajfsJobFlowId :: Text
    , _ajfsSteps     :: List "Steps" StepConfig
    } deriving (Eq, Read, Show)

-- | 'AddJobFlowSteps' constructor.
--
-- The fields accessible through corresponding lenses are:
--
-- * 'ajfsJobFlowId' @::@ 'Text'
--
-- * 'ajfsSteps' @::@ ['StepConfig']
--
addJobFlowSteps :: Text -- ^ 'ajfsJobFlowId'
                -> AddJobFlowSteps
addJobFlowSteps p1 = AddJobFlowSteps
    { _ajfsJobFlowId = p1
    , _ajfsSteps     = mempty
    }

-- | A string that uniquely identifies the job flow. This identifier is returned
-- by 'RunJobFlow' and can also be obtained from 'ListClusters'.
ajfsJobFlowId :: Lens' AddJobFlowSteps Text
ajfsJobFlowId = lens _ajfsJobFlowId (\s a -> s { _ajfsJobFlowId = a })

-- | A list of 'StepConfig' to be executed by the job flow.
ajfsSteps :: Lens' AddJobFlowSteps [StepConfig]
ajfsSteps = lens _ajfsSteps (\s a -> s { _ajfsSteps = a }) . _List

newtype AddJobFlowStepsResponse = AddJobFlowStepsResponse
    { _ajfsrStepIds :: List "StepIds" Text
    } deriving (Eq, Ord, Read, Show, Monoid, Semigroup)

instance GHC.Exts.IsList AddJobFlowStepsResponse where
    type Item AddJobFlowStepsResponse = Text

    fromList = AddJobFlowStepsResponse . GHC.Exts.fromList
    toList   = GHC.Exts.toList . _ajfsrStepIds

-- | 'AddJobFlowStepsResponse' constructor.
--
-- The fields accessible through corresponding lenses are:
--
-- * 'ajfsrStepIds' @::@ ['Text']
--
addJobFlowStepsResponse :: AddJobFlowStepsResponse
addJobFlowStepsResponse = AddJobFlowStepsResponse
    { _ajfsrStepIds = mempty
    }

-- | The identifiers of the list of steps added to the job flow.
ajfsrStepIds :: Lens' AddJobFlowStepsResponse [Text]
ajfsrStepIds = lens _ajfsrStepIds (\s a -> s { _ajfsrStepIds = a }) . _List

instance ToPath AddJobFlowSteps where
    toPath = const "/"

instance ToQuery AddJobFlowSteps where
    toQuery = const mempty

instance ToHeaders AddJobFlowSteps

instance ToJSON AddJobFlowSteps where
    toJSON AddJobFlowSteps{..} = object
        [ "JobFlowId" .= _ajfsJobFlowId
        , "Steps"     .= _ajfsSteps
        ]

instance AWSRequest AddJobFlowSteps where
    type Sv AddJobFlowSteps = EMR
    type Rs AddJobFlowSteps = AddJobFlowStepsResponse

    request  = post "AddJobFlowSteps"
    response = jsonResponse

instance FromJSON AddJobFlowStepsResponse where
    parseJSON = withObject "AddJobFlowStepsResponse" $ \o -> AddJobFlowStepsResponse
        <$> o .:? "StepIds" .!= mempty