{-# LANGUAGE NoImplicitPrelude #-}

module Events.Actions.Insert
    ( event
    ) where

import ClassyPrelude

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

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

event :: Event -> Stateful
event (EvKey KEnter _) state =
    case state ^. mode of
        Insert IList ICreate _ ->
            (write =<<) . (startCreate =<<) . (newItem =<<) . (store =<<) $ createList state
        Insert IList IEdit _ -> (write =<<) . (normalMode =<<) $ finishListTitle state
        Insert ITask ICreate _ ->
            (write =<<) . (below =<<) . (removeBlank =<<) . (store =<<) $ finishTask state
        Insert ITask IEdit _ ->
            (write =<<) . (removeBlank =<<) . (normalMode =<<) $ finishTask state
        _ -> pure state
event (EvKey KEsc _) state =
    case state ^. mode of
        Insert IList ICreate _ -> (normalMode =<<) . (write =<<) $ createList state
        Insert IList IEdit _ -> (write =<<) . (normalMode =<<) $ finishListTitle state
        Insert ITask _ _ -> (write =<<) . (removeBlank =<<) . (normalMode =<<) $ finishTask state
        _ -> pure state
event e state =
    pure $
    case state ^. mode of
        Insert iType iMode field -> state & mode .~ Insert iType iMode (F.event e field)
        _                        -> state