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

module Aws.Ec2.Commands.CreateTags where

import Data.Aeson (Value (..), FromJSON, parseJSON)

import Aws.Ec2.TH
import qualified Network.HTTP.Types as HTTP

data CreateTags = CreateTags
                  { ct_resources :: [Text]
                  , ct_tags :: [Tag]
                  } deriving (Show)

enumerateTags :: [Tag] -> HTTP.Query
enumerateTags = enumerateLists "Tag." . fmap unroll
  where
    unroll (Tag key value) = [ ("Key", qArg key)
                             , ("Value", qArg value)
                             ]

instance SignQuery CreateTags where
    type ServiceConfiguration CreateTags = EC2Configuration
    signQuery CreateTags{..} = ec2SignQuery $
                                           [ ("Action", qArg "CreateTags")
                                           , defVersion
                                           ] +++ enumerate "ResourceId" ct_resources qArg
                                             +++ enumerateTags ct_tags

ec2ValueTransaction ''CreateTags "return"

newtype CreateTagsResponse = CreateTagsResponse {ctrReturn :: Bool} deriving (Show)

instance FromJSON CreateTagsResponse where
  parseJSON v = CreateTagsResponse <$>
    (readBool <$> parseJSON v)