{-# LANGUAGE TypeFamilies
           , MultiParamTypeClasses
           , FlexibleInstances
           , OverloadedStrings
           , RecordWildCards
           , TemplateHaskell
           #-}

module Aws.Ec2.Commands.CreateSecurityGroup where

import Data.Aeson (Value (..), FromJSON, (.:), parseJSON)
import Data.Aeson.Types (typeMismatch)

import Aws.Ec2.TH

data CreateSecurityGroup = CreateSecurityGroup
               { csec_name :: Text
               , csec_description :: Text
               , csec_vpcId :: Maybe Text
               } deriving (Show)

instance SignQuery CreateSecurityGroup where
    type ServiceConfiguration CreateSecurityGroup = EC2Configuration
    signQuery CreateSecurityGroup{..} = ec2SignQuery $
                                           [ ("GroupName", qArg csec_name)
                                           , ("GroupDescription", qArg csec_description)
                                           , ("Action", qArg "CreateSecurityGroup")
                                           , defVersion
                                           ] +++ optionalA "VpcId" csec_vpcId

ec2ValueTransaction ''CreateSecurityGroup "CreateSecurityGroupResponse"

data CreateSecurityGroupResponse =
  CreateSecurityGroupResponse
  { csgrRequestId :: Text
  , csgrReturn :: Text
  , csgrGroupId :: Text }
  deriving Show

instance FromJSON CreateSecurityGroupResponse where
  parseJSON (Object v) = CreateSecurityGroupResponse <$>
    v .: "requestId" <*>
    v .: "return" <*>
    v .: "groupId"
  parseJSON invalid = typeMismatch "CreateSecurityGroupResponse" invalid