module Internal.Terminal (write, read, red, blue, green, magenta, yellow, cyan, lightBlue, black, white, reset, underline, italic, newline, indent, message, header, blank, paragraphs) where

import Basics
import qualified Data.Text
import List (List)
import qualified Text
import qualified Prelude as P

-- |
write :: Text.Text -> P.IO ()
write string =
  P.putStr (Data.Text.unpack string)

-- |
read :: P.IO Text.Text
read =
  P.getLine
    |> P.fmap Data.Text.pack

-- CHARACTERS

red :: Text.Text
red =
  "\x1b[31m"

blue :: Text.Text
blue =
  "\x1b[34m"

magenta :: Text.Text
magenta =
  "\x1b[35m"

green :: Text.Text
green =
  "\x1b[32m"

yellow :: Text.Text
yellow =
  "\x1b[33m"

cyan :: Text.Text
cyan =
  "\x1b[36m"

lightBlue :: Text.Text
lightBlue =
  "\x1b[94m"

black :: Text.Text
black =
  "\x1b[30m"

white :: Text.Text
white =
  "\x1b[37m"

reset :: Text.Text
reset =
  "\x1b[0m"

newline :: Text.Text
newline =
  "\n"

blank :: Text.Text
blank =
  newline ++ newline

underline :: Text.Text
underline =
  "\x1b[4m"

italic :: Text.Text
italic =
  "\x1b[3m"

indent :: Int -> Text.Text
indent number =
  Text.repeat number " "

-- MESSAGE

message :: Text.Text -> Text.Text -> Text.Text -> List Text.Text -> P.IO ()
message color title location content = do
  write (color ++ header title location ++ reset)
  write blank
  write (paragraphs content)
  write blank

header :: Text.Text -> Text.Text -> Text.Text
header title location =
  let number = 75 - Text.length title - Text.length location
      dashes = Text.repeat number "-"
   in "-- " ++ Text.toUpper title ++ " " ++ dashes ++ " " ++ location ++ " "

-- PARAGRAPHS

paragraphs :: List Text.Text -> Text.Text
paragraphs =
  Text.join blank