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

module Network.Pushbullet.Types.User where

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

import Data.Aeson
import Data.Text ( Text )
import Lens.Micro.TH

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

data User
  = User
    { _userCreated :: PushbulletTime
    , _userEmail :: EmailAddress
    , _userEmailNormalized :: EmailAddress
    , _userId :: UserId
    , _userImageUrl :: Url
    , _userMaxUploadSize :: Double
    , _userModified :: PushbulletTime
    , _userName :: Name
    }
  deriving (Eq, Show)

makeLenses ''User

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"