module Utils.Time
  ( belongToCurrentMonth
  , belongToCurrentWeek
  , timeToDay
  , monthToKey
  ) where

import Data.Time.Clock (UTCTime, getCurrentTime)
import Data.Time.LocalTime
import Data.Time.Calendar
import Data.Time.Calendar.WeekDate (toWeekDate)

import Model.Message.Key (Key)
import qualified Model.Message.Key as K

belongToCurrentMonth :: UTCTime -> IO Bool
belongToCurrentMonth time = do
  (timeYear, timeMonth, _) <- toGregorian <$> timeToDay time
  (actualYear, actualMonth, _) <- toGregorian <$> (getCurrentTime >>= timeToDay)
  return (actualYear == timeYear && actualMonth == timeMonth)

belongToCurrentWeek :: UTCTime -> IO Bool
belongToCurrentWeek time = do
  (timeYear, timeWeek, _) <- toWeekDate <$> timeToDay time
  (actualYear, actualWeek, _) <- toWeekDate <$> (getCurrentTime >>= timeToDay)
  return (actualYear == timeYear && actualWeek == timeWeek)

timeToDay :: UTCTime -> IO Day
timeToDay time = localDay . (flip utcToLocalTime time) <$> getTimeZone time

monthToKey :: Int -> Maybe Key
monthToKey 1  = Just K.January
monthToKey 2  = Just K.February
monthToKey 3  = Just K.March
monthToKey 4  = Just K.April
monthToKey 5  = Just K.May
monthToKey 6  = Just K.June
monthToKey 7  = Just K.July
monthToKey 8  = Just K.August
monthToKey 9  = Just K.September
monthToKey 10 = Just K.October
monthToKey 11 = Just K.November
monthToKey 12 = Just K.December
monthToKey _ = Nothing