{-# 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.EC2.DescribeSpotInstanceRequests
-- 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)

-- | Describes the Spot Instance requests that belong to your account. Spot
-- Instances are instances that Amazon EC2 starts on your behalf when the
-- maximum price that you specify exceeds the current Spot Price. Amazon EC2
-- periodically sets the Spot Price based on available Spot Instance capacity
-- and current Spot Instance requests. For more information about Spot
-- Instances, see Spot Instances in the Amazon Elastic Compute Cloud User
-- Guide. You can use DescribeSpotInstanceRequests to find a running Spot
-- Instance by examining the response. If the status of the Spot Instance is
-- fulfilled, the instance ID appears in the response and contains the
-- identifier of the instance. Alternatively, you can use DescribeInstances
-- with a filter to look for instances where the instance lifecycle is spot.
--
-- <http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSpotInstanceRequests.html>
module Network.AWS.EC2.DescribeSpotInstanceRequests
    (
    -- * Request
      DescribeSpotInstanceRequests
    -- ** Request constructor
    , describeSpotInstanceRequests
    -- ** Request lenses
    , dsirDryRun
    , dsirFilters
    , dsirSpotInstanceRequestIds

    -- * Response
    , DescribeSpotInstanceRequestsResponse
    -- ** Response constructor
    , describeSpotInstanceRequestsResponse
    -- ** Response lenses
    , dsirrSpotInstanceRequests
    ) where

import Network.AWS.Prelude
import Network.AWS.Request.Query
import Network.AWS.EC2.Types
import qualified GHC.Exts

data DescribeSpotInstanceRequests = DescribeSpotInstanceRequests
    { _dsirDryRun                 :: Maybe Bool
    , _dsirFilters                :: List "Filter" Filter
    , _dsirSpotInstanceRequestIds :: List "SpotInstanceRequestId" Text
    } deriving (Eq, Show)

-- | 'DescribeSpotInstanceRequests' constructor.
--
-- The fields accessible through corresponding lenses are:
--
-- * 'dsirDryRun' @::@ 'Maybe' 'Bool'
--
-- * 'dsirFilters' @::@ ['Filter']
--
-- * 'dsirSpotInstanceRequestIds' @::@ ['Text']
--
describeSpotInstanceRequests :: DescribeSpotInstanceRequests
describeSpotInstanceRequests = DescribeSpotInstanceRequests
    { _dsirDryRun                 = Nothing
    , _dsirSpotInstanceRequestIds = mempty
    , _dsirFilters                = mempty
    }

dsirDryRun :: Lens' DescribeSpotInstanceRequests (Maybe Bool)
dsirDryRun = lens _dsirDryRun (\s a -> s { _dsirDryRun = a })

-- | One or more filters. availability-zone-group - The Availability Zone
-- group. create-time - The time stamp when the Spot Instance request was
-- created. fault-code - The fault code related to the request.
-- fault-message - The fault message related to the request. instance-id -
-- The ID of the instance that fulfilled the request. launch-group - The
-- Spot Instance launch group.
-- launch.block-device-mapping.delete-on-termination - Indicates whether the
-- Amazon EBS volume is deleted on instance termination.
-- launch.block-device-mapping.device-name - The device name for the Amazon
-- EBS volume (for example, /dev/sdh).
-- launch.block-device-mapping.snapshot-id - The ID of the snapshot used for
-- the Amazon EBS volume. launch.block-device-mapping.volume-size - The size
-- of the Amazon EBS volume, in GiB. launch.block-device-mapping.volume-type
-- - The type of the Amazon EBS volume (gp2 | standard | io1).
-- launch.group-id - The security group for the instance. launch.image-id -
-- The ID of the AMI. launch.instance-type - The type of instance (for
-- example, m1.small). launch.kernel-id - The kernel ID. launch.key-name -
-- The name of the key pair the instance launched with.
-- launch.monitoring-enabled - Whether monitoring is enabled for the Spot
-- Instance. launch.ramdisk-id - The RAM disk ID.
-- network-interface.network-interface-id - The ID of the network interface.
-- network-interface.device-index - The index of the device for the network
-- interface attachment on the instance. network-interface.subnet-id - The
-- ID of the subnet for the instance. network-interface.description - A
-- description of the network interface.
-- network-interface.private-ip-address - The primary private IP address of
-- the network interface. network-interface.delete-on-termination -
-- Indicates whether the network interface is deleted when the instance is
-- terminated. network-interface.group-id - The ID of the security group
-- associated with the network interface. network-interface.group-name - The
-- name of the security group associated with the network interface.
-- network-interface.addresses.primary - Indicates whether the IP address is
-- the primary private IP address. product-description - The product
-- description associated with the instance (Linux/UNIX | Windows).
-- spot-instance-request-id - The Spot Instance request ID. spot-price - The
-- maximum hourly price for any Spot Instance launched to fulfill the
-- request. state - The state of the Spot Instance request (open | active |
-- closed | cancelled | failed). Spot bid status information can help you
-- track your Amazon EC2 Spot Instance requests. For information, see
-- Tracking Spot Requests with Bid Status Codes in the Amazon Elastic
-- Compute Cloud User Guide. status-code - The short code describing the
-- most recent evaluation of your Spot Instance request. status-message -
-- The message explaining the status of the Spot Instance request.
-- tag:key=value - The key/value combination of a tag assigned to the
-- resource. tag-key - The key of a tag assigned to the resource. This
-- filter is independent of the tag-value filter. For example, if you use
-- both the filter "tag-key=Purpose" and the filter "tag-value=X", you get
-- any resources assigned both the tag key Purpose (regardless of what the
-- tag's value is), and the tag value X (regardless of what the tag's key
-- is). If you want to list only resources where Purpose is X, see the
-- tag:key=value filter. tag-value - The value of a tag assigned to the
-- resource. This filter is independent of the tag-key filter. type - The
-- type of Spot Instance request (one-time | persistent).
-- launched-availability-zone - The Availability Zone in which the bid is
-- launched. valid-from - The start date of the request. valid-until - The
-- end date of the request.
dsirFilters :: Lens' DescribeSpotInstanceRequests [Filter]
dsirFilters = lens _dsirFilters (\s a -> s { _dsirFilters = a }) . _List

-- | One or more Spot Instance request IDs.
dsirSpotInstanceRequestIds :: Lens' DescribeSpotInstanceRequests [Text]
dsirSpotInstanceRequestIds =
    lens _dsirSpotInstanceRequestIds
        (\s a -> s { _dsirSpotInstanceRequestIds = a })
            . _List

newtype DescribeSpotInstanceRequestsResponse = DescribeSpotInstanceRequestsResponse
    { _dsirrSpotInstanceRequests :: List "item" SpotInstanceRequest
    } deriving (Eq, Show, Monoid, Semigroup)

instance GHC.Exts.IsList DescribeSpotInstanceRequestsResponse where
    type Item DescribeSpotInstanceRequestsResponse = SpotInstanceRequest

    fromList = DescribeSpotInstanceRequestsResponse . GHC.Exts.fromList
    toList   = GHC.Exts.toList . _dsirrSpotInstanceRequests

-- | 'DescribeSpotInstanceRequestsResponse' constructor.
--
-- The fields accessible through corresponding lenses are:
--
-- * 'dsirrSpotInstanceRequests' @::@ ['SpotInstanceRequest']
--
describeSpotInstanceRequestsResponse :: DescribeSpotInstanceRequestsResponse
describeSpotInstanceRequestsResponse = DescribeSpotInstanceRequestsResponse
    { _dsirrSpotInstanceRequests = mempty
    }

-- | One or more Spot Instance requests.
dsirrSpotInstanceRequests :: Lens' DescribeSpotInstanceRequestsResponse [SpotInstanceRequest]
dsirrSpotInstanceRequests =
    lens _dsirrSpotInstanceRequests
        (\s a -> s { _dsirrSpotInstanceRequests = a })
            . _List

instance ToPath DescribeSpotInstanceRequests where
    toPath = const "/"

instance ToQuery DescribeSpotInstanceRequests where
    toQuery DescribeSpotInstanceRequests{..} = mconcat
        [ "dryRun"                =? _dsirDryRun
        , "Filter"                =? _dsirFilters
        , "SpotInstanceRequestId" =? _dsirSpotInstanceRequestIds
        ]

instance ToHeaders DescribeSpotInstanceRequests

instance AWSRequest DescribeSpotInstanceRequests where
    type Sv DescribeSpotInstanceRequests = EC2
    type Rs DescribeSpotInstanceRequests = DescribeSpotInstanceRequestsResponse

    request  = post "DescribeSpotInstanceRequests"
    response = xmlResponse

instance FromXML DescribeSpotInstanceRequestsResponse where
    parseXML x = DescribeSpotInstanceRequestsResponse
        <$> x .@  "spotInstanceRequestSet"