{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TupleSections #-}

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-spotprovisioningspecification.html

module Stratosphere.ResourceProperties.EMRInstanceFleetConfigSpotProvisioningSpecification where

import Stratosphere.ResourceImports


-- | Full data type definition for
-- EMRInstanceFleetConfigSpotProvisioningSpecification. See
-- 'emrInstanceFleetConfigSpotProvisioningSpecification' for a more
-- convenient constructor.
data EMRInstanceFleetConfigSpotProvisioningSpecification =
  EMRInstanceFleetConfigSpotProvisioningSpecification
  { _eMRInstanceFleetConfigSpotProvisioningSpecificationBlockDurationMinutes :: Maybe (Val Integer)
  , _eMRInstanceFleetConfigSpotProvisioningSpecificationTimeoutAction :: Val Text
  , _eMRInstanceFleetConfigSpotProvisioningSpecificationTimeoutDurationMinutes :: Val Integer
  } deriving (Show, Eq)

instance ToJSON EMRInstanceFleetConfigSpotProvisioningSpecification where
  toJSON EMRInstanceFleetConfigSpotProvisioningSpecification{..} =
    object $
    catMaybes
    [ fmap (("BlockDurationMinutes",) . toJSON . fmap Integer') _eMRInstanceFleetConfigSpotProvisioningSpecificationBlockDurationMinutes
    , (Just . ("TimeoutAction",) . toJSON) _eMRInstanceFleetConfigSpotProvisioningSpecificationTimeoutAction
    , (Just . ("TimeoutDurationMinutes",) . toJSON . fmap Integer') _eMRInstanceFleetConfigSpotProvisioningSpecificationTimeoutDurationMinutes
    ]

instance FromJSON EMRInstanceFleetConfigSpotProvisioningSpecification where
  parseJSON (Object obj) =
    EMRInstanceFleetConfigSpotProvisioningSpecification <$>
      fmap (fmap (fmap unInteger')) (obj .:? "BlockDurationMinutes") <*>
      (obj .: "TimeoutAction") <*>
      fmap (fmap unInteger') (obj .: "TimeoutDurationMinutes")
  parseJSON _ = mempty

-- | Constructor for 'EMRInstanceFleetConfigSpotProvisioningSpecification'
-- containing required fields as arguments.
emrInstanceFleetConfigSpotProvisioningSpecification
  :: Val Text -- ^ 'emrifcspsTimeoutAction'
  -> Val Integer -- ^ 'emrifcspsTimeoutDurationMinutes'
  -> EMRInstanceFleetConfigSpotProvisioningSpecification
emrInstanceFleetConfigSpotProvisioningSpecification timeoutActionarg timeoutDurationMinutesarg =
  EMRInstanceFleetConfigSpotProvisioningSpecification
  { _eMRInstanceFleetConfigSpotProvisioningSpecificationBlockDurationMinutes = Nothing
  , _eMRInstanceFleetConfigSpotProvisioningSpecificationTimeoutAction = timeoutActionarg
  , _eMRInstanceFleetConfigSpotProvisioningSpecificationTimeoutDurationMinutes = timeoutDurationMinutesarg
  }

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-spotprovisioningspecification.html#cfn-elasticmapreduce-instancefleetconfig-spotprovisioningspecification-blockdurationminutes
emrifcspsBlockDurationMinutes :: Lens' EMRInstanceFleetConfigSpotProvisioningSpecification (Maybe (Val Integer))
emrifcspsBlockDurationMinutes = lens _eMRInstanceFleetConfigSpotProvisioningSpecificationBlockDurationMinutes (\s a -> s { _eMRInstanceFleetConfigSpotProvisioningSpecificationBlockDurationMinutes = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-spotprovisioningspecification.html#cfn-elasticmapreduce-instancefleetconfig-spotprovisioningspecification-timeoutaction
emrifcspsTimeoutAction :: Lens' EMRInstanceFleetConfigSpotProvisioningSpecification (Val Text)
emrifcspsTimeoutAction = lens _eMRInstanceFleetConfigSpotProvisioningSpecificationTimeoutAction (\s a -> s { _eMRInstanceFleetConfigSpotProvisioningSpecificationTimeoutAction = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-spotprovisioningspecification.html#cfn-elasticmapreduce-instancefleetconfig-spotprovisioningspecification-timeoutdurationminutes
emrifcspsTimeoutDurationMinutes :: Lens' EMRInstanceFleetConfigSpotProvisioningSpecification (Val Integer)
emrifcspsTimeoutDurationMinutes = lens _eMRInstanceFleetConfigSpotProvisioningSpecificationTimeoutDurationMinutes (\s a -> s { _eMRInstanceFleetConfigSpotProvisioningSpecificationTimeoutDurationMinutes = a })