{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedLists #-}

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

import ClassyPrelude hiding (delete)

import Data.Char                 (isDigit)
import Data.Map.Strict           (Map)
import Events.State
import Events.State.Modal.Detail (editDue, showDetail)
import Events.State.Types        (Stateful)
import Graphics.Vty.Input.Events

events :: Map Text Stateful
events
    -- general
 =
    [ ("quit", quit)
    , ("undo", (write =<<) . undo)
    , ("search", searchMode)
    , ("help", showHelp)
        -- navigation
    , ("previous", previous)
    , ("next", next)
    , ("left", left)
    , ("right", right)
    , ("bottom", bottom)
    -- new tasks
    , ("new", (startCreate =<<) . (newItem =<<) . store)
    , ("newAbove", (startCreate =<<) . (above =<<) . store)
    , ("newBelow", (startCreate =<<) . (below =<<) . store)
    -- editing tasks
    , ("edit", (startEdit =<<) . store)
    , ("clear", (startEdit =<<) . (clearItem =<<) . store)
    , ("delete", (write =<<) . (delete =<<) . store)
    , ("detail", showDetail)
    , ("dueDate", (editDue =<<) . (store =<<) . showDetail)
    -- moving tasks
    , ("moveUp", (write =<<) . (up =<<) . store)
    , ("moveDown", (write =<<) . (down =<<) . store)
    , ("moveLeft", (write =<<) . (bottom =<<) . (left =<<) . (moveLeft =<<) . store)
    , ("moveRight", (write =<<) . (bottom =<<) . (right =<<) . (moveRight =<<) . store)
    , ("moveMenu", showMoveTo)
    -- lists
    , ("listNew", (createListStart =<<) . store)
    , ("listEdit", (editListStart =<<) . store)
    , ("listDelete", (write =<<) . (deleteCurrentList =<<) . store)
    , ("listRight", (write =<<) . (listRight =<<) . store)
    , ("listLeft", (write =<<) . (listLeft =<<) . store)
    ]

-- Normal
event :: Event -> Stateful
-- selecting lists
event (EvKey (KChar n) _)
    | isDigit n = selectList n
    | otherwise = pure
-- fallback
event _ = pure