module Console where

import           Data.Time
import           Formatting
import           Formatting.Clock
import           Protolude
import           System.Clock
import           System.Console.ANSI
import qualified System.IO as IO

printFileChanged :: FilePath -> IO ()
printFileChanged file = do
  putStr "\nFile "
  printCommand $ toS file
  putStr " changed.\n"
  IO.hFlush stdout

printStartingRunTask :: Text -> IO ()
printStartingRunTask = printCommandAndDescription $ toS "Starting"

printRunningTask :: Text -> IO ()
printRunningTask = printCommandAndDescription $ toS "Runnning"

printTerminatingRunTask :: Text -> IO ()
printTerminatingRunTask = printCommandAndDescription $ toS "Terminating"

printTaskFinished :: ExitCode -> IO ()
printTaskFinished exitCode = do
  printExitCode exitCode
  IO.hFlush stdout

printCompleted :: TimeSpec -> TimeSpec -> IO ()
printCompleted start end = do
  currentTime <- getCurrentTime
  let duration = format timeSpecs start end
  setSGR [SetColor Foreground Vivid Cyan]
  putStr $ "\nCompleted in " <> toS duration <> " at " <> show currentTime
  setSGR [Reset]
  putStrLn " - Waiting..."

printTerminated :: Text -> ExitCode -> IO ()
printTerminated command exitCode = do
  putStr "Terminated "
  printCommand command
  putStr "\n"
  printExitCode exitCode
  setSGR [Reset]
  IO.hFlush stdout

printAlreadyTerminated :: Text -> ExitCode -> IO ()
printAlreadyTerminated command exitCode = do
  printCommand command
  putStr " had already terminated.\n"
  printExitCode exitCode
  IO.hFlush stdout

printExitCode :: ExitCode -> IO ()
printExitCode ExitSuccess = do
  setSGR [SetColor Foreground Vivid Green]
  putStrLn "[SUCCESS]"
  setSGR [Reset]
printExitCode (ExitFailure intCode) = do
  setSGR [SetColor Foreground Vivid Red]
  putStrLn $ "[FAILED " <> show intCode <> "]"
  setSGR [Reset]

printCommandAndDescription :: Text -> Text -> IO ()
printCommandAndDescription description command = do
  setSGR [SetUnderlining SingleUnderline]
  putStr $ "\n" <> toS description <> " "
  printCommand command
  putStr "\n"
  setSGR [Reset]
  IO.hFlush stdout

printCommand :: Text -> IO ()
printCommand command = do
  setSGR [SetColor Foreground Vivid White]
  putStr "\""
  putStr command
  putStr "\""
  setSGR [Reset]