{-# LANGUAGE OverloadedLists #-}

module Taskell.Events.Actions.Modal.Detail
    ( event
    , events
    ) where

import ClassyPrelude

import           Graphics.Vty.Input.Events
import           Taskell.Events.Actions.Types      as A (ActionType (..))
import           Taskell.Events.State              (clearDate, normalMode, quit, store, undo, write)
import           Taskell.Events.State.Modal.Detail as Detail
import           Taskell.Events.State.Types
import           Taskell.Events.State.Types.Mode   (DetailItem (..), DetailMode (..))
import           Taskell.IO.Keyboard.Types         (Actions)
import qualified Taskell.UI.Draw.Field             as F (event)

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.Previous, Stateful
previousSubtask)
    , (ActionType
A.Next, Stateful
nextSubtask)
    , (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.New, (Stateful
Detail.insertMode 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
Detail.lastSubtask 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
Detail.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.Edit, (Stateful
Detail.insertMode 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
setComplete 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
Detail.remove 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.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)
    , (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)
    , (ActionType
A.Detail, (Stateful
editDescription 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 -> Stateful
normal :: Event -> Stateful
normal (EvKey Key
KEsc [Modifier]
_) = Stateful
normalMode
normal Event
_              = Stateful
forall (f :: * -> *) a. Applicative f => a -> f a
pure

insert :: Event -> Stateful
insert :: Event -> Stateful
insert (EvKey Key
KEsc [Modifier]
_) State
s = do
    DetailItem
item <- State -> Maybe DetailItem
getCurrentItem State
s
    case DetailItem
item of
        DetailItem
DetailDescription -> (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Maybe State -> Maybe State
forall a b. (a -> b) -> a -> b
$ Stateful
finishDescription State
s
        DetailItem
DetailDate        -> Stateful
showDetail State
s
        (DetailItem Int
_)    -> (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State)
-> (Maybe State -> Maybe State) -> Maybe State -> Maybe State
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
showDetail Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Maybe State -> Maybe State
forall a b. (a -> b) -> a -> b
$ Stateful
finishSubtask State
s
insert (EvKey Key
KEnter [Modifier]
_) State
s = do
    DetailItem
item <- State -> Maybe DetailItem
getCurrentItem State
s
    case DetailItem
item of
        DetailItem
DetailDescription -> (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Maybe State -> Maybe State
forall a b. (a -> b) -> a -> b
$ Stateful
finishDescription State
s
        DetailItem
DetailDate -> (Stateful
write Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State) -> Maybe State -> Maybe State
forall a b. (a -> b) -> a -> b
$ Stateful
finishDue State
s
        (DetailItem Int
_) ->
            (Stateful
Detail.lastSubtask Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State)
-> (Maybe State -> Maybe State) -> Maybe State -> Maybe State
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Stateful
Detail.newItem Stateful -> Maybe State -> Maybe State
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe State -> Maybe State)
-> (Maybe State -> Maybe State) -> Maybe State -> Maybe State
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)
-> (Maybe State -> Maybe State) -> Maybe State -> Maybe State
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) -> Maybe State -> Maybe State
forall a b. (a -> b) -> a -> b
$
            Stateful
finishSubtask State
s
insert Event
e State
s = (Field -> Field) -> Stateful
updateField (Event -> Field -> Field
F.event Event
e) State
s

event :: Event -> Stateful
event :: Event -> Stateful
event Event
e State
s = do
    DetailMode
m <- State -> Maybe DetailMode
getCurrentMode State
s
    case DetailMode
m of
        DetailMode
DetailNormal     -> Event -> Stateful
normal Event
e State
s
        (DetailInsert Field
_) -> Event -> Stateful
insert Event
e State
s