{-# 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.IoT.DeleteThing
-- 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)
--
-- Deletes the specified thing.
module Network.AWS.IoT.DeleteThing
    (
    -- * Creating a Request
      deleteThing
    , DeleteThing
    -- * Request Lenses
    , dtExpectedVersion
    , dtThingName

    -- * Destructuring the Response
    , deleteThingResponse
    , DeleteThingResponse
    -- * Response Lenses
    , delrsResponseStatus
    ) where

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

-- | The input for the DeleteThing operation.
--
-- /See:/ 'deleteThing' smart constructor.
data DeleteThing = DeleteThing'
    { _dtExpectedVersion :: !(Maybe Integer)
    , _dtThingName       :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'DeleteThing' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'dtExpectedVersion'
--
-- * 'dtThingName'
deleteThing
    :: Text -- ^ 'dtThingName'
    -> DeleteThing
deleteThing pThingName_ =
    DeleteThing'
    { _dtExpectedVersion = Nothing
    , _dtThingName = pThingName_
    }

-- | The expected version of the thing record in the registry. If the version of the record in the registry does not match the expected version specified in the request, the 'DeleteThing' request is rejected with a 'VersionConflictException'.
dtExpectedVersion :: Lens' DeleteThing (Maybe Integer)
dtExpectedVersion = lens _dtExpectedVersion (\ s a -> s{_dtExpectedVersion = a});

-- | The name of the thing to delete.
dtThingName :: Lens' DeleteThing Text
dtThingName = lens _dtThingName (\ s a -> s{_dtThingName = a});

instance AWSRequest DeleteThing where
        type Rs DeleteThing = DeleteThingResponse
        request = delete ioT
        response
          = receiveEmpty
              (\ s h x ->
                 DeleteThingResponse' <$> (pure (fromEnum s)))

instance Hashable DeleteThing

instance NFData DeleteThing

instance ToHeaders DeleteThing where
        toHeaders = const mempty

instance ToPath DeleteThing where
        toPath DeleteThing'{..}
          = mconcat ["/things/", toBS _dtThingName]

instance ToQuery DeleteThing where
        toQuery DeleteThing'{..}
          = mconcat ["expectedVersion" =: _dtExpectedVersion]

-- | The output of the DeleteThing operation.
--
-- /See:/ 'deleteThingResponse' smart constructor.
newtype DeleteThingResponse = DeleteThingResponse'
    { _delrsResponseStatus :: Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'DeleteThingResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'delrsResponseStatus'
deleteThingResponse
    :: Int -- ^ 'delrsResponseStatus'
    -> DeleteThingResponse
deleteThingResponse pResponseStatus_ =
    DeleteThingResponse'
    { _delrsResponseStatus = pResponseStatus_
    }

-- | The response status code.
delrsResponseStatus :: Lens' DeleteThingResponse Int
delrsResponseStatus = lens _delrsResponseStatus (\ s a -> s{_delrsResponseStatus = a});

instance NFData DeleteThingResponse