{-# 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.CloudSearch.DefineSuggester
-- 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)
--
-- Configures a suggester for a domain. A suggester enables you to display
-- possible matches before users finish typing their queries. When you
-- configure a suggester, you must specify the name of the text field you
-- want to search for possible matches and a unique name for the suggester.
-- For more information, see
-- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/getting-suggestions.html Getting Search Suggestions>
-- in the /Amazon CloudSearch Developer Guide/.
module Network.AWS.CloudSearch.DefineSuggester
    (
    -- * Creating a Request
      defineSuggester
    , DefineSuggester
    -- * Request Lenses
    , defDomainName
    , defSuggester

    -- * Destructuring the Response
    , defineSuggesterResponse
    , DefineSuggesterResponse
    -- * Response Lenses
    , dsrsResponseStatus
    , dsrsSuggester
    ) where

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

-- | Container for the parameters to the 'DefineSuggester' operation.
-- Specifies the name of the domain you want to update and the suggester
-- configuration.
--
-- /See:/ 'defineSuggester' smart constructor.
data DefineSuggester = DefineSuggester'
    { _defDomainName :: !Text
    , _defSuggester  :: !Suggester
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'DefineSuggester' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'defDomainName'
--
-- * 'defSuggester'
defineSuggester
    :: Text -- ^ 'defDomainName'
    -> Suggester -- ^ 'defSuggester'
    -> DefineSuggester
defineSuggester pDomainName_ pSuggester_ =
    DefineSuggester'
    { _defDomainName = pDomainName_
    , _defSuggester = pSuggester_
    }

-- | Undocumented member.
defDomainName :: Lens' DefineSuggester Text
defDomainName = lens _defDomainName (\ s a -> s{_defDomainName = a});

-- | Undocumented member.
defSuggester :: Lens' DefineSuggester Suggester
defSuggester = lens _defSuggester (\ s a -> s{_defSuggester = a});

instance AWSRequest DefineSuggester where
        type Rs DefineSuggester = DefineSuggesterResponse
        request = postQuery cloudSearch
        response
          = receiveXMLWrapper "DefineSuggesterResult"
              (\ s h x ->
                 DefineSuggesterResponse' <$>
                   (pure (fromEnum s)) <*> (x .@ "Suggester"))

instance Hashable DefineSuggester

instance NFData DefineSuggester

instance ToHeaders DefineSuggester where
        toHeaders = const mempty

instance ToPath DefineSuggester where
        toPath = const "/"

instance ToQuery DefineSuggester where
        toQuery DefineSuggester'{..}
          = mconcat
              ["Action" =: ("DefineSuggester" :: ByteString),
               "Version" =: ("2013-01-01" :: ByteString),
               "DomainName" =: _defDomainName,
               "Suggester" =: _defSuggester]

-- | The result of a 'DefineSuggester' request. Contains the status of the
-- newly-configured suggester.
--
-- /See:/ 'defineSuggesterResponse' smart constructor.
data DefineSuggesterResponse = DefineSuggesterResponse'
    { _dsrsResponseStatus :: !Int
    , _dsrsSuggester      :: !SuggesterStatus
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'DefineSuggesterResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'dsrsResponseStatus'
--
-- * 'dsrsSuggester'
defineSuggesterResponse
    :: Int -- ^ 'dsrsResponseStatus'
    -> SuggesterStatus -- ^ 'dsrsSuggester'
    -> DefineSuggesterResponse
defineSuggesterResponse pResponseStatus_ pSuggester_ =
    DefineSuggesterResponse'
    { _dsrsResponseStatus = pResponseStatus_
    , _dsrsSuggester = pSuggester_
    }

-- | The response status code.
dsrsResponseStatus :: Lens' DefineSuggesterResponse Int
dsrsResponseStatus = lens _dsrsResponseStatus (\ s a -> s{_dsrsResponseStatus = a});

-- | Undocumented member.
dsrsSuggester :: Lens' DefineSuggesterResponse SuggesterStatus
dsrsSuggester = lens _dsrsSuggester (\ s a -> s{_dsrsSuggester = a});

instance NFData DefineSuggesterResponse