module Taskell.UI.Draw.Modal
    ( renderModal
    ) where

import ClassyPrelude

import Control.Lens ((^.))

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

import Taskell.Events.State.Types      (height, mode)
import Taskell.Events.State.Types.Mode (ModalType (..), Mode (..))
import Taskell.UI.Draw.Field           (textField)
import Taskell.UI.Draw.Modal.Detail    (detail)
import Taskell.UI.Draw.Modal.Due       (due)
import Taskell.UI.Draw.Modal.Help      (help)
import Taskell.UI.Draw.Modal.MoveTo    (moveTo)
import Taskell.UI.Draw.Types           (DSWidget, DrawState (dsState), TWidget)
import Taskell.UI.Theme                (titleAttr)
import Taskell.UI.Types                (ResourceName (..))

surround :: (Text, TWidget) -> DSWidget
surround :: (Text, TWidget) -> DSWidget
surround (Text
title, TWidget
widget) = do
    Int
ht <- (State -> Getting Int State Int -> Int
forall s a. s -> Getting a s a -> a
^. Getting Int State Int
Lens' State Int
height) (State -> Int)
-> ReaderT DrawState Identity State
-> ReaderT DrawState Identity Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (DrawState -> State) -> ReaderT DrawState Identity State
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks DrawState -> State
dsState
    let t :: TWidget
t = Padding -> TWidget -> TWidget
forall n. Padding -> Widget n -> Widget n
padBottom (Int -> Padding
Pad Int
1) (TWidget -> TWidget) -> (TWidget -> TWidget) -> TWidget -> TWidget
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. AttrName -> TWidget -> TWidget
forall n. AttrName -> Widget n -> Widget n
withAttr AttrName
titleAttr (TWidget -> TWidget) -> TWidget -> TWidget
forall a b. (a -> b) -> a -> b
$ Text -> TWidget
textField Text
title
    TWidget -> DSWidget
forall (f :: * -> *) a. Applicative f => a -> f a
pure (TWidget -> DSWidget)
-> (TWidget -> TWidget) -> TWidget -> DSWidget
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.
        Int -> TWidget -> TWidget
forall n. Int -> Widget n -> Widget n
padTopBottom Int
1 (TWidget -> TWidget) -> (TWidget -> TWidget) -> TWidget -> TWidget
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.
        TWidget -> TWidget
forall n. Widget n -> Widget n
centerLayer (TWidget -> TWidget) -> (TWidget -> TWidget) -> TWidget -> TWidget
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.
        TWidget -> TWidget
forall n. Widget n -> Widget n
border (TWidget -> TWidget) -> (TWidget -> TWidget) -> TWidget -> TWidget
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.
        Int -> TWidget -> TWidget
forall n. Int -> Widget n -> Widget n
padTopBottom Int
1 (TWidget -> TWidget) -> (TWidget -> TWidget) -> TWidget -> TWidget
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.
        Int -> TWidget -> TWidget
forall n. Int -> Widget n -> Widget n
padLeftRight Int
4 (TWidget -> TWidget) -> (TWidget -> TWidget) -> TWidget -> TWidget
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Int -> TWidget -> TWidget
forall n. Int -> Widget n -> Widget n
vLimit (Int
ht Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
9) (TWidget -> TWidget) -> (TWidget -> TWidget) -> TWidget -> TWidget
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Int -> TWidget -> TWidget
forall n. Int -> Widget n -> Widget n
hLimit Int
50 (TWidget -> TWidget) -> (TWidget -> TWidget) -> TWidget -> TWidget
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (TWidget
t TWidget -> TWidget -> TWidget
forall n. Widget n -> Widget n -> Widget n
<=>) (TWidget -> TWidget) -> (TWidget -> TWidget) -> TWidget -> TWidget
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ResourceName -> ViewportType -> TWidget -> TWidget
forall n.
(Ord n, Show n) =>
n -> ViewportType -> Widget n -> Widget n
viewport ResourceName
RNModal ViewportType
Vertical (TWidget -> DSWidget) -> TWidget -> DSWidget
forall a b. (a -> b) -> a -> b
$
        TWidget
widget

renderModal :: DSWidget
renderModal :: DSWidget
renderModal = do
    Mode
md <- (State -> Getting Mode State Mode -> Mode
forall s a. s -> Getting a s a -> a
^. Getting Mode State Mode
Lens' State Mode
mode) (State -> Mode)
-> ReaderT DrawState Identity State
-> ReaderT DrawState Identity Mode
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (DrawState -> State) -> ReaderT DrawState Identity State
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks DrawState -> State
dsState
    case Mode
md of
        Modal ModalType
Help                 -> (Text, TWidget) -> DSWidget
surround ((Text, TWidget) -> DSWidget)
-> ReaderT DrawState Identity (Text, TWidget) -> DSWidget
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ReaderT DrawState Identity (Text, TWidget)
help
        Modal Detail {}            -> (Text, TWidget) -> DSWidget
surround ((Text, TWidget) -> DSWidget)
-> ReaderT DrawState Identity (Text, TWidget) -> DSWidget
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ReaderT DrawState Identity (Text, TWidget)
detail
        Modal ModalType
MoveTo               -> (Text, TWidget) -> DSWidget
surround ((Text, TWidget) -> DSWidget)
-> ReaderT DrawState Identity (Text, TWidget) -> DSWidget
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ReaderT DrawState Identity (Text, TWidget)
moveTo
        Modal (Due Seq (Pointer, Task)
tasks Int
selected) -> (Text, TWidget) -> DSWidget
surround ((Text, TWidget) -> DSWidget)
-> ReaderT DrawState Identity (Text, TWidget) -> DSWidget
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Seq (Pointer, Task)
-> Int -> ReaderT DrawState Identity (Text, TWidget)
due Seq (Pointer, Task)
tasks Int
selected
        Mode
_                          -> TWidget -> DSWidget
forall (f :: * -> *) a. Applicative f => a -> f a
pure TWidget
forall n. Widget n
emptyWidget