module Ansi where

progress :: Double -> Int -> String
progress percent size =
  makeInverse
    ((primary palette) ++
     (replicate sizeCompleted ' ') ++
     (secondary palette) ++ (replicate sizeRemaining ' '))
  where
    size' = fromIntegral size :: Double
    sizeCompleted = round $ size' * percent / 100
    sizeRemaining = size - sizeCompleted

reset :: String
reset = "\x1B[0m"

bold :: String
bold = "\x1B[1m"

faint :: String
faint = "\x1B[2m"

italic :: String
italic = "\x1B[3m"

underline :: String
underline = "\x1B[4m"

inverse :: String
inverse = "\x1B[7m"

crossed :: String
crossed = "\x1B[9m"

resetBold :: String
resetBold = "\x1B[22m"

resetItalic :: String
resetItalic = "\x1B[23m"

resetUnderline :: String
resetUnderline = "\x1B[24m"

red :: String
red = "\x1B[31m"

green :: String
green = "\x1B[32m"

grey :: String
grey = "\x1B[2;37m"

data Palette = Palette
  { primary :: String
  , secondary :: String
  , ternary :: String
  , success :: String
  , warning :: String
  } deriving (Show)

palette :: Palette
palette =
  Palette
    "\x1B[38;5;97m"
    "\x1B[38;5;74m"
    "\x1B[38;5;178m"
    "\x1B[38;5;72m"
    "\x1B[38;5;167m"

makeBold :: String -> String
makeBold s = bold ++ s ++ reset

makeItalic :: String -> String
makeItalic s = italic ++ s ++ reset

makeFaint :: String -> String
makeFaint s = faint ++ s ++ reset

makeUnderline :: String -> String
makeUnderline s = underline ++ s ++ reset

makeInverse :: String -> String
makeInverse s = inverse ++ s ++ reset

makeCrossed :: String -> String
makeCrossed s = crossed ++ s ++ reset

paint :: (Palette -> String) -> String -> String
paint f s = (f palette) ++ s ++ reset