{-# LANGUAGE DeriveGeneric         #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE RecordWildCards       #-}

module Logging.Types.Handlers.FileHandler
  ( FileHandler(..)
  ) where

import           Data.IORef
import           GHC.Generics
import           System.IO
import           Text.Format

import           Logging.Prelude
import           Logging.Types.Class
import           Logging.Types.Filter
import           Logging.Types.Level


-- | A handler type which writes logging records, appropriately formatted,
-- to a file.
--
data FileHandler = FileHandler { level     :: Level
                               , filterer  :: Filterer
                               , formatter :: Format1
                               , file      :: FilePath
                               , encoding  :: TextEncoding
                               , stream    :: IORef Handle
                               } deriving (Generic, Eq)

instance Handler FileHandler where
  open FileHandler{..} = atomicWriteIORef stream =<< openLogFile file encoding

  emit self@FileHandler{..} rcd = do
    stream' <- readIORef stream
    flip hPutStrLn (format1 formatter rcd) stream'
    hFlush stream'

  close FileHandler{..} = hClose =<< readIORef stream