{-# LANGUAGE ExistentialQuantification #-}
module MixPanel.Types.TrackData
  ( TrackData(..)
  , Properties
  , mkProperties
  ) where

import           Data.Aeson                     ( ToJSON
                                                , toJSON
                                                , encode
                                                , Value(..)
                                                , Object
                                                , (.=)
                                                )
import           Data.Text                      ( Text )
import qualified Data.ByteString.Base64.Lazy   as B64
import           Data.Time.Clock.POSIX          ( POSIXTime )
import           GHC.Exts                       ( fromList )
import           GHC.Generics                   ( Generic )
import           Servant.API
import           Data.String.Conv               ( toS )
import           MixPanel.Types.Core            ( AuthToken )


data TrackData = TrackData
  { TrackData -> Text
event :: Text
  , TrackData -> Properties
properties :: Properties
  } deriving ((forall x. TrackData -> Rep TrackData x)
-> (forall x. Rep TrackData x -> TrackData) -> Generic TrackData
forall x. Rep TrackData x -> TrackData
forall x. TrackData -> Rep TrackData x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep TrackData x -> TrackData
$cfrom :: forall x. TrackData -> Rep TrackData x
Generic, [TrackData] -> Encoding
[TrackData] -> Value
TrackData -> Encoding
TrackData -> Value
(TrackData -> Value)
-> (TrackData -> Encoding)
-> ([TrackData] -> Value)
-> ([TrackData] -> Encoding)
-> ToJSON TrackData
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [TrackData] -> Encoding
$ctoEncodingList :: [TrackData] -> Encoding
toJSONList :: [TrackData] -> Value
$ctoJSONList :: [TrackData] -> Value
toEncoding :: TrackData -> Encoding
$ctoEncoding :: TrackData -> Encoding
toJSON :: TrackData -> Value
$ctoJSON :: TrackData -> Value
ToJSON)


instance ToHttpApiData TrackData where
  toUrlPiece :: TrackData -> Text
toUrlPiece = ByteString -> Text
forall a b. StringConv a b => a -> b
toS (ByteString -> Text)
-> (TrackData -> ByteString) -> TrackData -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
B64.encode (ByteString -> ByteString)
-> (TrackData -> ByteString) -> TrackData -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TrackData -> ByteString
forall a. ToJSON a => a -> ByteString
encode

data Properties = Properties
  { Properties -> AuthToken
token :: AuthToken
  , Properties -> Maybe Text
distinctId :: Maybe Text
  , Properties -> Maybe POSIXTime
time :: Maybe POSIXTime
  , Properties -> Maybe Text
ip :: Maybe Text
  , Properties -> Object
extraProperties :: Object
  }

instance ToJSON Properties where
  toJSON :: Properties -> Value
toJSON Properties{Maybe Text
Maybe POSIXTime
Object
AuthToken
extraProperties :: Object
ip :: Maybe Text
time :: Maybe POSIXTime
distinctId :: Maybe Text
token :: AuthToken
extraProperties :: Properties -> Object
ip :: Properties -> Maybe Text
time :: Properties -> Maybe POSIXTime
distinctId :: Properties -> Maybe Text
token :: Properties -> AuthToken
..} = Object -> Value
Object (Object -> Value) -> Object -> Value
forall a b. (a -> b) -> a -> b
$ Object
extraProperties Object -> Object -> Object
forall a. Semigroup a => a -> a -> a
<> [Item Object] -> Object
forall l. IsList l => [Item l] -> l
fromList
     [ Text
"token" Text -> AuthToken -> (Text, Value)
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= AuthToken
token
     , Text
"distinct_id" Text -> Maybe Text -> (Text, Value)
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
distinctId
     , Text
"time" Text -> Maybe POSIXTime -> (Text, Value)
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe POSIXTime
time
     , Text
"ip" Text -> Maybe Text -> (Text, Value)
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
ip
     ]

mkProperties :: AuthToken -> Object -> Properties
mkProperties :: AuthToken -> Object -> Properties
mkProperties AuthToken
token Object
obj = Properties :: AuthToken
-> Maybe Text
-> Maybe POSIXTime
-> Maybe Text
-> Object
-> Properties
Properties
  { token :: AuthToken
token = AuthToken
token
  , distinctId :: Maybe Text
distinctId = Maybe Text
forall a. Maybe a
Nothing
  , time :: Maybe POSIXTime
time = Maybe POSIXTime
forall a. Maybe a
Nothing
  , ip :: Maybe Text
ip = Maybe Text
forall a. Maybe a
Nothing
  , extraProperties :: Object
extraProperties = Object
obj
  }