{-
    Copyright 2015 Markus Ongyerth, Stephan Guenther

    This file is part of Monky.

    Monky is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    Monky is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with Monky.  If not, see <http://www.gnu.org/licenses/>.
-}
{-# LANGUAGE CPP #-}
{-|
Module      : Monky.Time
Description : Allows access to read system time
Maintainer  : ongy
Stability   : testing
Portability : Linux
-}

module Monky.Time
  ( TimeHandle
  , getTime
  , getHM
  , getTimeHandle
  )
where

import Data.Time.Clock
import Data.Time.Format
import Data.Time.LocalTime

import System.Locale.Current

-- 4.8 breaks with System.Locale import
#if MIN_VERSION_base(4,8,0)
#else
import System.Locale
#endif

-- |The handle exported by this module.
data TimeHandle = TimeH TimeLocale String TimeZone

doTime :: TimeLocale -> String -> TimeZone -> UTCTime -> String
doTime tl str z t = formatTime tl str $ utcToLocalTime z t

-- |Get the current time in the format given to the handle.
getTime :: TimeHandle -> IO String
getTime (TimeH tl str z) = do
  t <- getCurrentTime
  return $ doTime tl str z t

-- |Get the current time (HH:MM) format for the current time zone.
getHM :: TimeHandle -> IO (Int, Int)
getHM (TimeH _ _ z) = do
  t <- getCurrentTime
  let (LocalTime _ (TimeOfDay h m _)) = utcToLocalTime z t
  return (h, m)

-- |Get a handle for this module
getTimeHandle :: String  -- ^The format that should be used for 'getTime' in strftime format
              -> IO TimeHandle
getTimeHandle format = do
  z <- getCurrentTimeZone
  tl <- currentLocale
  return (TimeH tl format z)