{-# LANGUAGE DeriveFunctor          #-}
{-# LANGUAGE FlexibleInstances      #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses  #-}
{-# LANGUAGE OverloadedStrings      #-}
{-# LANGUAGE RecordWildCards        #-}
{-# OPTIONS_GHC -fno-warn-orphans   #-}
module LuminescentDreams.Logger.Standard ( logMsgStd, formatMsgStd ) where

import           Data.Monoid
import qualified Data.Text.Format         as TF
import qualified Data.Text.Lazy           as T
import qualified Data.Text.Buildable      as TFB
import qualified Data.Time                as Time
import qualified Data.List                as List

import           LuminescentDreams.Logger.Internal


data LogMsg = LogMsg LogLevel [(String, String)] String

logMsgStd :: Logger -> LogLevel -> [(String, String)] -> String -> IO ()
logMsgStd l lvl tags text = logMsg_ l (LogMsg lvl tags text)

logMsg_ :: Logger -> LogMsg -> IO ()
logMsg_ (Logger writer pri) msg@(LogMsg lvl _ _) =
  if lvl >= pri
    then do
      t <-  Time.getCurrentTime
      writer $ formatMsgStd t msg
    else return ()


formatMsgStd :: Time.UTCTime -> LogMsg -> T.Text
formatMsgStd t (LogMsg lvl tags text) =
  TF.format "{} {} {} {}" (Time.formatTime Time.defaultTimeLocale "%Y-%m-%d %H:%M:%S" t, lvl, tags, text)


instance TFB.Buildable (String, String) where
  build (name, value) = TFB.build $ "(" <> name <> ", " <> value <> ")"

instance TFB.Buildable [(String, String)] where
  -- build lst = TFB.build "[" <> TFB.build `fmap` lst "]"
  build lst =
    mconcat $ [TFB.build ("[" :: String)]
           <>  (List.intersperse (TFB.build (", " :: String)) (TFB.build `fmap` lst))
           <> [TFB.build ("]" :: String)]