content: {-# LANGUAGE NoImplicitPrelude #-}
  {-# LANGUAGE OverloadedStrings #-}
  
  module Brok.IO.CLI where
  
  import ClassyPrelude
  
  import Brok.Types.Brok     (Brok, appConfig)
  import Brok.Types.Config   (noColor)
  import Data.Text.IO        (hPutStr, hPutStrLn)
  import System.Console.ANSI (Color (Blue, Green, Magenta, Red, Yellow), ColorIntensity (Dull),
                              ConsoleLayer (Foreground), SGR (Reset, SetColor), hClearLine,
                              hCursorUpLine, hSetSGR)
  
  setSGR :: Handle -> [SGR] -> Brok ()
  setSGR hndl settings = do
      colourize <- not . noColor <$> asks appConfig
      when colourize $ lift (hSetSGR hndl settings)
  
  blank :: Brok ()
  blank = putStrLn ""
  
  message :: Text -> Brok ()
  message msg = do
      setSGR stdout [SetColor Foreground Dull Blue]
      putStrLn msg
      setSGR stdout [Reset]
  
  mehssage :: Text -> Brok ()
  mehssage msg = do
      setSGR stdout [SetColor Foreground Dull Yellow]
      putStrLn msg
      setSGR stdout [Reset]
  
  header :: Text -> Brok ()
  header msg = do
      setSGR stdout [SetColor Foreground Dull Magenta]
      putStrLn $ "*** " <> msg <> " ***"
      setSGR stdout [Reset]
  
  successMessage :: Text -> Brok ()
  successMessage msg = do
      setSGR stdout [SetColor Foreground Dull Green]
      putStrLn msg
      setSGR stdout [Reset]
  
  errorMessage :: Text -> Brok ()
  errorMessage msg = do
      setSGR stderr [SetColor Foreground Dull Red]
      lift $ hPutStrLn stderr msg
      setSGR stderr [Reset]
  
  errors :: Text -> [Text] -> Brok ()
  errors _ [] = pure ()
  errors msg missing = do
      errorMessage msg
      lift $ hPutStrLn stderr ""
      errorMessage (unlines $ ("- " <>) <$> missing)
  
  split :: Handle -> Color -> Text -> Text -> Brok ()
  split hdl color left right = do
      setSGR hdl [SetColor Foreground Dull color]
      lift $ hPutStr hdl left
      setSGR hdl [Reset]
      lift $ hPutStr hdl $ ": " <> right
      lift $ hPutStrLn hdl ""
  
  splitErr :: Text -> Text -> Brok ()
  splitErr = split stderr Red
  
  splitOut :: Text -> Text -> Brok ()
  splitOut = split stdout Green
  
  splitMeh :: Text -> Text -> Brok ()
  splitMeh = split stdout Yellow
  
  replace :: Text -> Brok ()
  replace msg = do
      lift $ hCursorUpLine stdout 1
      lift $ hClearLine stdout
      putStrLn msg
  