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

module Aws.Sqs.Commands.Permission where

import           Aws.Core
import           Aws.Sqs.Core
import qualified Data.ByteString.Char8 as B
import qualified Data.Text             as T
import qualified Data.Text.Encoding    as TE
import qualified Network.HTTP.Types    as HTTP

data AddPermission = AddPermission {
    apLabel :: T.Text,
    apPermissions :: [(T.Text,SqsPermission)],
    apQueueName :: QueueName
  } deriving (Show)

data AddPermissionResponse = AddPermissionResponse
  deriving (Show)


formatPermissions :: [(T.Text,SqsPermission)] -> [HTTP.QueryItem]
formatPermissions perms = 
  concat $ zipWith(\ x y -> [(B.pack $ "AwsAccountId." ++ show y, Just $ B.pack $ T.unpack $ fst x), 
                             (B.pack $ "ActionName." ++ show y, Just $ B.pack $ T.unpack $ printPermission $ snd x)]) perms [1 :: Integer ..]

instance ResponseConsumer r AddPermissionResponse where
    type ResponseMetadata AddPermissionResponse = SqsMetadata
    responseConsumer _ = sqsXmlResponseConsumer parse
       where
         parse _ = do
           return AddPermissionResponse {}
        
-- | ServiceConfiguration: 'SqsConfiguration'
instance SignQuery AddPermission  where 
    type ServiceConfiguration AddPermission  = SqsConfiguration
    signQuery AddPermission {..} = sqsSignQuery SqsQuery {
                                             sqsQueueName = Just apQueueName, 
                                             sqsQuery = [("Action", Just "AddPermission"), 
                                                        ("QueueName", Just $ B.pack $ T.unpack $ printQueueName apQueueName),
                                                        ("Label", Just $ B.pack $ T.unpack apLabel)] ++ formatPermissions apPermissions}

instance Transaction AddPermission AddPermissionResponse

data RemovePermission = RemovePermission {
    rpLabel :: T.Text,
    rpQueueName :: QueueName 
  } deriving (Show)

data RemovePermissionResponse = RemovePermissionResponse 
  deriving (Show)

instance ResponseConsumer r RemovePermissionResponse where
    type ResponseMetadata RemovePermissionResponse = SqsMetadata
    responseConsumer _ = sqsXmlResponseConsumer parse
      where 
        parse _ = do
          return RemovePermissionResponse {}  
          
-- | ServiceConfiguration: 'SqsConfiguration'
instance SignQuery RemovePermission  where 
    type ServiceConfiguration RemovePermission  = SqsConfiguration
    signQuery RemovePermission {..} = sqsSignQuery SqsQuery {
                                             sqsQueueName = Just rpQueueName, 
                                             sqsQuery = [("Action", Just "RemovePermission"), 
                                                        ("Label", Just $ TE.encodeUtf8 rpLabel )]} 

instance Transaction RemovePermission RemovePermissionResponse