{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE RecordWildCards #-}

module Text.Time.Pretty.Render
  ( renderDaysAgoAuto
  , renderTimeAgoAuto
  ) where

import Text.Time.Pretty.TimeAgo

renderDaysAgoAuto :: DaysAgo -> String
renderDaysAgoAuto DaysAgo {..} =
  case daysAgoSign of
    GT ->
      if | daysAgoYears > 0 -> unwords [plural daysAgoYears "year" "years", "ago"]
         | daysAgoMonths > 0 -> unwords [plural daysAgoMonths "month" "months", "ago"]
         | daysAgoWeeks > 0 -> unwords [plural daysAgoWeeks "week" "weeks", "ago"]
         | daysAgoDays == 1 -> "yesterday"
         | daysAgoDays > 0 -> unwords [plural daysAgoDays "day" "days", "ago"]
         | otherwise -> "today"
    EQ -> "today"
    LT ->
      if | daysAgoYears > 0 -> unwords ["in", plural daysAgoYears "year" "years"]
         | daysAgoMonths > 0 -> unwords ["in", plural daysAgoMonths "month" "months"]
         | daysAgoWeeks > 0 -> unwords ["in", plural daysAgoWeeks "week" "weeks"]
         | daysAgoDays == 1 -> "tomorrow"
         | daysAgoDays > 0 -> unwords ["in", plural daysAgoDays "day" "days"]
         | otherwise -> "today"

renderTimeAgoAuto :: TimeAgo -> String
renderTimeAgoAuto TimeAgo {..} =
  case timeAgoSign of
    GT ->
      if | daysAgoToDays timeAgoDaysAgo == 1 -> "1 day ago"
         | daysAgoToDays timeAgoDaysAgo > 0 ->
           renderDaysAgoAuto (timeAgoDaysAgo {daysAgoSign = timeAgoSign})
         | timeAgoHours > 0 -> unwords [plural timeAgoHours "hour" "hours", "ago"]
         | timeAgoMinutes > 0 -> unwords [plural timeAgoMinutes "minute" "minutes", "ago"]
         | timeAgoSeconds > 0 -> unwords [plural timeAgoSeconds "second" "seconds", "ago"]
         | otherwise -> "just now"
    EQ -> "just now"
    LT ->
      if | daysAgoToDays timeAgoDaysAgo == 1 -> "in 1 day"
         | daysAgoToDays timeAgoDaysAgo > 0 ->
           renderDaysAgoAuto (timeAgoDaysAgo {daysAgoSign = timeAgoSign})
         | timeAgoHours > 0 -> unwords ["in", plural timeAgoHours "hour" "hours"]
         | timeAgoMinutes > 0 -> unwords ["in", plural timeAgoMinutes "minute" "minutes"]
         | timeAgoSeconds > 0 -> unwords ["in", plural timeAgoSeconds "second" "seconds"]
         | otherwise -> "just now"

plural :: (Show a, Integral a) => a -> String -> String -> String
plural 1 sing _ = "1 " ++ sing
plural n _ plur = show n ++ " " ++ plur