{-# 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.MachineLearning.CreateEvaluation
-- 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 'Evaluation' of an 'MLModel'. An 'MLModel' is evaluated on a set of observations associated to a 'DataSource'. Like a 'DataSource' for an 'MLModel', the 'DataSource' for an 'Evaluation' contains values for the Target Variable. The 'Evaluation' compares the predicted result for each observation to the actual outcome and provides a summary so that you know how effective the 'MLModel' functions on the test data. Evaluation generates a relevant performance metric such as BinaryAUC, RegressionRMSE or MulticlassAvgFScore based on the corresponding 'MLModelType': 'BINARY', 'REGRESSION' or 'MULTICLASS'.
--
-- 'CreateEvaluation' is an asynchronous operation. In response to 'CreateEvaluation', Amazon Machine Learning (Amazon ML) immediately returns and sets the evaluation status to 'PENDING'. After the 'Evaluation' is created and ready for use, Amazon ML sets the status to 'COMPLETED'.
--
-- You can use the < GetEvaluation> operation to check progress of the evaluation during the creation operation.
module Network.AWS.MachineLearning.CreateEvaluation
    (
    -- * Creating a Request
      createEvaluation
    , CreateEvaluation
    -- * Request Lenses
    , ceEvaluationName
    , ceEvaluationId
    , ceMLModelId
    , ceEvaluationDataSourceId

    -- * Destructuring the Response
    , createEvaluationResponse
    , CreateEvaluationResponse
    -- * Response Lenses
    , cersEvaluationId
    , cersResponseStatus
    ) where

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

-- | /See:/ 'createEvaluation' smart constructor.
data CreateEvaluation = CreateEvaluation'
    { _ceEvaluationName         :: !(Maybe Text)
    , _ceEvaluationId           :: !Text
    , _ceMLModelId              :: !Text
    , _ceEvaluationDataSourceId :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'CreateEvaluation' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ceEvaluationName'
--
-- * 'ceEvaluationId'
--
-- * 'ceMLModelId'
--
-- * 'ceEvaluationDataSourceId'
createEvaluation
    :: Text -- ^ 'ceEvaluationId'
    -> Text -- ^ 'ceMLModelId'
    -> Text -- ^ 'ceEvaluationDataSourceId'
    -> CreateEvaluation
createEvaluation pEvaluationId_ pMLModelId_ pEvaluationDataSourceId_ =
    CreateEvaluation'
    { _ceEvaluationName = Nothing
    , _ceEvaluationId = pEvaluationId_
    , _ceMLModelId = pMLModelId_
    , _ceEvaluationDataSourceId = pEvaluationDataSourceId_
    }

-- | A user-supplied name or description of the 'Evaluation'.
ceEvaluationName :: Lens' CreateEvaluation (Maybe Text)
ceEvaluationName = lens _ceEvaluationName (\ s a -> s{_ceEvaluationName = a});

-- | A user-supplied ID that uniquely identifies the 'Evaluation'.
ceEvaluationId :: Lens' CreateEvaluation Text
ceEvaluationId = lens _ceEvaluationId (\ s a -> s{_ceEvaluationId = a});

-- | The ID of the 'MLModel' to evaluate.
--
-- The schema used in creating the 'MLModel' must match the schema of the 'DataSource' used in the 'Evaluation'.
ceMLModelId :: Lens' CreateEvaluation Text
ceMLModelId = lens _ceMLModelId (\ s a -> s{_ceMLModelId = a});

-- | The ID of the 'DataSource' for the evaluation. The schema of the 'DataSource' must match the schema used to create the 'MLModel'.
ceEvaluationDataSourceId :: Lens' CreateEvaluation Text
ceEvaluationDataSourceId = lens _ceEvaluationDataSourceId (\ s a -> s{_ceEvaluationDataSourceId = a});

instance AWSRequest CreateEvaluation where
        type Rs CreateEvaluation = CreateEvaluationResponse
        request = postJSON machineLearning
        response
          = receiveJSON
              (\ s h x ->
                 CreateEvaluationResponse' <$>
                   (x .?> "EvaluationId") <*> (pure (fromEnum s)))

instance Hashable CreateEvaluation

instance NFData CreateEvaluation

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

instance ToJSON CreateEvaluation where
        toJSON CreateEvaluation'{..}
          = object
              (catMaybes
                 [("EvaluationName" .=) <$> _ceEvaluationName,
                  Just ("EvaluationId" .= _ceEvaluationId),
                  Just ("MLModelId" .= _ceMLModelId),
                  Just
                    ("EvaluationDataSourceId" .=
                       _ceEvaluationDataSourceId)])

instance ToPath CreateEvaluation where
        toPath = const "/"

instance ToQuery CreateEvaluation where
        toQuery = const mempty

-- | Represents the output of a < CreateEvaluation> operation, and is an acknowledgement that Amazon ML received the request.
--
-- < CreateEvaluation> operation is asynchronous. You can poll for status updates by using the < GetEvaluation> operation and checking the 'Status' parameter.
--
-- /See:/ 'createEvaluationResponse' smart constructor.
data CreateEvaluationResponse = CreateEvaluationResponse'
    { _cersEvaluationId   :: !(Maybe Text)
    , _cersResponseStatus :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'CreateEvaluationResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cersEvaluationId'
--
-- * 'cersResponseStatus'
createEvaluationResponse
    :: Int -- ^ 'cersResponseStatus'
    -> CreateEvaluationResponse
createEvaluationResponse pResponseStatus_ =
    CreateEvaluationResponse'
    { _cersEvaluationId = Nothing
    , _cersResponseStatus = pResponseStatus_
    }

-- | The user-supplied ID that uniquely identifies the 'Evaluation'. This value should be identical to the value of the 'EvaluationId' in the request.
cersEvaluationId :: Lens' CreateEvaluationResponse (Maybe Text)
cersEvaluationId = lens _cersEvaluationId (\ s a -> s{_cersEvaluationId = a});

-- | The response status code.
cersResponseStatus :: Lens' CreateEvaluationResponse Int
cersResponseStatus = lens _cersResponseStatus (\ s a -> s{_cersResponseStatus = a});

instance NFData CreateEvaluationResponse