module FortyTwo.Renderers.Question (renderQuestion, renderMessage) where

import FortyTwo.Types (Message(..))
import System.Console.ANSI

-- | Print any message depending on its type
renderMessage :: Message -> String -> IO()
renderMessage :: Message -> String -> IO ()
renderMessage Message
messageType String
message
  | Message
messageType Message -> Message -> Bool
forall a. Eq a => a -> a -> Bool
== Message
Question = do
      [SGR] -> IO ()
setSGR [ConsoleLayer -> ColorIntensity -> Color -> SGR
SetColor ConsoleLayer
Foreground ColorIntensity
Dull Color
Green]
      String -> IO ()
putStr String
"? "
      [SGR] -> IO ()
setSGR [SGR
Reset]
      [SGR] -> IO ()
setSGR [ConsoleIntensity -> SGR
SetConsoleIntensity ConsoleIntensity
BoldIntensity]
      String -> IO ()
putStr String
text
      [SGR] -> IO ()
setSGR [SGR
Reset]
  | Message
messageType Message -> Message -> Bool
forall a. Eq a => a -> a -> Bool
== Message
Answer = do
      [SGR] -> IO ()
setSGR [ConsoleLayer -> ColorIntensity -> Color -> SGR
SetColor ConsoleLayer
Foreground ColorIntensity
Dull Color
Cyan]
      String -> IO ()
putStr (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
text
      [SGR] -> IO ()
setSGR [SGR
Reset]
  | Message
messageType Message -> Message -> Bool
forall a. Eq a => a -> a -> Bool
== Message
DefaultAnswer = do
    [SGR] -> IO ()
setSGR [ConsoleIntensity -> SGR
SetConsoleIntensity ConsoleIntensity
FaintIntensity]
    String -> IO ()
putStr (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
" (" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
text String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")"
    [SGR] -> IO ()
setSGR [SGR
Reset]
  | Bool
otherwise =
      String -> IO ()
putStr String
text
    where
      text :: String
text = ([String] -> String
unwords ([String] -> String) -> (String -> [String]) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines) String
message

-- | Print the question message
renderQuestion :: String -> String -> String -> IO ()
renderQuestion :: String -> String -> String -> IO ()
renderQuestion String
question String
defaultAnswer String
answer
  | Bool
hasDefaultAnswer Bool -> Bool -> Bool
&& Bool
hasAnswer = do
      Message -> String -> IO ()
renderMessage Message
Question String
question
      Message -> String -> IO ()
renderMessage Message
DefaultAnswer String
defaultAnswer
      Message -> String -> IO ()
renderMessage Message
Answer String
answer
  | Bool
hasDefaultAnswer = do
      Message -> String -> IO ()
renderMessage Message
Question String
question
      Message -> String -> IO ()
renderMessage Message
DefaultAnswer String
defaultAnswer
  | Bool
hasAnswer = do
      Message -> String -> IO ()
renderMessage Message
Question String
question
      Message -> String -> IO ()
renderMessage Message
Answer String
answer
  | Bool
otherwise = Message -> String -> IO ()
renderMessage Message
Question String
question
  where
      hasDefaultAnswer :: Bool
hasDefaultAnswer = Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
defaultAnswer
      hasAnswer :: Bool
hasAnswer = Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
answer