{-# LANGUAGE FlexibleContexts #-}
module Villefort.Log (genStats) where
import Control.Monad.Reader (MonadReader,MonadIO,liftIO)
import Villefort.Definitions (VConfig(..))
import Villefort.Database (getSubjects,makeQuery,clean)
import Villefort.Util (makeTable)
import Paths_Villefort (getDataFileName)
import System.Random (randomRIO)
genStats :: (MonadReader VConfig m, MonadIO m) => m String
genStats = do
subjects <- getSubjects
gits <- mapM makeGithub subjects
avg <- getAvg
statsSum <- getSum
x <- liftIO $ getDataFileName "templates/header"
header <- liftIO (readFile x)
return (header ++ table ++ (makeTable ["Subject","time"] avg) ++ "</br> <h1> Sum </h1>" ++ (makeTable ["Subject","time"] statsSum) ++ "</html>" ++ (mconcat gits))
getAvg :: (MonadReader VConfig m, MonadIO m) => m [[String]]
getAvg = makeQuery "select avg(time), Subject from todo group by Subject order by avg(time) desc"
getSum :: (MonadReader VConfig m, MonadIO m) => m [[String]]
getSum = makeQuery "select sum(time), Subject from todo group by Subject order by sum(time) desc"
table :: String
table = " <script src='templates/js.js'></script><h1> avg </h1>"
makeGithub :: (MonadIO m, MonadReader VConfig m)
=> String -> m String
makeGithub subject = do
z <- makeQuery ("select substr(Due,1,10) from todo where subject = '" ++ (clean subject) ++ "' and state = 0")
color <- liftIO $ getColor
let header = "<h2 id='"++ subject ++ "'> Calendar "++ subject ++ " </h2> <script> new Calendar({ append_to: '" ++ subject ++ "',num_weeks: 51,day_size: 11, data: ["
let q = Prelude.map (\x -> "['" ++ (x !! 0) ++"',500],") z
let bot = " ], color: " ++ color ++ " }); </script>"
return (header ++ (Prelude.concat q )++ bot)
statsColors :: [String]
statsColors = ["'#F44336'"
,"'#E91E63'"
,"'#9C27B0'"
,"'#673AB7'"
,"'#3F51B5'"
,"'#2196F3'"
,"'#03A9F4'"
,"'#00BCD4'"
,"'#009688'"
,"'#4CAF50'"
,"'#8BC34A'"
,"'#CDDC39'"
,"'#FFEB3B'"
,"'#FFC107'"
,"'#FF9800'"
,"'#FF5722'"
,"'#795548'"
,"'#9E9E9E'"
,"'#607D8B'"
]
getColor :: IO String
getColor = do
number <- randomRIO (0, (length $ statsColors)-1) :: IO Int
return (statsColors !! number)