{-# 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.Redshift.RestoreTableFromClusterSnapshot
-- 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)
--
-- Creates a new table from a table in an Amazon Redshift cluster snapshot.
-- You must create the new table within the Amazon Redshift cluster that
-- the snapshot was taken from.
--
-- You cannot use 'RestoreTableFromClusterSnapshot' to restore a table with
-- the same name as an existing table in an Amazon Redshift cluster. That
-- is, you cannot overwrite an existing table in a cluster with a restored
-- table. If you want to replace your original table with a new, restored
-- table, then rename or drop your original table before you call
-- 'RestoreTableFromClusterSnapshot'. When you have renamed your original
-- table, then you can pass the original name of the table as the
-- 'NewTableName' parameter value in the call to
-- 'RestoreTableFromClusterSnapshot'. This way, you can replace the
-- original table with the table created from the snapshot.
module Network.AWS.Redshift.RestoreTableFromClusterSnapshot
    (
    -- * Creating a Request
      restoreTableFromClusterSnapshot
    , RestoreTableFromClusterSnapshot
    -- * Request Lenses
    , rtfcsTargetSchemaName
    , rtfcsTargetDatabaseName
    , rtfcsSourceSchemaName
    , rtfcsClusterIdentifier
    , rtfcsSnapshotIdentifier
    , rtfcsSourceDatabaseName
    , rtfcsSourceTableName
    , rtfcsNewTableName

    -- * Destructuring the Response
    , restoreTableFromClusterSnapshotResponse
    , RestoreTableFromClusterSnapshotResponse
    -- * Response Lenses
    , rtfcsrsTableRestoreStatus
    , rtfcsrsResponseStatus
    ) where

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

-- | /See:/ 'restoreTableFromClusterSnapshot' smart constructor.
data RestoreTableFromClusterSnapshot = RestoreTableFromClusterSnapshot'
    { _rtfcsTargetSchemaName   :: !(Maybe Text)
    , _rtfcsTargetDatabaseName :: !(Maybe Text)
    , _rtfcsSourceSchemaName   :: !(Maybe Text)
    , _rtfcsClusterIdentifier  :: !Text
    , _rtfcsSnapshotIdentifier :: !Text
    , _rtfcsSourceDatabaseName :: !Text
    , _rtfcsSourceTableName    :: !Text
    , _rtfcsNewTableName       :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'RestoreTableFromClusterSnapshot' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rtfcsTargetSchemaName'
--
-- * 'rtfcsTargetDatabaseName'
--
-- * 'rtfcsSourceSchemaName'
--
-- * 'rtfcsClusterIdentifier'
--
-- * 'rtfcsSnapshotIdentifier'
--
-- * 'rtfcsSourceDatabaseName'
--
-- * 'rtfcsSourceTableName'
--
-- * 'rtfcsNewTableName'
restoreTableFromClusterSnapshot
    :: Text -- ^ 'rtfcsClusterIdentifier'
    -> Text -- ^ 'rtfcsSnapshotIdentifier'
    -> Text -- ^ 'rtfcsSourceDatabaseName'
    -> Text -- ^ 'rtfcsSourceTableName'
    -> Text -- ^ 'rtfcsNewTableName'
    -> RestoreTableFromClusterSnapshot
restoreTableFromClusterSnapshot pClusterIdentifier_ pSnapshotIdentifier_ pSourceDatabaseName_ pSourceTableName_ pNewTableName_ =
    RestoreTableFromClusterSnapshot'
    { _rtfcsTargetSchemaName = Nothing
    , _rtfcsTargetDatabaseName = Nothing
    , _rtfcsSourceSchemaName = Nothing
    , _rtfcsClusterIdentifier = pClusterIdentifier_
    , _rtfcsSnapshotIdentifier = pSnapshotIdentifier_
    , _rtfcsSourceDatabaseName = pSourceDatabaseName_
    , _rtfcsSourceTableName = pSourceTableName_
    , _rtfcsNewTableName = pNewTableName_
    }

-- | The name of the schema to restore the table to.
rtfcsTargetSchemaName :: Lens' RestoreTableFromClusterSnapshot (Maybe Text)
rtfcsTargetSchemaName = lens _rtfcsTargetSchemaName (\ s a -> s{_rtfcsTargetSchemaName = a});

-- | The name of the database to restore the table to.
rtfcsTargetDatabaseName :: Lens' RestoreTableFromClusterSnapshot (Maybe Text)
rtfcsTargetDatabaseName = lens _rtfcsTargetDatabaseName (\ s a -> s{_rtfcsTargetDatabaseName = a});

-- | The name of the source schema that contains the table to restore from.
-- If you do not specify a 'SourceSchemaName' value, the default is
-- 'public'.
rtfcsSourceSchemaName :: Lens' RestoreTableFromClusterSnapshot (Maybe Text)
rtfcsSourceSchemaName = lens _rtfcsSourceSchemaName (\ s a -> s{_rtfcsSourceSchemaName = a});

-- | The identifier of the Amazon Redshift cluster to restore the table to.
rtfcsClusterIdentifier :: Lens' RestoreTableFromClusterSnapshot Text
rtfcsClusterIdentifier = lens _rtfcsClusterIdentifier (\ s a -> s{_rtfcsClusterIdentifier = a});

-- | The identifier of the snapshot to restore the table from. This snapshot
-- must have been created from the Amazon Redshift cluster specified by the
-- 'ClusterIdentifier' parameter.
rtfcsSnapshotIdentifier :: Lens' RestoreTableFromClusterSnapshot Text
rtfcsSnapshotIdentifier = lens _rtfcsSnapshotIdentifier (\ s a -> s{_rtfcsSnapshotIdentifier = a});

-- | The name of the source database that contains the table to restore from.
rtfcsSourceDatabaseName :: Lens' RestoreTableFromClusterSnapshot Text
rtfcsSourceDatabaseName = lens _rtfcsSourceDatabaseName (\ s a -> s{_rtfcsSourceDatabaseName = a});

-- | The name of the source table to restore from.
rtfcsSourceTableName :: Lens' RestoreTableFromClusterSnapshot Text
rtfcsSourceTableName = lens _rtfcsSourceTableName (\ s a -> s{_rtfcsSourceTableName = a});

-- | The name of the table to create as a result of the current request.
rtfcsNewTableName :: Lens' RestoreTableFromClusterSnapshot Text
rtfcsNewTableName = lens _rtfcsNewTableName (\ s a -> s{_rtfcsNewTableName = a});

instance AWSRequest RestoreTableFromClusterSnapshot
         where
        type Rs RestoreTableFromClusterSnapshot =
             RestoreTableFromClusterSnapshotResponse
        request = postQuery redshift
        response
          = receiveXMLWrapper
              "RestoreTableFromClusterSnapshotResult"
              (\ s h x ->
                 RestoreTableFromClusterSnapshotResponse' <$>
                   (x .@? "TableRestoreStatus") <*> (pure (fromEnum s)))

instance Hashable RestoreTableFromClusterSnapshot

instance NFData RestoreTableFromClusterSnapshot

instance ToHeaders RestoreTableFromClusterSnapshot
         where
        toHeaders = const mempty

instance ToPath RestoreTableFromClusterSnapshot where
        toPath = const "/"

instance ToQuery RestoreTableFromClusterSnapshot
         where
        toQuery RestoreTableFromClusterSnapshot'{..}
          = mconcat
              ["Action" =:
                 ("RestoreTableFromClusterSnapshot" :: ByteString),
               "Version" =: ("2012-12-01" :: ByteString),
               "TargetSchemaName" =: _rtfcsTargetSchemaName,
               "TargetDatabaseName" =: _rtfcsTargetDatabaseName,
               "SourceSchemaName" =: _rtfcsSourceSchemaName,
               "ClusterIdentifier" =: _rtfcsClusterIdentifier,
               "SnapshotIdentifier" =: _rtfcsSnapshotIdentifier,
               "SourceDatabaseName" =: _rtfcsSourceDatabaseName,
               "SourceTableName" =: _rtfcsSourceTableName,
               "NewTableName" =: _rtfcsNewTableName]

-- | /See:/ 'restoreTableFromClusterSnapshotResponse' smart constructor.
data RestoreTableFromClusterSnapshotResponse = RestoreTableFromClusterSnapshotResponse'
    { _rtfcsrsTableRestoreStatus :: !(Maybe TableRestoreStatus)
    , _rtfcsrsResponseStatus     :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'RestoreTableFromClusterSnapshotResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rtfcsrsTableRestoreStatus'
--
-- * 'rtfcsrsResponseStatus'
restoreTableFromClusterSnapshotResponse
    :: Int -- ^ 'rtfcsrsResponseStatus'
    -> RestoreTableFromClusterSnapshotResponse
restoreTableFromClusterSnapshotResponse pResponseStatus_ =
    RestoreTableFromClusterSnapshotResponse'
    { _rtfcsrsTableRestoreStatus = Nothing
    , _rtfcsrsResponseStatus = pResponseStatus_
    }

-- | Undocumented member.
rtfcsrsTableRestoreStatus :: Lens' RestoreTableFromClusterSnapshotResponse (Maybe TableRestoreStatus)
rtfcsrsTableRestoreStatus = lens _rtfcsrsTableRestoreStatus (\ s a -> s{_rtfcsrsTableRestoreStatus = a});

-- | The response status code.
rtfcsrsResponseStatus :: Lens' RestoreTableFromClusterSnapshotResponse Int
rtfcsrsResponseStatus = lens _rtfcsrsResponseStatus (\ s a -> s{_rtfcsrsResponseStatus = a});

instance NFData
         RestoreTableFromClusterSnapshotResponse