module Taskell.UI.Draw.Modal.Due
    ( due
    ) where

import ClassyPrelude

import Brick
import Taskell.Data.Seq ((<#>))

import qualified Taskell.Data.Task     as T (Task)
import           Taskell.Types         (Pointer)
import           Taskell.UI.Draw.Task  (TaskWidget (..), parts)
import           Taskell.UI.Draw.Types (DSWidget, ModalWidget)
import           Taskell.UI.Theme      (taskAttr, taskCurrentAttr)
import           Taskell.UI.Types      (ResourceName (RNDue))

renderTask :: Int -> Int -> T.Task -> DSWidget
renderTask :: Int -> Int -> Task -> DSWidget
renderTask Int
current Int
position Task
task = do
    (TaskWidget TWidget
text TWidget
date TWidget
_ TWidget
_) <- Task -> ReaderDrawState TaskWidget
parts Task
task
    let selected :: Bool
selected = Int
current Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
position
    let attr :: AttrName
attr =
            if Bool
selected
                then AttrName
taskCurrentAttr
                else AttrName
taskAttr
    let shw :: Widget n -> Widget n
shw =
            if Bool
selected
                then Widget n -> Widget n
forall n. Widget n -> Widget n
visible
                else Widget n -> Widget n
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
    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
. TWidget -> TWidget
forall n. Widget n -> Widget n
shw (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 -> TWidget -> TWidget
forall n. Ord n => n -> Widget n -> Widget n
cached (Int -> ResourceName
RNDue Int
position) (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
. 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
attr (TWidget -> DSWidget) -> TWidget -> DSWidget
forall a b. (a -> b) -> a -> b
$ [TWidget] -> TWidget
forall n. [Widget n] -> Widget n
vBox [TWidget
date, TWidget
text]

due :: Seq (Pointer, T.Task) -> Int -> ModalWidget
due :: Seq (Pointer, Task) -> Int -> ModalWidget
due Seq (Pointer, Task)
tasks Int
selected = do
    let items :: Seq Task
items = (Pointer, Task) -> Task
forall a b. (a, b) -> b
snd ((Pointer, Task) -> Task) -> Seq (Pointer, Task) -> Seq Task
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Seq (Pointer, Task)
tasks
    Seq TWidget
widgets <- Seq DSWidget -> ReaderT DrawState Identity (Seq TWidget)
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence (Seq DSWidget -> ReaderT DrawState Identity (Seq TWidget))
-> Seq DSWidget -> ReaderT DrawState Identity (Seq TWidget)
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Task -> DSWidget
renderTask Int
selected (Int -> Task -> DSWidget) -> Seq Task -> Seq DSWidget
forall a b. (Int -> a -> b) -> Seq a -> Seq b
<#> Seq Task
items
    (Text, TWidget) -> ModalWidget
forall (f :: * -> *) a. Applicative f => a -> f a
pure
        ( Text
"Due Tasks"
        , if Seq Task -> Bool
forall mono. MonoFoldable mono => mono -> Bool
null Seq Task
items
              then Text -> TWidget
forall n. Text -> Widget n
txt Text
"No due tasks"
              else [TWidget] -> TWidget
forall n. [Widget n] -> Widget n
vBox ([TWidget] -> TWidget) -> [TWidget] -> TWidget
forall a b. (a -> b) -> a -> b
$ Seq TWidget -> [Element (Seq TWidget)]
forall mono. MonoFoldable mono => mono -> [Element mono]
toList Seq TWidget
widgets)