{-# 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) -- | Generate stats page 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) ++ "

Sum

" ++ (makeTable ["Subject","time"] statsSum) ++ "" ++ (mconcat gits)) -- | get average time spent on each category getAvg :: (MonadReader VConfig m, MonadIO m) => m [[String]] getAvg = makeQuery "select avg(time), Subject from todo group by Subject order by avg(time) desc" -- | get total time spent on each category getSum :: (MonadReader VConfig m, MonadIO m) => m [[String]] getSum = makeQuery "select sum(time), Subject from todo group by Subject order by sum(time) desc" -- | Library to include for github table table :: String table = "

avg

" -- | creates the github like graph from database 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 = "

Calendar "++ subject ++ "

" return (header ++ (Prelude.concat q )++ bot) -- | default colors for the daily charts statsColors :: [String] statsColors = ["'#F44336'" ,"'#E91E63'" ,"'#9C27B0'" ,"'#673AB7'" ,"'#3F51B5'" ,"'#2196F3'" ,"'#03A9F4'" ,"'#00BCD4'" ,"'#009688'" ,"'#4CAF50'" ,"'#8BC34A'" ,"'#CDDC39'" ,"'#FFEB3B'" ,"'#FFC107'" ,"'#FF9800'" ,"'#FF5722'" ,"'#795548'" ,"'#9E9E9E'" ,"'#607D8B'" ] -- | gets random colors for chart getColor :: IO String getColor = do number <- randomRIO (0, (length $ statsColors)-1) :: IO Int return (statsColors !! number)