{-# LANGUAGE OverloadedStrings #-}

module Network.Pushbullet.Types.User where

import Network.Pushbullet.Types.Misc
import Network.Pushbullet.Types.Time

import Data.Aeson
import Data.Text ( Text )

data User
  = User
    { userCreated :: PushbulletTime
    , userEmail :: EmailAddress
    , userEmailNormalized :: EmailAddress
    , userId :: UserId
    , userImageUrl :: Url
    , userMaxUploadSize :: Double
    , userModified :: PushbulletTime
    , userName :: Name
    }
  deriving (Eq, Show)

instance FromJSON User where
  parseJSON (Object o) = pure User
    <*> o .: "created"
    <*> o .: "email"
    <*> o .: "email_normalized"
    <*> o .: "iden"
    <*> o .: "image_url"
    <*> o .: "max_upload_size"
    <*> o .: "modified"
    <*> o .: "name"
  parseJSON _ = fail "cannot parse user from non-object"

newtype UserId = UserId Text
  deriving (Eq, FromJSON, Show, ToJSON)