module Taskell.Events.Actions.Insert
    ( event
    ) where

import ClassyPrelude

import Control.Lens ((&), (.~), (^.))

import           Graphics.Vty.Input.Events       (Event (EvKey), Key (KEnter, KEsc))
import           Taskell.Events.State
import           Taskell.Events.State.Types
import           Taskell.Events.State.Types.Mode (InsertMode (..), InsertType (..), Mode (Insert))
import qualified Taskell.UI.Draw.Field           as F (event)

event :: Event -> Stateful
event :: Event -> Stateful
event (EvKey Key
KEnter [Modifier]
_) State
state =
    case State
state State -> Getting Mode State Mode -> Mode
forall s a. s -> Getting a s a -> a
^. Getting Mode State Mode
Lens' State Mode
mode of
        Insert InsertType
IList InsertMode
ICreate Field
_ ->
            (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
startCreate 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
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
forall a b. (a -> b) -> a -> b
$ Stateful
createList State
state
        Insert InsertType
IList InsertMode
IEdit Field
_ -> (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
normalMode 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
finishListTitle State
state
        Insert InsertType
ITask InsertMode
ICreate Field
_ ->
            (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
below 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
removeBlank 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
forall a b. (a -> b) -> a -> b
$ Stateful
finishTask State
state
        Insert InsertType
ITask InsertMode
IEdit Field
_ ->
            (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
removeBlank 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
normalMode 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
finishTask State
state
        Mode
_ -> Stateful
forall (f :: * -> *) a. Applicative f => a -> f a
pure State
state
event (EvKey Key
KEsc [Modifier]
_) State
state =
    case State
state State -> Getting Mode State Mode -> Mode
forall s a. s -> Getting a s a -> a
^. Getting Mode State Mode
Lens' State Mode
mode of
        Insert InsertType
IList InsertMode
ICreate Field
_ -> (Stateful
normalMode 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
createList State
state
        Insert InsertType
IList InsertMode
IEdit Field
_ -> (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
normalMode 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
finishListTitle State
state
        Insert InsertType
ITask InsertMode
_ Field
_ -> (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
removeBlank 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
normalMode 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
finishTask State
state
        Mode
_ -> Stateful
forall (f :: * -> *) a. Applicative f => a -> f a
pure State
state
event Event
e State
state =
    Stateful
forall (f :: * -> *) a. Applicative f => a -> f a
pure Stateful -> Stateful
forall a b. (a -> b) -> a -> b
$
    case State
state State -> Getting Mode State Mode -> Mode
forall s a. s -> Getting a s a -> a
^. Getting Mode State Mode
Lens' State Mode
mode of
        Insert InsertType
iType InsertMode
iMode Field
field -> State
state State -> (State -> State) -> State
forall a b. a -> (a -> b) -> b
& (Mode -> Identity Mode) -> State -> Identity State
Lens' State Mode
mode ((Mode -> Identity Mode) -> State -> Identity State)
-> Mode -> State -> State
forall s t a b. ASetter s t a b -> b -> s -> t
.~ InsertType -> InsertMode -> Field -> Mode
Insert InsertType
iType InsertMode
iMode (Event -> Field -> Field
F.event Event
e Field
field)
        Mode
_                        -> State
state