content: {-# LANGUAGE RecordWildCards #-}
  
  module System.Cron.Internal.Describe.Types where
  
  import Data.List  (intercalate)
  import Data.Maybe (catMaybes)
  
  
  data Descriptor = Descriptor {
      pluralDesc         :: String
    , singularDesc       :: String
    , rangePrefix        :: String
    , rangeSuffix        :: String
    , rangeJoiner        :: String
    , displayItem        :: Int -> String
    , specificPrefix     :: String
    , specificSuffix     :: String
    , stepSpecificSuffix :: Int -> Maybe String
    , listPrefix         :: String
    , listSuffix         :: Maybe String
    }
  
  
  data Month = January | February | March     | April   | May      | June     |
               July    | August   | September | October | November | December
               deriving (Enum, Bounded, Show)
  
  
  safeIntToMonth :: Int -> Month
  safeIntToMonth = toEnum . subtract 1 . min 12 . max 1
  
  
  data Weekday = Sunday | Monday | Tuesday | Wednesday |
                 Thursday | Friday | Saturday | Sunday2
                 deriving (Enum, Bounded, Show)
  
  
  safeIntToWeekDay :: Int -> Weekday
  safeIntToWeekDay n
    | n == 7    = Sunday
    | otherwise = toEnum . min 6 $ max 0 n
  
  
  data Verbosity = Verbose | NotVerbose
  
  
  data TimeFormat = Hour24 | Hour12
  
  
  data DescribedValue = Concrete String
                      | Every String
  
  
  instance Show DescribedValue where
    show (Concrete s) = s
    show (Every s)    = s
  
  
  data Time = ConcreteTime String
            | Other (Maybe DescribedValue) (Maybe DescribedValue)
  
  
  instance Show Time where
    show (ConcreteTime s) = s
    show (Other md1 md2)  = intercalate ", " .
                            map show         $ catMaybes [md1, md2]
  
  
  data Description = Desc {
      _time   :: Time
    , _dom    :: Maybe DescribedValue
    , _month  :: Maybe DescribedValue
    , _dow    :: Maybe DescribedValue
    }
  
  
  instance Show Description where
    show Desc{..} = intercalate ", " .
                    (:) (show _time) .
                    map show         $ catMaybes [_dom, _dow, _month]
  