{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards   #-}
{-# LANGUAGE TemplateHaskell   #-}

{-|
Module: AWSLambda.Events.KinesisEvent
Description: Types for Kinesis Lambda events

Based on https://github.com/aws/aws-lambda-dotnet/tree/master/Libraries/src/Amazon.Lambda.KinesisEvents
-}
module AWSLambda.Events.KinesisEvent where

import           Control.Lens.TH
import           Data.Aeson                (FromJSON (..), withObject, (.:))
import           Data.Aeson.Casing         (aesonDrop, camelCase)
import           Data.Aeson.TH             (deriveFromJSON)
import           Data.Text                 (Text)
import           Network.AWS.Data.Base64   (Base64 (..))
import qualified Network.AWS.Kinesis.Types as Kinesis
import qualified Network.AWS.Types         as AWS

import           AWSLambda.Events.Records

data KinesisRecord = KinesisRecord
  { _krRecord               :: !Kinesis.Record
  , _krKinesisSchemaVersion :: !Text
  } deriving (Eq, Show)

instance FromJSON KinesisRecord where
  parseJSON =
    withObject "KinesisRecord" $
    \o -> do
      _krKinesisSchemaVersion <- o .: "kinesisSchemaVersion"
      dataBase64 <- o .: "data"
      _krRecord <-
        Kinesis.record <$> (o .: "sequenceNumber") <*> pure (unBase64 dataBase64) <*>
        (o .: "partitionKey")
      return KinesisRecord {..}
$(makeLenses ''KinesisRecord)

data KinesisEventRecord = KinesisEventRecord
  { _kerKinesis           :: !KinesisRecord
  , _kerEventSource       :: !Text
  , _kerEventID           :: !Text
  , _kerInvokeIdentityArn :: !Text
  , _kerEventVersion      :: !Text
  , _kerEventName         :: !Text
  , _kerEventSourceARN    :: !Text
  , _kerAwsRegion         :: !AWS.Region
  } deriving (Eq, Show)
$(deriveFromJSON (aesonDrop 4 camelCase) ''KinesisEventRecord)
$(makeLenses ''KinesisEventRecord)

type KinesisEvent = RecordsEvent KinesisEventRecord