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

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html

module Stratosphere.Resources.OpsWorksLayer where

import Stratosphere.ResourceImports
import Stratosphere.ResourceProperties.OpsWorksLayerRecipes
import Stratosphere.ResourceProperties.OpsWorksLayerLifecycleEventConfiguration
import Stratosphere.ResourceProperties.OpsWorksLayerLoadBasedAutoScaling
import Stratosphere.ResourceProperties.Tag
import Stratosphere.ResourceProperties.OpsWorksLayerVolumeConfiguration

-- | Full data type definition for OpsWorksLayer. See 'opsWorksLayer' for a
-- more convenient constructor.
data OpsWorksLayer =
  OpsWorksLayer
  { _opsWorksLayerAttributes :: Maybe Object
  , _opsWorksLayerAutoAssignElasticIps :: Val Bool
  , _opsWorksLayerAutoAssignPublicIps :: Val Bool
  , _opsWorksLayerCustomInstanceProfileArn :: Maybe (Val Text)
  , _opsWorksLayerCustomJson :: Maybe Object
  , _opsWorksLayerCustomRecipes :: Maybe OpsWorksLayerRecipes
  , _opsWorksLayerCustomSecurityGroupIds :: Maybe (ValList Text)
  , _opsWorksLayerEnableAutoHealing :: Val Bool
  , _opsWorksLayerInstallUpdatesOnBoot :: Maybe (Val Bool)
  , _opsWorksLayerLifecycleEventConfiguration :: Maybe OpsWorksLayerLifecycleEventConfiguration
  , _opsWorksLayerLoadBasedAutoScaling :: Maybe OpsWorksLayerLoadBasedAutoScaling
  , _opsWorksLayerName :: Val Text
  , _opsWorksLayerPackages :: Maybe (ValList Text)
  , _opsWorksLayerShortname :: Val Text
  , _opsWorksLayerStackId :: Val Text
  , _opsWorksLayerTags :: Maybe [Tag]
  , _opsWorksLayerType :: Val Text
  , _opsWorksLayerUseEbsOptimizedInstances :: Maybe (Val Bool)
  , _opsWorksLayerVolumeConfigurations :: Maybe [OpsWorksLayerVolumeConfiguration]
  } deriving (Show, Eq)

instance ToJSON OpsWorksLayer where
  toJSON OpsWorksLayer{..} =
    object $
    catMaybes
    [ fmap (("Attributes",) . toJSON) _opsWorksLayerAttributes
    , (Just . ("AutoAssignElasticIps",) . toJSON . fmap Bool') _opsWorksLayerAutoAssignElasticIps
    , (Just . ("AutoAssignPublicIps",) . toJSON . fmap Bool') _opsWorksLayerAutoAssignPublicIps
    , fmap (("CustomInstanceProfileArn",) . toJSON) _opsWorksLayerCustomInstanceProfileArn
    , fmap (("CustomJson",) . toJSON) _opsWorksLayerCustomJson
    , fmap (("CustomRecipes",) . toJSON) _opsWorksLayerCustomRecipes
    , fmap (("CustomSecurityGroupIds",) . toJSON) _opsWorksLayerCustomSecurityGroupIds
    , (Just . ("EnableAutoHealing",) . toJSON . fmap Bool') _opsWorksLayerEnableAutoHealing
    , fmap (("InstallUpdatesOnBoot",) . toJSON . fmap Bool') _opsWorksLayerInstallUpdatesOnBoot
    , fmap (("LifecycleEventConfiguration",) . toJSON) _opsWorksLayerLifecycleEventConfiguration
    , fmap (("LoadBasedAutoScaling",) . toJSON) _opsWorksLayerLoadBasedAutoScaling
    , (Just . ("Name",) . toJSON) _opsWorksLayerName
    , fmap (("Packages",) . toJSON) _opsWorksLayerPackages
    , (Just . ("Shortname",) . toJSON) _opsWorksLayerShortname
    , (Just . ("StackId",) . toJSON) _opsWorksLayerStackId
    , fmap (("Tags",) . toJSON) _opsWorksLayerTags
    , (Just . ("Type",) . toJSON) _opsWorksLayerType
    , fmap (("UseEbsOptimizedInstances",) . toJSON . fmap Bool') _opsWorksLayerUseEbsOptimizedInstances
    , fmap (("VolumeConfigurations",) . toJSON) _opsWorksLayerVolumeConfigurations
    ]

instance FromJSON OpsWorksLayer where
  parseJSON (Object obj) =
    OpsWorksLayer <$>
      (obj .:? "Attributes") <*>
      fmap (fmap unBool') (obj .: "AutoAssignElasticIps") <*>
      fmap (fmap unBool') (obj .: "AutoAssignPublicIps") <*>
      (obj .:? "CustomInstanceProfileArn") <*>
      (obj .:? "CustomJson") <*>
      (obj .:? "CustomRecipes") <*>
      (obj .:? "CustomSecurityGroupIds") <*>
      fmap (fmap unBool') (obj .: "EnableAutoHealing") <*>
      fmap (fmap (fmap unBool')) (obj .:? "InstallUpdatesOnBoot") <*>
      (obj .:? "LifecycleEventConfiguration") <*>
      (obj .:? "LoadBasedAutoScaling") <*>
      (obj .: "Name") <*>
      (obj .:? "Packages") <*>
      (obj .: "Shortname") <*>
      (obj .: "StackId") <*>
      (obj .:? "Tags") <*>
      (obj .: "Type") <*>
      fmap (fmap (fmap unBool')) (obj .:? "UseEbsOptimizedInstances") <*>
      (obj .:? "VolumeConfigurations")
  parseJSON _ = mempty

-- | Constructor for 'OpsWorksLayer' containing required fields as arguments.
opsWorksLayer
  :: Val Bool -- ^ 'owlAutoAssignElasticIps'
  -> Val Bool -- ^ 'owlAutoAssignPublicIps'
  -> Val Bool -- ^ 'owlEnableAutoHealing'
  -> Val Text -- ^ 'owlName'
  -> Val Text -- ^ 'owlShortname'
  -> Val Text -- ^ 'owlStackId'
  -> Val Text -- ^ 'owlType'
  -> OpsWorksLayer
opsWorksLayer autoAssignElasticIpsarg autoAssignPublicIpsarg enableAutoHealingarg namearg shortnamearg stackIdarg typearg =
  OpsWorksLayer
  { _opsWorksLayerAttributes = Nothing
  , _opsWorksLayerAutoAssignElasticIps = autoAssignElasticIpsarg
  , _opsWorksLayerAutoAssignPublicIps = autoAssignPublicIpsarg
  , _opsWorksLayerCustomInstanceProfileArn = Nothing
  , _opsWorksLayerCustomJson = Nothing
  , _opsWorksLayerCustomRecipes = Nothing
  , _opsWorksLayerCustomSecurityGroupIds = Nothing
  , _opsWorksLayerEnableAutoHealing = enableAutoHealingarg
  , _opsWorksLayerInstallUpdatesOnBoot = Nothing
  , _opsWorksLayerLifecycleEventConfiguration = Nothing
  , _opsWorksLayerLoadBasedAutoScaling = Nothing
  , _opsWorksLayerName = namearg
  , _opsWorksLayerPackages = Nothing
  , _opsWorksLayerShortname = shortnamearg
  , _opsWorksLayerStackId = stackIdarg
  , _opsWorksLayerTags = Nothing
  , _opsWorksLayerType = typearg
  , _opsWorksLayerUseEbsOptimizedInstances = Nothing
  , _opsWorksLayerVolumeConfigurations = Nothing
  }

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-attributes
owlAttributes :: Lens' OpsWorksLayer (Maybe Object)
owlAttributes = lens _opsWorksLayerAttributes (\s a -> s { _opsWorksLayerAttributes = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-autoassignelasticips
owlAutoAssignElasticIps :: Lens' OpsWorksLayer (Val Bool)
owlAutoAssignElasticIps = lens _opsWorksLayerAutoAssignElasticIps (\s a -> s { _opsWorksLayerAutoAssignElasticIps = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-autoassignpublicips
owlAutoAssignPublicIps :: Lens' OpsWorksLayer (Val Bool)
owlAutoAssignPublicIps = lens _opsWorksLayerAutoAssignPublicIps (\s a -> s { _opsWorksLayerAutoAssignPublicIps = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-custominstanceprofilearn
owlCustomInstanceProfileArn :: Lens' OpsWorksLayer (Maybe (Val Text))
owlCustomInstanceProfileArn = lens _opsWorksLayerCustomInstanceProfileArn (\s a -> s { _opsWorksLayerCustomInstanceProfileArn = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-customjson
owlCustomJson :: Lens' OpsWorksLayer (Maybe Object)
owlCustomJson = lens _opsWorksLayerCustomJson (\s a -> s { _opsWorksLayerCustomJson = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-customrecipes
owlCustomRecipes :: Lens' OpsWorksLayer (Maybe OpsWorksLayerRecipes)
owlCustomRecipes = lens _opsWorksLayerCustomRecipes (\s a -> s { _opsWorksLayerCustomRecipes = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-customsecuritygroupids
owlCustomSecurityGroupIds :: Lens' OpsWorksLayer (Maybe (ValList Text))
owlCustomSecurityGroupIds = lens _opsWorksLayerCustomSecurityGroupIds (\s a -> s { _opsWorksLayerCustomSecurityGroupIds = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-enableautohealing
owlEnableAutoHealing :: Lens' OpsWorksLayer (Val Bool)
owlEnableAutoHealing = lens _opsWorksLayerEnableAutoHealing (\s a -> s { _opsWorksLayerEnableAutoHealing = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-installupdatesonboot
owlInstallUpdatesOnBoot :: Lens' OpsWorksLayer (Maybe (Val Bool))
owlInstallUpdatesOnBoot = lens _opsWorksLayerInstallUpdatesOnBoot (\s a -> s { _opsWorksLayerInstallUpdatesOnBoot = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-lifecycleeventconfiguration
owlLifecycleEventConfiguration :: Lens' OpsWorksLayer (Maybe OpsWorksLayerLifecycleEventConfiguration)
owlLifecycleEventConfiguration = lens _opsWorksLayerLifecycleEventConfiguration (\s a -> s { _opsWorksLayerLifecycleEventConfiguration = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-loadbasedautoscaling
owlLoadBasedAutoScaling :: Lens' OpsWorksLayer (Maybe OpsWorksLayerLoadBasedAutoScaling)
owlLoadBasedAutoScaling = lens _opsWorksLayerLoadBasedAutoScaling (\s a -> s { _opsWorksLayerLoadBasedAutoScaling = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-name
owlName :: Lens' OpsWorksLayer (Val Text)
owlName = lens _opsWorksLayerName (\s a -> s { _opsWorksLayerName = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-packages
owlPackages :: Lens' OpsWorksLayer (Maybe (ValList Text))
owlPackages = lens _opsWorksLayerPackages (\s a -> s { _opsWorksLayerPackages = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-shortname
owlShortname :: Lens' OpsWorksLayer (Val Text)
owlShortname = lens _opsWorksLayerShortname (\s a -> s { _opsWorksLayerShortname = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-stackid
owlStackId :: Lens' OpsWorksLayer (Val Text)
owlStackId = lens _opsWorksLayerStackId (\s a -> s { _opsWorksLayerStackId = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-tags
owlTags :: Lens' OpsWorksLayer (Maybe [Tag])
owlTags = lens _opsWorksLayerTags (\s a -> s { _opsWorksLayerTags = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-type
owlType :: Lens' OpsWorksLayer (Val Text)
owlType = lens _opsWorksLayerType (\s a -> s { _opsWorksLayerType = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-useebsoptimizedinstances
owlUseEbsOptimizedInstances :: Lens' OpsWorksLayer (Maybe (Val Bool))
owlUseEbsOptimizedInstances = lens _opsWorksLayerUseEbsOptimizedInstances (\s a -> s { _opsWorksLayerUseEbsOptimizedInstances = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-volumeconfigurations
owlVolumeConfigurations :: Lens' OpsWorksLayer (Maybe [OpsWorksLayerVolumeConfiguration])
owlVolumeConfigurations = lens _opsWorksLayerVolumeConfigurations (\s a -> s { _opsWorksLayerVolumeConfigurations = a })