{-# LANGUAGE NoImplicitPrelude #-}

module UI.Modal
    ( showModal
    ) where

import ClassyPrelude

import Control.Lens ((^.))

import Brick
import Brick.Widgets.Border
import Brick.Widgets.Center

import Data.Taskell.Date       (Day)
import Events.State.Types      (State, mode)
import Events.State.Types.Mode (ModalType (..), Mode (..))
import IO.Keyboard.Types       (Bindings)
import UI.Field                (textField)
import UI.Modal.Detail         (detail)
import UI.Modal.Help           (help)
import UI.Modal.MoveTo         (moveTo)
import UI.Theme                (titleAttr)
import UI.Types                (ResourceName (..))

surround :: (Text, Widget ResourceName) -> Widget ResourceName
surround (title, widget) =
    padTopBottom 1 .
    centerLayer .
    border . padTopBottom 1 . padLeftRight 4 . hLimit 50 . (t <=>) . viewport RNModal Vertical $
    widget
  where
    t = padBottom (Pad 1) . withAttr titleAttr $ textField title

showModal :: Bindings -> State -> Day -> [Widget ResourceName] -> [Widget ResourceName]
showModal bindings state today view =
    case state ^. mode of
        Modal Help      -> surround (help bindings) : view
        Modal Detail {} -> surround (detail state today) : view
        Modal MoveTo    -> surround (moveTo state) : view
        _               -> view