{- | mtlstats Copyright (C) 2019 Rhéal Lamothe This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . -} module Mtlstats.Report (report, gameDate) where import qualified Data.Map as M import Data.Maybe (fromMaybe) import Lens.Micro ((^.)) import Mtlstats.Config import Mtlstats.Format import Mtlstats.Types import Mtlstats.Util -- | Generates the report report :: Int -- ^ The number of columns for the report -> ProgState -- ^ The program state -> [String] report width s = standingsReport width s ++ [""] ++ gameStatsReport width s standingsReport :: Int -> ProgState -> [String] standingsReport width s = fromMaybe [] $ do let db = s^.database gs = s^.progMode.gameStateL gNum = db^.dbGames date = gameDate gs hTeam = homeTeam gs aTeam = awayTeam gs hStats = db^.dbHomeGameStats aStats = db^.dbAwayGameStats tStats = addGameStats hStats aStats hScore <- gs^.homeScore aScore <- gs^.awayScore Just [ overlay ("GAME NUMBER " ++ padNum 2 gNum) (centre width $ aTeam ++ " " ++ show aScore ++ " AT " ++ hTeam ++ " " ++ show hScore) , date , centre width "STANDINGS" , "" , centre width $ left 11 myTeam ++ right 2 "G" ++ right 4 "W" ++ right 4 "L" ++ right 4 "OT" ++ right 4 "GF" ++ right 4 "GA" ++ right 4 "P" , centre width $ left 11 "HOME" ++ showStats hStats , centre width $ left 11 "ROAD" ++ showStats aStats , centre width $ replicate 11 ' ' ++ replicate (2 + 4 * 6) '-' , centre width $ left 11 "TOTALS" ++ showStats tStats ] gameStatsReport :: Int -> ProgState -> [String] gameStatsReport width s = fromMaybe [] $ do pStats <- mapM (\(pid, stats) -> do p <- nth pid $ s^.database.dbPlayers Just (p, stats)) (M.toList $ s^.progMode.gameStateL.gamePlayerStats) let nameWidth = succ $ maximum $ 10 : map (length . (^.pName) . fst) pStats tStats = foldr (addPlayerStats . snd) newPlayerStats pStats Just $ [ centre width "GAME STATISTICS" , "" , centre width $ "NO. " ++ left nameWidth "PLAYER" ++ right 3 "G" ++ right 6 "A" ++ right 6 "P" ++ right 6 "PM" ] ++ map (\(p, stats) -> centre width $ right 2 (show $ p^.pNumber) ++ " " ++ left nameWidth (p^.pName) ++ right 3 (show $ stats^.psGoals) ++ right 6 (show $ stats^.psAssists) ++ right 6 (show $ psPoints stats) ++ right 6 (show $ stats^.psPMin)) pStats ++ [ centre width $ replicate (4 + nameWidth) ' ' ++ replicate (3 + 3 * 6) '-' , overlay "GAME TOTALS" ( centre width $ replicate (4 + nameWidth) ' ' ++ right 3 (show $ tStats^.psGoals) ++ right 6 (show $ tStats^.psAssists) ++ right 6 (show $ psPoints tStats) ++ right 6 (show $ tStats^.psPMin) ) ] gameDate :: GameState -> String gameDate gs = fromMaybe "" $ do year <- show <$> gs^.gameYear month <- month <$> gs^.gameMonth day <- padNum 2 <$> gs^.gameDay Just $ month ++ " " ++ day ++ " " ++ year showStats :: GameStats -> String showStats gs = right 2 (show $ gmsGames gs) ++ right 4 (show $ gs^.gmsWins) ++ right 4 (show $ gs^.gmsLosses) ++ right 4 (show $ gs^.gmsOvertime) ++ right 4 (show $ gs^.gmsGoalsFor) ++ right 4 (show $ gs^.gmsGoalsAgainst) ++ right 4 (show $ gmsPoints gs)