module Glue where
import Brick
import Control.Monad (when)
import Control.Monad.State.Lazy
import States
import StateManagement
import qualified Graphics.Vty     as V
import qualified UI.MainMenu      as MM
import qualified UI.Settings      as S
import qualified UI.Info          as I
import qualified UI.CardSelector  as CS
import qualified UI.FileBrowser   as FB
import qualified UI.Cards         as C
import qualified UI.Parameter     as P

globalApp :: App GlobalState Event Name
globalApp :: App GlobalState Event Name
globalApp = App
  { appDraw :: GlobalState -> [Widget Name]
appDraw = GlobalState -> [Widget Name]
drawUI
  , appChooseCursor :: GlobalState -> [CursorLocation Name] -> Maybe (CursorLocation Name)
appChooseCursor = forall s n. s -> [CursorLocation n] -> Maybe (CursorLocation n)
showFirstCursor
  , appHandleEvent :: BrickEvent Name Event -> EventM Name GlobalState Event
appHandleEvent = BrickEvent Name Event -> EventM Name GlobalState Event
handleEvent
  , appStartEvent :: EventM Name GlobalState Event
appStartEvent = forall {n} {s}. EventM n s Event
enableMouse
  , appAttrMap :: GlobalState -> AttrMap
appAttrMap = GlobalState -> AttrMap
handleAttrMap
  }

enableMouse :: EventM n s Event
enableMouse = do
  Vty
vty <- forall n s. EventM n s Vty
getVtyHandle
  let output :: Output
output = Vty -> Output
V.outputIface Vty
vty
  forall (f :: * -> *). Applicative f => Bool -> f Event -> f Event
when (Output -> Mode -> Bool
V.supportsMode Output
output Mode
V.Mouse) forall a b. (a -> b) -> a -> b
$
      forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ Output -> Mode -> Bool -> IO Event
V.setMode Output
output Mode
V.Mouse Bool
True

drawUI :: GlobalState -> [Widget Name]
drawUI :: GlobalState -> [Widget Name]
drawUI GlobalState
gs = case forall s a. State s a -> s -> a
evalState forall (m :: * -> *). MonadState GlobalState m => m State
getState GlobalState
gs of
  MainMenuState     MMS
s -> MMS -> [Widget Name]
MM.drawUI MMS
s
  SettingsState     SS
s ->  SS -> [Widget Name]
S.drawUI SS
s
  InfoState         Event
s ->  Event -> [Widget Name]
I.drawUI Event
s
  CardSelectorState CSS
s -> GlobalState -> CSS -> [Widget Name]
CS.drawUI GlobalState
gs CSS
s
  FileBrowserState  FBS
s -> FBS -> [Widget Name]
FB.drawUI FBS
s
  CardsState        CS
s ->  CS -> [Widget Name]
C.drawUI CS
s
  ParameterState    PS
s ->  PS -> [Widget Name]
P.drawUI PS
s

handleEvent :: BrickEvent Name Event -> EventM Name GlobalState ()
handleEvent :: BrickEvent Name Event -> EventM Name GlobalState Event
handleEvent BrickEvent Name Event
ev = do
  if BrickEvent Name Event
ev forall a. Eq a => a -> a -> Bool
== forall n e. Event -> BrickEvent n e
VtyEvent (Key -> [Modifier] -> Event
V.EvKey (Char -> Key
V.KChar Char
'c') [Modifier
V.MCtrl]) then forall {n} {s}. EventM n s Event
halt else do
    State
s <- forall (m :: * -> *). MonadState GlobalState m => m State
getState
    case State
s of
      MainMenuState     MMS
s -> BrickEvent Name Event -> EventM Name GlobalState Event
MM.handleEvent BrickEvent Name Event
ev
      SettingsState     SS
s ->  BrickEvent Name Event -> EventM Name GlobalState Event
S.handleEvent BrickEvent Name Event
ev
      InfoState         Event
s ->  BrickEvent Name Event -> EventM Name GlobalState Event
I.handleEvent BrickEvent Name Event
ev
      CardSelectorState CSS
s -> BrickEvent Name Event -> EventM Name GlobalState Event
CS.handleEvent BrickEvent Name Event
ev
      FileBrowserState  FBS
s -> BrickEvent Name Event -> EventM Name GlobalState Event
FB.handleEvent BrickEvent Name Event
ev
      CardsState        CS
s ->  BrickEvent Name Event -> EventM Name GlobalState Event
C.handleEvent BrickEvent Name Event
ev
      ParameterState    PS
s ->  BrickEvent Name Event -> EventM Name GlobalState Event
P.handleEvent BrickEvent Name Event
ev

handleAttrMap :: GlobalState -> AttrMap
handleAttrMap :: GlobalState -> AttrMap
handleAttrMap GlobalState
gs = case forall s a. State s a -> s -> a
evalState forall (m :: * -> *). MonadState GlobalState m => m State
getState GlobalState
gs of
  MainMenuState     MMS
_ -> AttrMap
MM.theMap
  SettingsState     SS
_ ->  AttrMap
S.theMap
  InfoState         Event
_ ->  AttrMap
I.theMap
  CardSelectorState CSS
_ -> AttrMap
CS.theMap
  FileBrowserState  FBS
_ -> AttrMap
FB.theMap
  CardsState        CS
_ ->  AttrMap
C.theMap
  ParameterState    PS
_ ->  AttrMap
P.theMap