{-# LANGUAGE OverloadedStrings          #-}
module Network.Pushbullet (
    sendPush
  , module PBT
)where

import           Control.Lens                ((&), (?~))
import           Data.Aeson
import qualified Data.HashMap.Strict as H
import           Data.Monoid
import           Network.Pushbullet.Internal
import           Network.Pushbullet.Types    as PBT
import           Network.Wreq

-- | Send a push to a given device
-- if device is
sendPush :: PushSecret       -- ^ Access Token for pushbullet
         -> Maybe DeviceId   -- ^ Send to a specific device. If Nothing it will broadcast
         -> PushBullet       -- ^ Message to push
         -> IO ()            -- ^ Will eventuall return some sort of error/success
sendPush secret d p = do
  _ <- postWith
        (defaults & auth ?~ (unPushSecret secret))
        "https://api.pushbullet.com/v2/pushes"
        (addDeviceIden d $ toJSON p)
  return ()

addDeviceIden :: Maybe DeviceId -> Value -> Value
addDeviceIden (Just devId) (Object o) =
  Object $
    o <> H.fromList ["device_iden" .= unDeviceId devId]
addDeviceIden _ v = v