{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-} -- I'm defining the orphan

module Data.EJson.EJson2Value ( ejson2value ) where

import Data.Aeson
import Data.Text.Internal
import Data.Text.Encoding
import Data.Vector
import Data.HashMap.Strict
import Data.ByteString.Base64
import Data.Time.Clock.POSIX
import Data.Time.Clock

-- Display purposes
import qualified Data.ByteString.Lazy.Char8 as BC8

import Data.EJson.EJson

instance Show EJsonValue
  where
  show = BC8.unpack . Data.Aeson.encode . ejson2value

ejson2value :: EJsonValue -> Value
ejson2value (EJObject h    ) = Object (Data.HashMap.Strict.map ejson2value h)
ejson2value (EJArray  v    ) = Array  (Data.Vector.map ejson2value v)
ejson2value (EJString t    ) = String t
ejson2value (EJNumber n    ) = Number n
ejson2value (EJBool   b    ) = Bool b
ejson2value (EJDate   t    ) = makeJsonDate t
ejson2value (EJBinary bs   ) = String $ decodeUtf8 $ Data.ByteString.Base64.encode bs
ejson2value (EJUser   t1 t2) = makeUser t1 t2
ejson2value (EJNull        ) = Null

makeUser :: Text -> EJsonValue -> Value
makeUser t v = Object
           $ Data.HashMap.Strict.fromList
           [ ("$type" , String t)
           , ("$value", ejson2value v)]

makeJsonDate :: UTCTime -> Value
makeJsonDate t = Object
               $ Data.HashMap.Strict.fromList
               [ ("$date", Number t') ]
  where
  t' = realToFrac $ utcTimeToPOSIXSeconds t