{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}

module Kerry.Example (
    example
  ) where

import qualified Data.Map as Map

import           Kerry
import           Kerry.Builder.AmazonEC2 (AWS(..), Credentials(..))
import           Kerry.Builder.AmazonEC2 (SourceAmi(..))
import           Kerry.Builder.AmazonEC2 (blockDeviceMapping)
import           Kerry.Builder.AmazonEC2 (EBS(..))

import           Kerry.Provisioner.Shell (ShellType(..), shell)

import qualified Kerry.Engine as F

import           Kerry.Internal.Prelude

example :: Packer
example =
  Packer {
      variables = [
          UserVariable "name" "example-packer"
        ]
    , builders = [
          Builder (AmazonEBSBuilder $ aws builder) Nothing ssh
        ]
    , provisioners = [
          shellProvisioner
        ]
    , postProcessors = []
    }

ssh :: Communicator
ssh =
  SSH $ defaultSSHCommunicator "ec2-user"

aws :: a -> AWS a
aws b =
  AWS {
      awsRegion = "us-west-2"
    , awsCredentials = EnvironmentVariables
    , awsBuilder = b
    }

builder :: EBS
builder =
  EBS {
      ebsAmiName = "test"
    , ebsSourceAmi = SourceAmiId "ami-fred"
    , ebsInstanceType = "m4.xlarge"
    , ebsAmiDescription = Nothing
    , ebsAmiRegions = Nothing
    , ebsAmiUsers = Nothing
    , ebsAssociatePublicIpAddress = Just True
    , ebsAvailabilityZone = Nothing
    , ebsIAMInstanceProfile = Just "iam-fred"
    , ebsInsecureSkipTLSVerify = Nothing
    , ebsLaunchBlockDeviceMappings = [
          blockDeviceMapping "/dev/xvda" "gp2" 200 True
        ]
    , ebsRunTags = Map.fromList [
          ("name", F.renderRawTemplate $ F.user "name")
        ]
    , ebsSubnetId = Nothing
    , ebsTags = Map.fromList [
          ("created", F.renderRawTemplate F.timestamp)
        ]
    , ebsVpcId = Nothing
    }


shellProvisioner :: Provisioner
shellProvisioner =
  provisioner . ShellProvisioner . shell $
    Inline ["echo foo"]