{-|
Module      : Data.Holiday.Korea
Description : The module contains Korea Holidays
Copyright   : (c) Kyung Mo Kweon
License     : MIT
Maintainer  : kkweon@gmail.com
Stability   : experimental
Portability : POSIX

The module contains Korea Holidays
-}
module Data.Holiday.Korea where

import Data.Holiday.Model (Date(..), Holiday(..))
import Data.Maybe (listToMaybe)
import Util.Config (holidays)

import Control.Monad (msum)

import qualified Data.Time as Time

-- | 'getHoliday' returns Nothing if there is no Korean holiday.
getHoliday ::
     Integer -- ^ Year
  -> Int -- ^ Month
  -> Int -- ^ Day
  -> Maybe Holiday
getHoliday year month day = listToMaybe $ filter match holidays
  where
    match :: Holiday -> Bool
    match Holiday {date = YMD (y, m, d)}
      | y == year && m == month && d == day = True
    match Holiday {date = MD (m, d)}
      | m == month && d == day = True
    match _ = False

-- | `getNearestHoliday` returns a nearest holiday within a year range
getNearestHoliday :: Time.Day -> Maybe Holiday
getNearestHoliday day = msum . map go $ [0 .. 365]
  where
    go :: Integer -> Maybe Holiday
    go delta =
      let newDay = Time.addDays delta day
          (y, m, d) = Time.toGregorian newDay
       in getHoliday y m d