module Keenser.Import
  ( module Keenser.Import
  ) where

import Control.Monad               as Keenser.Import
import Control.Monad.IO.Class      as Keenser.Import (MonadIO, liftIO)
import Control.Monad.Trans.Control as Keenser.Import (MonadBaseControl)
import Control.Monad.Trans.State   as Keenser.Import (modify)
import Data.Aeson                  as Keenser.Import (Value, toJSON, fromJSON, parseJSON, encode, decode)
import Data.Maybe                  as Keenser.Import (fromMaybe)
import Data.Monoid                 as Keenser.Import ((<>))
import Data.Thyme.Clock            as Keenser.Import (UTCTime, getCurrentTime)

import Prelude as Keenser.Import

import           Data.AffineSpace            ((.+^))
import qualified Data.ByteString             as BS
import qualified Data.ByteString.Char8       as BSC
import           Data.Thyme.Clock            (fromSeconds)
import           Data.Thyme.Format           (formatTime, readTime)
import qualified Data.Scientific             as SC
import           System.Locale               (defaultTimeLocale)


timestamp :: UTCTime -> BS.ByteString
timestamp = BSC.pack . formatTime defaultTimeLocale "%s%Q"

daystamp :: UTCTime -> BS.ByteString
daystamp = BSC.pack . formatTime defaultTimeLocale "%Y-%m-%d"

timeToJson :: UTCTime -> SC.Scientific
timeToJson = read . BSC.unpack . timestamp

jsonToTime :: SC.Scientific -> UTCTime
jsonToTime = readTime defaultTimeLocale "%s%Q" . SC.formatScientific SC.Fixed (Just 6)

timeToDouble :: UTCTime -> Double
timeToDouble = read . formatTime defaultTimeLocale "%s%Q"

secondsFrom :: Rational -> UTCTime -> UTCTime
secondsFrom n time = time .+^ fromSeconds n