import Data.Char (isDigit, digitToInt)
import System.IO

prompt :: String
prompt = "How many do you take? 1, 2 or 3? "

getPlayerSelection :: IO Int
getPlayerSelection = do 
  hSetBuffering stdin NoBuffering
  c <- getChar
  putChar '\n'
  if isDigit c && digitToInt c <= 3 then 
    pure (digitToInt c)
  else do
    putStrLn "Invalid input"
    putStr prompt
    getPlayerSelection

play :: Int -> IO ()
play n = do
  putStrLn $ show n ++ token n ++ " remain."
  if n == 0 then putStrLn "Computer Wins!" 
  else do
    putStr prompt
    playerSelection <- getPlayerSelection
    let computerSelection
          | playerSelection > 4 = playerSelection - 4
          | otherwise = 4 - playerSelection
    putStrLn $ "Computer takes " ++ show computerSelection ++ token computerSelection ++ ".\n"
    play (n - computerSelection - playerSelection)
  where token 1 = " token"
        token _ = " tokens"

main :: IO ()
main = play 12