module Data.TTask.Pretty.Status
  ( ppProjectSprintLog 
  ) where
import Control.Applicative
import Data.List
import Data.Time
import Data.TTask.Types
import Data.TTask.Analysis 
import Data.TTask.Pretty.Contents

ppProjectSprintLog :: Id -> Project -> Maybe String
ppProjectSprintLog i pj = ppDailySprintLog <$> getSprintById pj i

ppDailySprintLog :: Sprint -> String
ppDailySprintLog s = 
  let 
    sx = getSprintLastStatuses s
    cond f r = (f $ stRecToStatus r) && (isTask $ stRecToContents r)
    summary f = show (summaryPointBy (cond f) sx)
  in concat
      [ ppSprintHeaderDetail s
      , "\n\n" 
      , intercalate "\n" . map ppDailyStatuses . dailyGroup $ getSprintStatuses s
      , "\n\n" 
      , "Wait : " ++ summary stWait ++ "pt\n"
      , "Running : " ++ summary stRunning ++ "pt\n"
      , "Finished : " ++ summary stFinished ++ "pt\n"
      , "Not Achieved : " ++ summary stNotAchieved ++ "pt\n"
      , "Rejected : " ++ summary stRejected ++ "pt"
      ]

----

ppDailyStatuses :: DailyStatuses -> String
ppDailyStatuses d = concat
  [ show (dayStDay d), " : Total Finished point = ", show (dayStPoint d), "\n"
  , intercalate "\n" . map (("    "++) . ppStatusLog) $ dayStStatuses d
  ]

ppStatusLog :: StatusLogRec -> String
ppStatusLog s = case stRecToContents s of
  TTaskProject v -> 
    fmtStatusRec "PROJECT" 0 (calcProjectPoint v) s (projectName v)
  TTaskSprint  v -> 
    fmtStatusRec "SPRINT" (sprintId v) (calcSprintPoint v) s (sprintDescription v)
  TTaskStory   v -> 
    fmtStatusRec "STORY" (storyId v) (calcStoryPoint v) s (storyDescription v)
  TTaskTask    v -> 
    fmtStatusRec "TASK" (taskId v) (taskPoint v) s (taskDescription v)

fmtStatusRec 
  :: String -> Id -> Point -> StatusLogRec -> String -> String
fmtStatusRec s i p r d = concat
  [ "[", s, " ", show p, "pt ", stAndLt, "] ", show i, " : ", d ]
    where
      stAndLt :: String
      stAndLt = concat 
        [ ppStatusRecord (stRecToStatus r)
        , " at ", show . localTimeOfDay . getStatusTime $ stRecToStatus r
        ]