{-# LANGUAGE DataKinds                   #-}
{-# LANGUAGE DeriveGeneric               #-}
{-# LANGUAGE FlexibleInstances           #-}
{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
{-# LANGUAGE LambdaCase                  #-}
{-# LANGUAGE NoImplicitPrelude           #-}
{-# LANGUAGE OverloadedStrings           #-}
{-# LANGUAGE RecordWildCards             #-}
{-# LANGUAGE TypeFamilies                #-}

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

-- Module      : Network.AWS.MachineLearning.GetMLModel
-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
-- License     : This Source Code Form is subject to the terms of
--               the Mozilla Public License, v. 2.0.
--               A copy of the MPL can be found in the LICENSE file or
--               you can obtain it at http://mozilla.org/MPL/2.0/.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--
-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- | Returns an 'MLModel' that includes detailed metadata, and data source
-- information as well as the current status of the 'MLModel'.
--
-- 'GetMLModel' provides results in normal or verbose format.
--
-- <http://http://docs.aws.amazon.com/machine-learning/latest/APIReference/API_GetMLModel.html>
module Network.AWS.MachineLearning.GetMLModel
    (
    -- * Request
      GetMLModel
    -- ** Request constructor
    , getMLModel
    -- ** Request lenses
    , gmlmMLModelId
    , gmlmVerbose

    -- * Response
    , GetMLModelResponse
    -- ** Response constructor
    , getMLModelResponse
    -- ** Response lenses
    , gmlmrCreatedAt
    , gmlmrCreatedByIamUser
    , gmlmrEndpointInfo
    , gmlmrInputDataLocationS3
    , gmlmrLastUpdatedAt
    , gmlmrLogUri
    , gmlmrMLModelId
    , gmlmrMLModelType
    , gmlmrMessage
    , gmlmrName
    , gmlmrRecipe
    , gmlmrSchema
    , gmlmrScoreThreshold
    , gmlmrScoreThresholdLastUpdatedAt
    , gmlmrSizeInBytes
    , gmlmrStatus
    , gmlmrTrainingDataSourceId
    , gmlmrTrainingParameters
    ) where

import Network.AWS.Data (Object)
import Network.AWS.Prelude
import Network.AWS.Request.JSON
import Network.AWS.MachineLearning.Types
import qualified GHC.Exts

data GetMLModel = GetMLModel
    { _gmlmMLModelId :: Text
    , _gmlmVerbose   :: Maybe Bool
    } deriving (Eq, Ord, Read, Show)

-- | 'GetMLModel' constructor.
--
-- The fields accessible through corresponding lenses are:
--
-- * 'gmlmMLModelId' @::@ 'Text'
--
-- * 'gmlmVerbose' @::@ 'Maybe' 'Bool'
--
getMLModel :: Text -- ^ 'gmlmMLModelId'
           -> GetMLModel
getMLModel p1 = GetMLModel
    { _gmlmMLModelId = p1
    , _gmlmVerbose   = Nothing
    }

-- | The ID assigned to the 'MLModel' at creation.
gmlmMLModelId :: Lens' GetMLModel Text
gmlmMLModelId = lens _gmlmMLModelId (\s a -> s { _gmlmMLModelId = a })

-- | Specifies whether the 'GetMLModel' operation should return 'Recipe'.
--
-- If true, 'Recipe' is returned.
--
-- If false, 'Recipe' is not returned.
gmlmVerbose :: Lens' GetMLModel (Maybe Bool)
gmlmVerbose = lens _gmlmVerbose (\s a -> s { _gmlmVerbose = a })

data GetMLModelResponse = GetMLModelResponse
    { _gmlmrCreatedAt                   :: Maybe POSIX
    , _gmlmrCreatedByIamUser            :: Maybe Text
    , _gmlmrEndpointInfo                :: Maybe RealtimeEndpointInfo
    , _gmlmrInputDataLocationS3         :: Maybe Text
    , _gmlmrLastUpdatedAt               :: Maybe POSIX
    , _gmlmrLogUri                      :: Maybe Text
    , _gmlmrMLModelId                   :: Maybe Text
    , _gmlmrMLModelType                 :: Maybe MLModelType
    , _gmlmrMessage                     :: Maybe Text
    , _gmlmrName                        :: Maybe Text
    , _gmlmrRecipe                      :: Maybe Text
    , _gmlmrSchema                      :: Maybe Text
    , _gmlmrScoreThreshold              :: Maybe Double
    , _gmlmrScoreThresholdLastUpdatedAt :: Maybe POSIX
    , _gmlmrSizeInBytes                 :: Maybe Integer
    , _gmlmrStatus                      :: Maybe EntityStatus
    , _gmlmrTrainingDataSourceId        :: Maybe Text
    , _gmlmrTrainingParameters          :: Map Text Text
    } deriving (Eq, Read, Show)

-- | 'GetMLModelResponse' constructor.
--
-- The fields accessible through corresponding lenses are:
--
-- * 'gmlmrCreatedAt' @::@ 'Maybe' 'UTCTime'
--
-- * 'gmlmrCreatedByIamUser' @::@ 'Maybe' 'Text'
--
-- * 'gmlmrEndpointInfo' @::@ 'Maybe' 'RealtimeEndpointInfo'
--
-- * 'gmlmrInputDataLocationS3' @::@ 'Maybe' 'Text'
--
-- * 'gmlmrLastUpdatedAt' @::@ 'Maybe' 'UTCTime'
--
-- * 'gmlmrLogUri' @::@ 'Maybe' 'Text'
--
-- * 'gmlmrMLModelId' @::@ 'Maybe' 'Text'
--
-- * 'gmlmrMLModelType' @::@ 'Maybe' 'MLModelType'
--
-- * 'gmlmrMessage' @::@ 'Maybe' 'Text'
--
-- * 'gmlmrName' @::@ 'Maybe' 'Text'
--
-- * 'gmlmrRecipe' @::@ 'Maybe' 'Text'
--
-- * 'gmlmrSchema' @::@ 'Maybe' 'Text'
--
-- * 'gmlmrScoreThreshold' @::@ 'Maybe' 'Double'
--
-- * 'gmlmrScoreThresholdLastUpdatedAt' @::@ 'Maybe' 'UTCTime'
--
-- * 'gmlmrSizeInBytes' @::@ 'Maybe' 'Integer'
--
-- * 'gmlmrStatus' @::@ 'Maybe' 'EntityStatus'
--
-- * 'gmlmrTrainingDataSourceId' @::@ 'Maybe' 'Text'
--
-- * 'gmlmrTrainingParameters' @::@ 'HashMap' 'Text' 'Text'
--
getMLModelResponse :: GetMLModelResponse
getMLModelResponse = GetMLModelResponse
    { _gmlmrMLModelId                   = Nothing
    , _gmlmrTrainingDataSourceId        = Nothing
    , _gmlmrCreatedByIamUser            = Nothing
    , _gmlmrCreatedAt                   = Nothing
    , _gmlmrLastUpdatedAt               = Nothing
    , _gmlmrName                        = Nothing
    , _gmlmrStatus                      = Nothing
    , _gmlmrSizeInBytes                 = Nothing
    , _gmlmrEndpointInfo                = Nothing
    , _gmlmrTrainingParameters          = mempty
    , _gmlmrInputDataLocationS3         = Nothing
    , _gmlmrMLModelType                 = Nothing
    , _gmlmrScoreThreshold              = Nothing
    , _gmlmrScoreThresholdLastUpdatedAt = Nothing
    , _gmlmrLogUri                      = Nothing
    , _gmlmrMessage                     = Nothing
    , _gmlmrRecipe                      = Nothing
    , _gmlmrSchema                      = Nothing
    }

-- | The time that the 'MLModel' was created. The time is expressed in epoch time.
gmlmrCreatedAt :: Lens' GetMLModelResponse (Maybe UTCTime)
gmlmrCreatedAt = lens _gmlmrCreatedAt (\s a -> s { _gmlmrCreatedAt = a }) . mapping _Time

-- | The AWS user account from which the 'MLModel' was created. The account type can
-- be either an AWS root account or an AWS Identity and Access Management (IAM)
-- user account.
gmlmrCreatedByIamUser :: Lens' GetMLModelResponse (Maybe Text)
gmlmrCreatedByIamUser =
    lens _gmlmrCreatedByIamUser (\s a -> s { _gmlmrCreatedByIamUser = a })

-- | The current endpoint of the 'MLModel'
gmlmrEndpointInfo :: Lens' GetMLModelResponse (Maybe RealtimeEndpointInfo)
gmlmrEndpointInfo =
    lens _gmlmrEndpointInfo (\s a -> s { _gmlmrEndpointInfo = a })

-- | The location of the data file or directory in Amazon Simple Storage Service
-- (Amazon S3).
gmlmrInputDataLocationS3 :: Lens' GetMLModelResponse (Maybe Text)
gmlmrInputDataLocationS3 =
    lens _gmlmrInputDataLocationS3
        (\s a -> s { _gmlmrInputDataLocationS3 = a })

-- | The time of the most recent edit to the 'MLModel'. The time is expressed in
-- epoch time.
gmlmrLastUpdatedAt :: Lens' GetMLModelResponse (Maybe UTCTime)
gmlmrLastUpdatedAt =
    lens _gmlmrLastUpdatedAt (\s a -> s { _gmlmrLastUpdatedAt = a })
        . mapping _Time

-- | A link to the file that contains logs of the 'CreateMLModel' operation.
gmlmrLogUri :: Lens' GetMLModelResponse (Maybe Text)
gmlmrLogUri = lens _gmlmrLogUri (\s a -> s { _gmlmrLogUri = a })

-- | The MLModel ID which is same as the 'MLModelId' in the request.
gmlmrMLModelId :: Lens' GetMLModelResponse (Maybe Text)
gmlmrMLModelId = lens _gmlmrMLModelId (\s a -> s { _gmlmrMLModelId = a })

-- | Identifies the 'MLModel' category. The following are the available types:
--
-- REGRESSION -- Produces a numeric result. For example, "What listing price
-- should a house have?" BINARY -- Produces one of two possible results. For
-- example, "Is this an e-commerce website?" MULTICLASS -- Produces more than
-- two possible results. For example, "Is this a HIGH, LOW or MEDIUM risk trade?"
--
gmlmrMLModelType :: Lens' GetMLModelResponse (Maybe MLModelType)
gmlmrMLModelType = lens _gmlmrMLModelType (\s a -> s { _gmlmrMLModelType = a })

-- | Description of the most recent details about accessing the 'MLModel'.
gmlmrMessage :: Lens' GetMLModelResponse (Maybe Text)
gmlmrMessage = lens _gmlmrMessage (\s a -> s { _gmlmrMessage = a })

-- | A user-supplied name or description of the 'MLModel'.
gmlmrName :: Lens' GetMLModelResponse (Maybe Text)
gmlmrName = lens _gmlmrName (\s a -> s { _gmlmrName = a })

-- | The recipe to use when training the 'MLModel'. The 'Recipe' provides detailed
-- information about the observation data to use during training, as well as
-- manipulations to perform on the observation data during training.
--
-- Note This parameter is provided as part of the verbose format.
--
gmlmrRecipe :: Lens' GetMLModelResponse (Maybe Text)
gmlmrRecipe = lens _gmlmrRecipe (\s a -> s { _gmlmrRecipe = a })

-- | The schema used by all of the data files referenced by the 'DataSource'.
--
-- Note This parameter is provided as part of the verbose format.
--
gmlmrSchema :: Lens' GetMLModelResponse (Maybe Text)
gmlmrSchema = lens _gmlmrSchema (\s a -> s { _gmlmrSchema = a })

-- | The scoring threshold is used in binary classification 'MLModel's, and marks
-- the boundary between a positive prediction and a negative prediction.
--
-- Output values greater than or equal to the threshold receive a positive
-- result from the MLModel, such as 'true'. Output values less than the threshold
-- receive a negative response from the MLModel, such as 'false'.
gmlmrScoreThreshold :: Lens' GetMLModelResponse (Maybe Double)
gmlmrScoreThreshold =
    lens _gmlmrScoreThreshold (\s a -> s { _gmlmrScoreThreshold = a })

-- | The time of the most recent edit to the 'ScoreThreshold'. The time is expressed
-- in epoch time.
gmlmrScoreThresholdLastUpdatedAt :: Lens' GetMLModelResponse (Maybe UTCTime)
gmlmrScoreThresholdLastUpdatedAt =
    lens _gmlmrScoreThresholdLastUpdatedAt
        (\s a -> s { _gmlmrScoreThresholdLastUpdatedAt = a })
            . mapping _Time

gmlmrSizeInBytes :: Lens' GetMLModelResponse (Maybe Integer)
gmlmrSizeInBytes = lens _gmlmrSizeInBytes (\s a -> s { _gmlmrSizeInBytes = a })

-- | The current status of the 'MLModel'. This element can have one of the following
-- values:
--
-- 'PENDING' - Amazon Machine Learning (Amazon ML) submitted a request to
-- describe a 'MLModel'.  'INPROGRESS' - The request is processing.  'FAILED' - The
-- request did not run to completion. It is not usable.  'COMPLETED' - The request
-- completed successfully.  'DELETED' - The 'MLModel' is marked as deleted. It is
-- not usable.
gmlmrStatus :: Lens' GetMLModelResponse (Maybe EntityStatus)
gmlmrStatus = lens _gmlmrStatus (\s a -> s { _gmlmrStatus = a })

-- | The ID of the training 'DataSource'.
gmlmrTrainingDataSourceId :: Lens' GetMLModelResponse (Maybe Text)
gmlmrTrainingDataSourceId =
    lens _gmlmrTrainingDataSourceId
        (\s a -> s { _gmlmrTrainingDataSourceId = a })

-- | A list of the training parameters in the 'MLModel'. The list is implemented as
-- a map of key/value pairs.
--
-- The following is the current set of training parameters:
--
-- 'sgd.l1RegularizationAmount' - Coefficient regularization L1 norm. It
-- controls overfitting the data by penalizing large coefficients. This tends to
-- drive coefficients to zero, resulting in a sparse feature set. If you use
-- this parameter, specify a small value, such as 1.0E-04 or 1.0E-08.
--
-- The value is a double that ranges from 0 to MAX_DOUBLE. The default is not
-- to use L1 normalization. The parameter cannot be used when 'L2' is specified.
-- Use this parameter sparingly.
--
-- 'sgd.l2RegularizationAmount' - Coefficient regularization L2 norm. It
-- controls overfitting the data by penalizing large coefficients. This tends to
-- drive coefficients to small, nonzero values. If you use this parameter,
-- specify a small value, such as 1.0E-04 or 1.0E-08.
--
-- The value is a double that ranges from 0 to MAX_DOUBLE. The default is not
-- to use L2 normalization. This parameter cannot be used when 'L1' is specified.
-- Use this parameter sparingly.
--
-- 'sgd.maxPasses' - The number of times that the training process traverses the
-- observations to build the 'MLModel'. The value is an integer that ranges from 1
-- to 10000. The default value is 10.
--
-- 'sgd.maxMLModelSizeInBytes' - The maximum allowed size of the model.
-- Depending on the input data, the model size might affect performance.
--
-- The value is an integer that ranges from 100000 to 2147483648. The default
-- value is 33554432.
--
--
gmlmrTrainingParameters :: Lens' GetMLModelResponse (HashMap Text Text)
gmlmrTrainingParameters =
    lens _gmlmrTrainingParameters (\s a -> s { _gmlmrTrainingParameters = a })
        . _Map

instance ToPath GetMLModel where
    toPath = const "/"

instance ToQuery GetMLModel where
    toQuery = const mempty

instance ToHeaders GetMLModel

instance ToJSON GetMLModel where
    toJSON GetMLModel{..} = object
        [ "MLModelId" .= _gmlmMLModelId
        , "Verbose"   .= _gmlmVerbose
        ]

instance AWSRequest GetMLModel where
    type Sv GetMLModel = MachineLearning
    type Rs GetMLModel = GetMLModelResponse

    request  = post "GetMLModel"
    response = jsonResponse

instance FromJSON GetMLModelResponse where
    parseJSON = withObject "GetMLModelResponse" $ \o -> GetMLModelResponse
        <$> o .:? "CreatedAt"
        <*> o .:? "CreatedByIamUser"
        <*> o .:? "EndpointInfo"
        <*> o .:? "InputDataLocationS3"
        <*> o .:? "LastUpdatedAt"
        <*> o .:? "LogUri"
        <*> o .:? "MLModelId"
        <*> o .:? "MLModelType"
        <*> o .:? "Message"
        <*> o .:? "Name"
        <*> o .:? "Recipe"
        <*> o .:? "Schema"
        <*> o .:? "ScoreThreshold"
        <*> o .:? "ScoreThresholdLastUpdatedAt"
        <*> o .:? "SizeInBytes"
        <*> o .:? "Status"
        <*> o .:? "TrainingDataSourceId"
        <*> o .:? "TrainingParameters" .!= mempty