{-# LANGUAGE OverloadedStrings #-}

module Tesla.Car.Command.Sharing (share) where

import           Control.Monad.IO.Class (MonadIO (..))
import           Data.Aeson
import           Data.Text              (Text)
import           Data.Time.Clock.POSIX  (getCurrentTime, utcTimeToPOSIXSeconds)

import           Tesla.Car.Command

share :: MonadIO m => Text -> Car m CommandResponse
share :: Text -> Car m CommandResponse
share Text
to = do
  Int
now <- (Int, POSIXTime) -> Int
forall a b. (a, b) -> a
fst ((Int, POSIXTime) -> Int)
-> (UTCTime -> (Int, POSIXTime)) -> UTCTime -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. POSIXTime -> (Int, POSIXTime)
forall a b. (RealFrac a, Integral b) => a -> (b, a)
properFraction (POSIXTime -> (Int, POSIXTime))
-> (UTCTime -> POSIXTime) -> UTCTime -> (Int, POSIXTime)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTCTime -> POSIXTime
utcTimeToPOSIXSeconds (UTCTime -> Int) -> Car m UTCTime -> Car m Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO UTCTime -> Car m UTCTime
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO UTCTime
getCurrentTime
  String -> Value -> Car m CommandResponse
forall (m :: * -> *) p.
(MonadIO m, Postable p) =>
String -> p -> Car m CommandResponse
runCmd String
"share" (Value -> Car m CommandResponse) -> Value -> Car m CommandResponse
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
object [
    Text
"type" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= (Text
"share_ext_content_raw" :: Text),
    Text
"value" Text -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= [Pair] -> Value
object [ Text
"android.intent.extra.TEXT" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Text
to ],
    Text
"locale" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= (Text
"en-US" :: Text),
    Text
"timestamp_ms" Text -> Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= (Int
now Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
1000::Int))
    ]