{-# LANGUAGE OverloadedLists #-}

module Taskell.Events.Actions.Normal
    ( event
    , events
    ) where

import ClassyPrelude hiding (delete)

import Data.Char                         (isDigit)
import Graphics.Vty.Input.Events
import Taskell.Events.Actions.Types      as A (ActionType (..))
import Taskell.Events.State
import Taskell.Events.State.Modal.Detail (editDue, showDetail)
import Taskell.Events.State.Modal.Due    (showDue)
import Taskell.Events.State.Types        (Stateful)
import Taskell.IO.Keyboard.Types         (Actions)

events :: Actions
events :: Actions
events
    -- general
 =
    [ (ActionType
A.Quit, Stateful
quit)
    , (ActionType
A.Undo, (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
undo)
    , (ActionType
A.Redo, (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
redo)
    , (ActionType
A.Search, Stateful
searchMode)
    , (ActionType
A.Help, Stateful
showHelp)
    , (ActionType
A.Due, Stateful
showDue)
        -- navigation
    , (ActionType
A.Previous, Stateful
previous)
    , (ActionType
A.Next, Stateful
next)
    , (ActionType
A.Left, Stateful
left)
    , (ActionType
A.Right, Stateful
right)
    , (ActionType
A.Bottom, Stateful
bottom)
    , (ActionType
A.Top, Stateful
top)
    -- new tasks
    , (ActionType
A.New, (Stateful
startCreate Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
newItem Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.NewAbove, (Stateful
startCreate Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
above Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.NewBelow, (Stateful
startCreate Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
below Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.Duplicate, (Stateful
next Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
duplicate Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    -- editing tasks
    , (ActionType
A.Edit, (Stateful
startEdit Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.Clear, (Stateful
startEdit Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
clearItem Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.Delete, (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
delete Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.Detail, Stateful
showDetail)
    , (ActionType
A.DueDate, (Stateful
editDue Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
store Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
showDetail)
    , (ActionType
A.ClearDate, (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
clearDate Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    -- moving tasks
    , (ActionType
A.MoveUp, (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
up Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.MoveDown, (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
down Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.MoveLeftTop, (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
top Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
left Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
moveLeftTop Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.MoveRightTop, (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
top Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
right Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
moveRightTop Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.MoveLeftBottom, (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
bottom Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
left Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
moveLeftBottom Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.MoveRightBottom, (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
bottom Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
right Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
moveRightBottom Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.Complete, (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
moveToLast Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
clearDate Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.MoveMenu, Stateful
showMoveTo)
    -- lists
    , (ActionType
A.ListNew, (Stateful
createListStart Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.ListEdit, (Stateful
editListStart Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.ListDelete, (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
deleteCurrentList Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.ListRight, (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
listRight Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    , (ActionType
A.ListLeft, (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
listLeft Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Stateful -> Stateful
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Stateful
store)
    ]

-- Normal
event :: Event -> Stateful
-- selecting lists
event :: Event -> Stateful
event (EvKey (KChar Char
n) [Modifier]
_)
    | Char -> Bool
isDigit Char
n = Char -> Stateful
selectList Char
n
    | Bool
otherwise = Stateful
forall (f :: * -> *) a. Applicative f => a -> f a
pure
event (EvKey Key
KEsc [Modifier]
_) = Stateful
clearSearch
-- fallback
event Event
_ = Stateful
forall (f :: * -> *) a. Applicative f => a -> f a
pure