{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric      #-}
{-# LANGUAGE OverloadedStrings  #-}
{-# LANGUAGE RecordWildCards    #-}
{-# LANGUAGE TypeFamilies       #-}

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

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Network.AWS.DeviceFarm.GetOfferingStatus
-- Copyright   : (c) 2013-2016 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Gets the current status and future status of all offerings purchased by an AWS account. The response indicates how many offerings are currently available and the offerings that will be available in the next period. The API returns a 'NotEligible' error if the user is not permitted to invoke the operation. Please contact <mailto:aws-devicefarm-support'amazon.com aws-devicefarm-support\'amazon.com> if you believe that you should be able to invoke this operation.
module Network.AWS.DeviceFarm.GetOfferingStatus
    (
    -- * Creating a Request
      getOfferingStatus
    , GetOfferingStatus
    -- * Request Lenses
    , gosNextToken

    -- * Destructuring the Response
    , getOfferingStatusResponse
    , GetOfferingStatusResponse
    -- * Response Lenses
    , gosrsNextPeriod
    , gosrsCurrent
    , gosrsNextToken
    , gosrsResponseStatus
    ) where

import           Network.AWS.DeviceFarm.Types
import           Network.AWS.DeviceFarm.Types.Product
import           Network.AWS.Lens
import           Network.AWS.Prelude
import           Network.AWS.Request
import           Network.AWS.Response

-- | Represents the request to retrieve the offering status for the specified customer or account.
--
-- /See:/ 'getOfferingStatus' smart constructor.
newtype GetOfferingStatus = GetOfferingStatus'
    { _gosNextToken :: Maybe Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'GetOfferingStatus' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gosNextToken'
getOfferingStatus
    :: GetOfferingStatus
getOfferingStatus =
    GetOfferingStatus'
    { _gosNextToken = Nothing
    }

-- | An identifier that was returned from the previous call to this operation, which can be used to return the next set of items in the list.
gosNextToken :: Lens' GetOfferingStatus (Maybe Text)
gosNextToken = lens _gosNextToken (\ s a -> s{_gosNextToken = a});

instance AWSRequest GetOfferingStatus where
        type Rs GetOfferingStatus = GetOfferingStatusResponse
        request = postJSON deviceFarm
        response
          = receiveJSON
              (\ s h x ->
                 GetOfferingStatusResponse' <$>
                   (x .?> "nextPeriod" .!@ mempty) <*>
                     (x .?> "current" .!@ mempty)
                     <*> (x .?> "nextToken")
                     <*> (pure (fromEnum s)))

instance Hashable GetOfferingStatus

instance NFData GetOfferingStatus

instance ToHeaders GetOfferingStatus where
        toHeaders
          = const
              (mconcat
                 ["X-Amz-Target" =#
                    ("DeviceFarm_20150623.GetOfferingStatus" ::
                       ByteString),
                  "Content-Type" =#
                    ("application/x-amz-json-1.1" :: ByteString)])

instance ToJSON GetOfferingStatus where
        toJSON GetOfferingStatus'{..}
          = object
              (catMaybes [("nextToken" .=) <$> _gosNextToken])

instance ToPath GetOfferingStatus where
        toPath = const "/"

instance ToQuery GetOfferingStatus where
        toQuery = const mempty

-- | Returns the status result for a device offering.
--
-- /See:/ 'getOfferingStatusResponse' smart constructor.
data GetOfferingStatusResponse = GetOfferingStatusResponse'
    { _gosrsNextPeriod     :: !(Maybe (Map Text OfferingStatus))
    , _gosrsCurrent        :: !(Maybe (Map Text OfferingStatus))
    , _gosrsNextToken      :: !(Maybe Text)
    , _gosrsResponseStatus :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'GetOfferingStatusResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gosrsNextPeriod'
--
-- * 'gosrsCurrent'
--
-- * 'gosrsNextToken'
--
-- * 'gosrsResponseStatus'
getOfferingStatusResponse
    :: Int -- ^ 'gosrsResponseStatus'
    -> GetOfferingStatusResponse
getOfferingStatusResponse pResponseStatus_ =
    GetOfferingStatusResponse'
    { _gosrsNextPeriod = Nothing
    , _gosrsCurrent = Nothing
    , _gosrsNextToken = Nothing
    , _gosrsResponseStatus = pResponseStatus_
    }

-- | When specified, gets the offering status for the next period.
gosrsNextPeriod :: Lens' GetOfferingStatusResponse (HashMap Text OfferingStatus)
gosrsNextPeriod = lens _gosrsNextPeriod (\ s a -> s{_gosrsNextPeriod = a}) . _Default . _Map;

-- | When specified, gets the offering status for the current period.
gosrsCurrent :: Lens' GetOfferingStatusResponse (HashMap Text OfferingStatus)
gosrsCurrent = lens _gosrsCurrent (\ s a -> s{_gosrsCurrent = a}) . _Default . _Map;

-- | An identifier that was returned from the previous call to this operation, which can be used to return the next set of items in the list.
gosrsNextToken :: Lens' GetOfferingStatusResponse (Maybe Text)
gosrsNextToken = lens _gosrsNextToken (\ s a -> s{_gosrsNextToken = a});

-- | The response status code.
gosrsResponseStatus :: Lens' GetOfferingStatusResponse Int
gosrsResponseStatus = lens _gosrsResponseStatus (\ s a -> s{_gosrsResponseStatus = a});

instance NFData GetOfferingStatusResponse