module M_advent where

import Mdl
import System.Time


advent :: Mdl
advent log = react f
  where
  f (Msg from _ _ "PRIVMSG" (to:"adventskranz":_))
    = do t <- getClockTime
         caltime <- toCalendarTime t
         let d = ctDay caltime
             m = fromEnum (ctMonth caltime) + 1
             y = ctYear caltime
         return (map output (lines (adventskranz d m y)))
    where
    output x = "PRIVMSG "++tgt from to++" :"++x
    tgt from to = if isAlpha (head to) then from else to


adventskranz d 12 y
  | d>24 = "Weihnachten ist vorbei, Idiot!"
adventskranz d m y
  | m<11 = "Wann faengt bei Dir bitte die Weihnachtszeit an?!"
  | wochenbis>4 = "Der Adventskranz ist noch nicht aufgestellt! dg UNGEDULD"
  | otherwise = "\ETX5" ++ adv (4 - wochenbis) ++ "\ETX"
  where
  vierter = 24 - zeller 24 12 y
  tagebis = (if m==11 then 30 else 0) + vierter-d
  wochenbis = ceiling (fromIntegral (max 0 tagebis) / 7)



-- zeller's congruence, shifted so that sun=0
zeller d m y = (d + ((m'+1)*26)/10 + y' + y'/4 + c/4 + 5*c + 6) `mod` 7
  where
  m' = if m>2 then m else 12+m
  (c,y') = y `divMod` 100
  (/) = div


adv 0 = "           I                         I\n\
        \          .I.                       .I.\n\
        \         |   |    .I.       .I.    |   |\n"
        ++ adv'

adv 1 = "                                     .\\n\
        \                                    / \\\n\
        \           I                       ( I )\n\
        \          .I.                       .I.\n\
        \         |   |    .I.       .I.    |   |\n"
        ++ adv'

adv 2 = "                                     .\\n\
        \                                    / \\\n\
        \           I                 .     ( I )\n\
        \          .I.               /I\\     .I.\n\
        \         |   |    .I.      (.I.)   |   |\n"
        ++ adv'

adv 3 = "                                     .\\n\
        \                                    / \\\n\
        \           I       .         .     ( I )\n\
        \          .I.     /I\\       /I\\     .I.\n\
        \         |   |   (.I.)     (.I.)   |   |\n"
        ++ adv'

adv 4 = "           .                         .\\n\
        \          / \\                       / \\\n\
        \         ( I )     .         .     ( I )\n\
        \          .I.     /I\\       /I\\     .I.\n\
        \         |   |   (.I.)     (.I.)   |   |\n"
        ++ adv'

adv' = "         |   |    | |       | |    |   |\n\
       \         |   |    | |       | |    |   |\n\
       \         |   |_.xx|_+-xxx---|_|xx._|   |\n\
       \      _.-|   |   xx    xxx      xx |   |-._\n\
       \    xX   '---'XX  _xx___xxx____ xx '---'XXX`,\n\
       \   |    XXXXXX   '--XXXXX------'XXX      XX  |\n\
       \    \\ XXXXXX      XXXXX       XXXXX     XXX /\n\
       \     `\"XXX_     XXXXX       XXXXX     _XX-\"'\n\
       \           '\"-XXXXX-------XXAoS-----\"'"

