module Rasa.Ext.Slate.Internal.Event (terminalEvents) where

import Rasa.Ext
import Rasa.Ext.Slate.Internal.State

import Control.Monad

import qualified Graphics.Vty as V

-- | Provides keypress events from the terminal, converted from Vty events.
terminalEvents :: App ()
terminalEvents = do
    v <- getVty
    asyncActionProvider $ getEvents v
      where
        getEvents v dispatch = forever $ V.nextEvent v >>= dispatch . dispatchKeypress . convertEvent

-- | Converts a 'V.Event' into a keypress if possible.
convertEvent :: V.Event -> Keypress
convertEvent (V.EvKey e mods) = convertKeypress e mods
convertEvent _ = KUnknown

-- | Converts a 'V.Event' into a keypress if possible.
convertKeypress :: V.Key -> [V.Modifier] -> Keypress
convertKeypress V.KEsc mods      = KEsc (fmap convertMod mods)
convertKeypress (V.KChar c) mods = Keypress c (fmap convertMod mods)
convertKeypress V.KBS mods       = KBS (fmap convertMod mods)
convertKeypress V.KEnter mods    = KEnter (fmap convertMod mods)
convertKeypress V.KLeft mods     = KLeft (fmap convertMod mods)
convertKeypress V.KRight mods    = KRight (fmap convertMod mods)
convertKeypress V.KUp mods       = KUp (fmap convertMod mods)
convertKeypress V.KDown mods     = KDown (fmap convertMod mods)
convertKeypress V.KPrtScr mods   = KPrtScr (fmap convertMod mods)
convertKeypress V.KHome mods     = KHome (fmap convertMod mods)
convertKeypress V.KPageUp mods   = KPageUp (fmap convertMod mods)
convertKeypress V.KDel mods      = KDel (fmap convertMod mods)
convertKeypress V.KEnd mods      = KEnd (fmap convertMod mods)
convertKeypress V.KPageDown mods = KPageDown (fmap convertMod mods)
convertKeypress _ _ = KUnknown

-- | Converts a 'V.Modifier' into a 'Mod'.
convertMod :: V.Modifier -> Mod
convertMod m = case m of
                 V.MShift -> Shift
                 V.MCtrl -> Ctrl
                 V.MMeta -> Meta
                 V.MAlt -> Alt