module UI.Parameter (drawUI, theMap, handleEvent) where

import UI.Attributes
import Brick
import Brick.Focus
import Brick.Forms
import Brick.Widgets.Border
import Brick.Widgets.Border.Style
import Brick.Widgets.Center
import Control.Monad (when)
import Control.Monad.IO.Class
import Lens.Micro.Platform
import States
import StateManagement
import Runners
import qualified Graphics.Vty as V

drawUI :: PS -> [Widget Name]
drawUI :: PS -> [Widget Name]
drawUI = (Widget Name -> [Widget Name] -> [Widget Name]
forall a. a -> [a] -> [a]
:[]) (Widget Name -> [Widget Name])
-> (PS -> Widget Name) -> PS -> [Widget Name]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PS -> Widget Name
ui

ui :: PS -> Widget Name
ui :: PS -> Widget Name
ui PS
s =
  Widget Name -> Widget Name
forall n. Widget n -> Widget n
joinBorders (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
  Widget Name -> Widget Name
forall n. Widget n -> Widget n
center (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
  BorderStyle -> Widget Name -> Widget Name
forall n. BorderStyle -> Widget n -> Widget n
withBorderStyle BorderStyle
unicodeRounded (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
  Widget Name -> Widget Name
forall n. Widget n -> Widget n
border (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
  Int -> Widget Name -> Widget Name
forall n. Int -> Widget n -> Widget n
hLimitPercent Int
60 (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
  Int -> Widget Name -> Widget Name
forall n. Int -> Widget n -> Widget n
hLimit Int
40 (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
  Widget Name -> Widget Name
forall n. Widget n -> Widget n
hCenter (AttrName -> Widget Name -> Widget Name
forall n. AttrName -> Widget n -> Widget n
withAttr AttrName
titleAttr (FilePath -> Widget Name
forall n. FilePath -> Widget n
str FilePath
"Select parameters")) Widget Name -> Widget Name -> Widget Name
forall n. Widget n -> Widget n -> Widget n
<=>
  Widget Name
forall n. Widget n
hBorder Widget Name -> Widget Name -> Widget Name
forall n. Widget n -> Widget n -> Widget n
<=>
  Int -> Widget Name -> Widget Name
forall n. Int -> Widget n -> Widget n
padLeftRight Int
1
  (Form Parameters Event Name -> Widget Name
forall n s e. Eq n => Form s e n -> Widget n
renderForm (PS
s PS
-> Getting
     (Form Parameters Event Name) PS (Form Parameters Event Name)
-> Form Parameters Event Name
forall s a. s -> Getting a s a -> a
^. Getting
  (Form Parameters Event Name) PS (Form Parameters Event Name)
Lens' PS (Form Parameters Event Name)
psForm))

handleEvent :: BrickEvent Name Event -> EventM Name GlobalState ()
handleEvent :: BrickEvent Name Event -> EventM Name GlobalState Event
handleEvent ev :: BrickEvent Name Event
ev@(VtyEvent Event
e) = do
  PS
s <- Getting PS GlobalState PS -> EventM Name GlobalState PS
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting PS GlobalState PS
Lens' GlobalState PS
ps
  let form :: Form Parameters Event Name
form = PS
s PS
-> Getting
     (Form Parameters Event Name) PS (Form Parameters Event Name)
-> Form Parameters Event Name
forall s a. s -> Getting a s a -> a
^. Getting
  (Form Parameters Event Name) PS (Form Parameters Event Name)
Lens' PS (Form Parameters Event Name)
psForm
      focus :: FocusRing Name
focus = Form Parameters Event Name -> FocusRing Name
forall s e n. Form s e n -> FocusRing n
formFocus Form Parameters Event Name
form
      (Just Name
n) = FocusRing Name -> Maybe Name
forall n. FocusRing n -> Maybe n
focusGetCurrent FocusRing Name
focus
      down :: EventM Name GlobalState Event
down = LensLike' (Zoomed (EventM Name PS) Event) GlobalState PS
-> EventM Name PS Event -> EventM Name GlobalState Event
forall c.
LensLike' (Zoomed (EventM Name PS) c) GlobalState PS
-> EventM Name PS c -> EventM Name GlobalState c
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike' (Zoomed (EventM Name PS) Event) GlobalState PS
Lens' GlobalState PS
ps (EventM Name PS Event -> EventM Name GlobalState Event)
-> EventM Name PS Event -> EventM Name GlobalState Event
forall a b. (a -> b) -> a -> b
$ case Name
n of
        Name
ParametersOkField -> Event -> EventM Name PS Event
forall a. a -> EventM Name PS a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
        Name
ChunkField1 -> (Form Parameters Event Name
 -> Identity (Form Parameters Event Name))
-> PS -> Identity PS
Lens' PS (Form Parameters Event Name)
psForm ((Form Parameters Event Name
  -> Identity (Form Parameters Event Name))
 -> PS -> Identity PS)
-> Form Parameters Event Name -> EventM Name PS Event
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= Form Parameters Event Name
form { formFocus = focusNext (focusNext focus) }
        Name
_ -> (Form Parameters Event Name
 -> Identity (Form Parameters Event Name))
-> PS -> Identity PS
Lens' PS (Form Parameters Event Name)
psForm ((Form Parameters Event Name
  -> Identity (Form Parameters Event Name))
 -> PS -> Identity PS)
-> Form Parameters Event Name -> EventM Name PS Event
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= Form Parameters Event Name
form { formFocus = focusNext focus }
      up :: EventM Name GlobalState Event
up = LensLike' (Zoomed (EventM Name PS) Event) GlobalState PS
-> EventM Name PS Event -> EventM Name GlobalState Event
forall c.
LensLike' (Zoomed (EventM Name PS) c) GlobalState PS
-> EventM Name PS c -> EventM Name GlobalState c
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike' (Zoomed (EventM Name PS) Event) GlobalState PS
Lens' GlobalState PS
ps (EventM Name PS Event -> EventM Name GlobalState Event)
-> EventM Name PS Event -> EventM Name GlobalState Event
forall a b. (a -> b) -> a -> b
$ case Name
n of
        Name
ChunkField1 -> Event -> EventM Name PS Event
forall a. a -> EventM Name PS a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
        Name
ChunkField2 -> Event -> EventM Name PS Event
forall a. a -> EventM Name PS a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
        Name
SubsetField -> (Form Parameters Event Name
 -> Identity (Form Parameters Event Name))
-> PS -> Identity PS
Lens' PS (Form Parameters Event Name)
psForm ((Form Parameters Event Name
  -> Identity (Form Parameters Event Name))
 -> PS -> Identity PS)
-> Form Parameters Event Name -> EventM Name PS Event
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= Form Parameters Event Name
form { formFocus = focusPrev (focusPrev focus) }
        Name
_           -> (Form Parameters Event Name
 -> Identity (Form Parameters Event Name))
-> PS -> Identity PS
Lens' PS (Form Parameters Event Name)
psForm ((Form Parameters Event Name
  -> Identity (Form Parameters Event Name))
 -> PS -> Identity PS)
-> Form Parameters Event Name -> EventM Name PS Event
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= Form Parameters Event Name
form { formFocus = focusPrev focus }
      right :: EventM Name GlobalState Event
right = LensLike' (Zoomed (EventM Name PS) Event) GlobalState PS
-> EventM Name PS Event -> EventM Name GlobalState Event
forall c.
LensLike' (Zoomed (EventM Name PS) c) GlobalState PS
-> EventM Name PS c -> EventM Name GlobalState c
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike' (Zoomed (EventM Name PS) Event) GlobalState PS
Lens' GlobalState PS
ps (EventM Name PS Event -> EventM Name GlobalState Event)
-> EventM Name PS Event -> EventM Name GlobalState Event
forall a b. (a -> b) -> a -> b
$ case Name
n of
        Name
ChunkField1 -> (Form Parameters Event Name
 -> Identity (Form Parameters Event Name))
-> PS -> Identity PS
Lens' PS (Form Parameters Event Name)
psForm ((Form Parameters Event Name
  -> Identity (Form Parameters Event Name))
 -> PS -> Identity PS)
-> Form Parameters Event Name -> EventM Name PS Event
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= Form Parameters Event Name
form { formFocus = focusNext focus }
        Name
_ -> Event -> EventM Name PS Event
forall a. a -> EventM Name PS a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
      left :: EventM Name GlobalState Event
left = LensLike' (Zoomed (EventM Name PS) Event) GlobalState PS
-> EventM Name PS Event -> EventM Name GlobalState Event
forall c.
LensLike' (Zoomed (EventM Name PS) c) GlobalState PS
-> EventM Name PS c -> EventM Name GlobalState c
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike' (Zoomed (EventM Name PS) Event) GlobalState PS
Lens' GlobalState PS
ps (EventM Name PS Event -> EventM Name GlobalState Event)
-> EventM Name PS Event -> EventM Name GlobalState Event
forall a b. (a -> b) -> a -> b
$ case Name
n of
        Name
ChunkField2 -> (Form Parameters Event Name
 -> Identity (Form Parameters Event Name))
-> PS -> Identity PS
Lens' PS (Form Parameters Event Name)
psForm ((Form Parameters Event Name
  -> Identity (Form Parameters Event Name))
 -> PS -> Identity PS)
-> Form Parameters Event Name -> EventM Name PS Event
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= Form Parameters Event Name
form { formFocus = focusPrev focus }
        Name
_ -> Event -> EventM Name PS Event
forall a. a -> EventM Name PS a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

  case Event
e of
      V.EvKey Key
V.KEsc []         -> EventM Name GlobalState Event
forall (m :: * -> *). MonadState GlobalState m => m Event
popState
      V.EvKey (V.KChar Char
'q') []  -> EventM Name GlobalState Event
forall (m :: * -> *). MonadState GlobalState m => m Event
popState
      V.EvKey Key
V.KDown []        -> EventM Name GlobalState Event
down
      V.EvKey (V.KChar Char
'j') []  -> EventM Name GlobalState Event
down
      V.EvKey Key
V.KUp []          -> EventM Name GlobalState Event
up
      V.EvKey (V.KChar Char
'k') []  -> EventM Name GlobalState Event
up
      V.EvKey (V.KChar Char
'\t') [] -> Event -> EventM Name GlobalState Event
forall a. a -> EventM Name GlobalState a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
      V.EvKey Key
V.KBackTab []     -> Event -> EventM Name GlobalState Event
forall a. a -> EventM Name GlobalState a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
      V.EvKey (V.KChar Char
'h') []  -> EventM Name GlobalState Event
left
      V.EvKey (V.KChar Char
'l') []  -> EventM Name GlobalState Event
right
    
      Event
_ -> case (Event
e, Name
n) of
          (V.EvKey Key
V.KRight [], Name
ChunkField2) -> Event -> EventM Name GlobalState Event
forall a. a -> EventM Name GlobalState a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
          (V.EvKey Key
V.KLeft [],  Name
ChunkField1) -> Event -> EventM Name GlobalState Event
forall a. a -> EventM Name GlobalState a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
          (V.EvKey Key
V.KRight [], Name
SubsetField) -> Event -> EventM Name GlobalState Event
forall a. a -> EventM Name GlobalState a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
          (V.EvKey Key
V.KLeft [],  Name
SubsetField) -> Event -> EventM Name GlobalState Event
forall a. a -> EventM Name GlobalState a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
          (Event, Name)
_ -> do LensLike'
  (Zoomed (EventM Name (Form Parameters Event Name)) Event)
  GlobalState
  (Form Parameters Event Name)
-> EventM Name (Form Parameters Event Name) Event
-> EventM Name GlobalState Event
forall c.
LensLike'
  (Zoomed (EventM Name (Form Parameters Event Name)) c)
  GlobalState
  (Form Parameters Event Name)
-> EventM Name (Form Parameters Event Name) c
-> EventM Name GlobalState c
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom ((PS -> Focusing (StateT (EventState Name) IO) Event PS)
-> GlobalState
-> Focusing (StateT (EventState Name) IO) Event GlobalState
Lens' GlobalState PS
ps((PS -> Focusing (StateT (EventState Name) IO) Event PS)
 -> GlobalState
 -> Focusing (StateT (EventState Name) IO) Event GlobalState)
-> ((Form Parameters Event Name
     -> Focusing
          (StateT (EventState Name) IO) Event (Form Parameters Event Name))
    -> PS -> Focusing (StateT (EventState Name) IO) Event PS)
-> (Form Parameters Event Name
    -> Focusing
         (StateT (EventState Name) IO) Event (Form Parameters Event Name))
-> GlobalState
-> Focusing (StateT (EventState Name) IO) Event GlobalState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Form Parameters Event Name
 -> Focusing
      (StateT (EventState Name) IO) Event (Form Parameters Event Name))
-> PS -> Focusing (StateT (EventState Name) IO) Event PS
Lens' PS (Form Parameters Event Name)
psForm) (EventM Name (Form Parameters Event Name) Event
 -> EventM Name GlobalState Event)
-> EventM Name (Form Parameters Event Name) Event
-> EventM Name GlobalState Event
forall a b. (a -> b) -> a -> b
$ BrickEvent Name Event
-> EventM Name (Form Parameters Event Name) Event
forall n e s. Eq n => BrickEvent n e -> EventM n (Form s e n) Event
handleFormEvent BrickEvent Name Event
ev
                  Form Parameters Event Name
f <- Getting
  (Form Parameters Event Name)
  GlobalState
  (Form Parameters Event Name)
-> EventM Name GlobalState (Form Parameters Event Name)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (Getting
   (Form Parameters Event Name)
   GlobalState
   (Form Parameters Event Name)
 -> EventM Name GlobalState (Form Parameters Event Name))
-> Getting
     (Form Parameters Event Name)
     GlobalState
     (Form Parameters Event Name)
-> EventM Name GlobalState (Form Parameters Event Name)
forall a b. (a -> b) -> a -> b
$ (PS -> Const (Form Parameters Event Name) PS)
-> GlobalState -> Const (Form Parameters Event Name) GlobalState
Lens' GlobalState PS
ps((PS -> Const (Form Parameters Event Name) PS)
 -> GlobalState -> Const (Form Parameters Event Name) GlobalState)
-> Getting
     (Form Parameters Event Name) PS (Form Parameters Event Name)
-> Getting
     (Form Parameters Event Name)
     GlobalState
     (Form Parameters Event Name)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Getting
  (Form Parameters Event Name) PS (Form Parameters Event Name)
Lens' PS (Form Parameters Event Name)
psForm
                  Bool
-> EventM Name GlobalState Event -> EventM Name GlobalState Event
forall (f :: * -> *). Applicative f => Bool -> f Event -> f Event
when (Form Parameters Event Name -> Parameters
forall s e n. Form s e n -> s
formState Form Parameters Event Name
f Parameters -> Getting Bool Parameters Bool -> Bool
forall s a. s -> Getting a s a -> a
^. Getting Bool Parameters Bool
Lens' Parameters Bool
pOk) (EventM Name GlobalState Event -> EventM Name GlobalState Event)
-> EventM Name GlobalState Event -> EventM Name GlobalState Event
forall a b. (a -> b) -> a -> b
$ do
                    (Parameters -> Identity Parameters)
-> GlobalState -> Identity GlobalState
Lens' GlobalState Parameters
parameters ((Parameters -> Identity Parameters)
 -> GlobalState -> Identity GlobalState)
-> Parameters -> EventM Name GlobalState Event
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= Form Parameters Event Name -> Parameters
forall s e n. Form s e n -> s
formState Form Parameters Event Name
f
                    (Parameters -> Identity Parameters)
-> GlobalState -> Identity GlobalState
Lens' GlobalState Parameters
parameters((Parameters -> Identity Parameters)
 -> GlobalState -> Identity GlobalState)
-> ((Bool -> Identity Bool) -> Parameters -> Identity Parameters)
-> (Bool -> Identity Bool)
-> GlobalState
-> Identity GlobalState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Bool -> Identity Bool) -> Parameters -> Identity Parameters
Lens' Parameters Bool
pOk ((Bool -> Identity Bool) -> GlobalState -> Identity GlobalState)
-> Bool -> EventM Name GlobalState Event
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= Bool
False
                    Parameters
paramsWithoutOk <- Getting Parameters GlobalState Parameters
-> EventM Name GlobalState Parameters
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting Parameters GlobalState Parameters
Lens' GlobalState Parameters
parameters
                    (PS -> Identity PS) -> GlobalState -> Identity GlobalState
Lens' GlobalState PS
ps((PS -> Identity PS) -> GlobalState -> Identity GlobalState)
-> ((Form Parameters Event Name
     -> Identity (Form Parameters Event Name))
    -> PS -> Identity PS)
-> (Form Parameters Event Name
    -> Identity (Form Parameters Event Name))
-> GlobalState
-> Identity GlobalState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Form Parameters Event Name
 -> Identity (Form Parameters Event Name))
-> PS -> Identity PS
Lens' PS (Form Parameters Event Name)
psForm ((Form Parameters Event Name
  -> Identity (Form Parameters Event Name))
 -> GlobalState -> Identity GlobalState)
-> Form Parameters Event Name -> EventM Name GlobalState Event
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= Parameters
-> Form Parameters Event Name -> Form Parameters Event Name
forall s e n. s -> Form s e n -> Form s e n
updateFormState Parameters
paramsWithoutOk Form Parameters Event Name
f
                    State
state <- FilePath -> [Card] -> EventM Name GlobalState State
forall (m :: * -> *).
(MonadState GlobalState m, MonadIO m) =>
FilePath -> [Card] -> m State
cardsWithOptionsStateM (PS
s PS -> Getting FilePath PS FilePath -> FilePath
forall s a. s -> Getting a s a -> a
^. Getting FilePath PS FilePath
Lens' PS FilePath
psFp) (PS
s PS -> Getting [Card] PS [Card] -> [Card]
forall s a. s -> Getting a s a -> a
^. Getting [Card] PS [Card]
Lens' PS [Card]
psCards)
                    State -> EventM Name GlobalState Event
forall (m :: * -> *). MonadState GlobalState m => State -> m Event
goToState State
state

handleEvent BrickEvent Name Event
_ = Event -> EventM Name GlobalState Event
forall a. a -> EventM Name GlobalState a
forall (m :: * -> *) a. Monad m => a -> m a
return ()