{-# LANGUAGE TypeFamilies #-}

module Development.Iridium.UI.Prompt
  ( askConfirmationOrMZero
  , promptYesOrNo
  , promptSpecific
  )
where



import qualified Data.Text     as Text
import qualified Turtle        as Turtle
import qualified Control.Foldl as Foldl

import           Data.Text ( Text )
import           Control.Monad.Trans.Maybe
import           Control.Monad.Trans.Class
import           Control.Monad.IO.Class
import           Control.Monad

import           Development.Iridium.Types
import           Development.Iridium.UI.Console
import           Development.Iridium.Config

import           Control.Monad.Trans.MultiRWS

import           System.Process
import           System.IO ( hFlush, stdout )
import           Control.Concurrent ( threadDelay )



askConfirmationOrMZero
  :: ( MonadIO m
     , MonadPlus m
     , MonadMultiState LogState m
     )
  => m ()
askConfirmationOrMZero = do
  liftIO $ putStr "> Abort imminent; enter 'i' to overwrite and continue> "
  liftIO $ hFlush stdout
  s <- liftIO $ getLine
  case s of
    "i" -> do
      pushLog LogLevelPrint "  (Remember that you can disable individual tests in iridium.yaml)"
      liftIO $ threadDelay 1000000
      return ()
    _   -> mzero

promptYesOrNo
  :: (MonadIO m, MonadPlus m)
  => String
  -> m ()
promptYesOrNo p = do
  liftIO $ putStr $ "> " ++ p ++ "> "
  liftIO $ hFlush stdout
  s <- liftIO $ getLine
  case s of
    "y" -> do
      return ()
    "n" -> mzero
    _   -> promptYesOrNo p

promptSpecific
  :: (MonadIO m, MonadPlus m)
  => String
  -> String
  -> m ()
promptSpecific p cont = do
  liftIO $ putStr $ "> " ++ p ++ "> "
  liftIO $ hFlush stdout
  s <- liftIO $ getLine
  if s == cont then return () else mzero