module Matterhorn.Draw.ManageAttachments
  ( drawManageAttachments
  )
where

import           Prelude ()
import           Matterhorn.Prelude

import           Brick
import           Brick.Widgets.Border
import           Brick.Widgets.Center
import qualified Brick.Widgets.FileBrowser as FB
import           Brick.Widgets.List
import           Data.Maybe ( fromJust )

import           Matterhorn.Types
import           Matterhorn.Types.KeyEvents
import           Matterhorn.Events.Keybindings ( getFirstDefaultBinding )
import           Matterhorn.Themes


drawManageAttachments :: ChatState -> Widget Name
drawManageAttachments :: ChatState -> Widget Name
drawManageAttachments ChatState
st =
    Widget Name
topLayer
    where
        topLayer :: Widget Name
topLayer = case ChatState
stChatState -> Getting Mode ChatState Mode -> Mode
forall s a. s -> Getting a s a -> a
^.(TeamState -> Const Mode TeamState)
-> ChatState -> Const Mode ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> Const Mode TeamState)
 -> ChatState -> Const Mode ChatState)
-> ((Mode -> Const Mode Mode) -> TeamState -> Const Mode TeamState)
-> Getting Mode ChatState Mode
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Mode -> Const Mode Mode) -> TeamState -> Const Mode TeamState
Lens' TeamState Mode
tsMode of
            Mode
ManageAttachments -> ChatState -> Widget Name
drawAttachmentList ChatState
st
            Mode
ManageAttachmentsBrowseFiles -> ChatState -> Widget Name
drawFileBrowser ChatState
st
            Mode
_ -> [Char] -> Widget Name
forall a. HasCallStack => [Char] -> a
error [Char]
"BUG: drawManageAttachments called in invalid mode"

drawAttachmentList :: ChatState -> Widget Name
drawAttachmentList :: ChatState -> Widget Name
drawAttachmentList ChatState
st =
    let addBinding :: Text
addBinding = Binding -> Text
ppBinding (Binding -> Text) -> Binding -> Text
forall a b. (a -> b) -> a -> b
$ KeyEvent -> Binding
getFirstDefaultBinding KeyEvent
AttachmentListAddEvent
        delBinding :: Text
delBinding = Binding -> Text
ppBinding (Binding -> Text) -> Binding -> Text
forall a b. (a -> b) -> a -> b
$ KeyEvent -> Binding
getFirstDefaultBinding KeyEvent
AttachmentListDeleteEvent
        escBinding :: Text
escBinding = Binding -> Text
ppBinding (Binding -> Text) -> Binding -> Text
forall a b. (a -> b) -> a -> b
$ KeyEvent -> Binding
getFirstDefaultBinding KeyEvent
CancelEvent
        openBinding :: Text
openBinding = Binding -> Text
ppBinding (Binding -> Text) -> Binding -> Text
forall a b. (a -> b) -> a -> b
$ KeyEvent -> Binding
getFirstDefaultBinding KeyEvent
AttachmentOpenEvent
    in Widget Name -> Widget Name
forall n. Widget n -> Widget n
centerLayer (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
       Int -> Widget Name -> Widget Name
forall n. Int -> Widget n -> Widget n
hLimit Int
60 (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
       Int -> Widget Name -> Widget Name
forall n. Int -> Widget n -> Widget n
vLimit Int
15 (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
       Widget Name -> Widget Name
forall n. Widget n -> Widget n
joinBorders (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
       Widget Name -> Widget Name -> Widget Name
forall n. Widget n -> Widget n -> Widget n
borderWithLabel (AttrName -> Widget Name -> Widget Name
forall n. AttrName -> Widget n -> Widget n
withDefAttr AttrName
clientEmphAttr (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$ Text -> Widget Name
forall n. Text -> Widget n
txt Text
"Attachments") (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
       [Widget Name] -> Widget Name
forall n. [Widget n] -> Widget n
vBox [ (Bool -> AttachmentData -> Widget Name)
-> Bool -> GenericList Name Vector AttachmentData -> Widget Name
forall (t :: * -> *) n e.
(Traversable t, Splittable t, Ord n, Show n) =>
(Bool -> e -> Widget n) -> Bool -> GenericList n t e -> Widget n
renderList Bool -> AttachmentData -> Widget Name
renderAttachmentItem Bool
True (ChatState
stChatState
-> Getting
     (GenericList Name Vector AttachmentData)
     ChatState
     (GenericList Name Vector AttachmentData)
-> GenericList Name Vector AttachmentData
forall s a. s -> Getting a s a -> a
^.(TeamState
 -> Const (GenericList Name Vector AttachmentData) TeamState)
-> ChatState
-> Const (GenericList Name Vector AttachmentData) ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState
  -> Const (GenericList Name Vector AttachmentData) TeamState)
 -> ChatState
 -> Const (GenericList Name Vector AttachmentData) ChatState)
-> ((GenericList Name Vector AttachmentData
     -> Const
          (GenericList Name Vector AttachmentData)
          (GenericList Name Vector AttachmentData))
    -> TeamState
    -> Const (GenericList Name Vector AttachmentData) TeamState)
-> Getting
     (GenericList Name Vector AttachmentData)
     ChatState
     (GenericList Name Vector AttachmentData)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState
 -> Const (GenericList Name Vector AttachmentData) ChatEditState)
-> TeamState
-> Const (GenericList Name Vector AttachmentData) TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState
  -> Const (GenericList Name Vector AttachmentData) ChatEditState)
 -> TeamState
 -> Const (GenericList Name Vector AttachmentData) TeamState)
-> ((GenericList Name Vector AttachmentData
     -> Const
          (GenericList Name Vector AttachmentData)
          (GenericList Name Vector AttachmentData))
    -> ChatEditState
    -> Const (GenericList Name Vector AttachmentData) ChatEditState)
-> (GenericList Name Vector AttachmentData
    -> Const
         (GenericList Name Vector AttachmentData)
         (GenericList Name Vector AttachmentData))
-> TeamState
-> Const (GenericList Name Vector AttachmentData) TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector AttachmentData
 -> Const
      (GenericList Name Vector AttachmentData)
      (GenericList Name Vector AttachmentData))
-> ChatEditState
-> Const (GenericList Name Vector AttachmentData) ChatEditState
Lens' ChatEditState (GenericList Name Vector AttachmentData)
cedAttachmentList)
            , Widget Name
forall n. Widget n
hBorder
            , Widget Name -> Widget Name
forall n. Widget n -> Widget n
hCenter (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$ AttrName -> Widget Name -> Widget Name
forall n. AttrName -> Widget n -> Widget n
withDefAttr AttrName
clientMessageAttr (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
                        Text -> Widget Name
forall n. Text -> Widget n
txt (Text -> Widget Name) -> Text -> Widget Name
forall a b. (a -> b) -> a -> b
$ Text
addBinding Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
":add " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>
                              Text
delBinding Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
":delete " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>
                              Text
openBinding Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
":open " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>
                              Text
escBinding Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
":close"
            ]

renderAttachmentItem :: Bool -> AttachmentData -> Widget Name
renderAttachmentItem :: Bool -> AttachmentData -> Widget Name
renderAttachmentItem Bool
_ AttachmentData
d =
    Padding -> Widget Name -> Widget Name
forall n. Padding -> Widget n -> Widget n
padRight Padding
Max (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$ [Char] -> Widget Name
forall n. [Char] -> Widget n
str ([Char] -> Widget Name) -> [Char] -> Widget Name
forall a b. (a -> b) -> a -> b
$ FileInfo -> [Char]
FB.fileInfoSanitizedFilename (FileInfo -> [Char]) -> FileInfo -> [Char]
forall a b. (a -> b) -> a -> b
$ AttachmentData -> FileInfo
attachmentDataFileInfo AttachmentData
d

drawFileBrowser :: ChatState -> Widget Name
drawFileBrowser :: ChatState -> Widget Name
drawFileBrowser ChatState
st =
    Widget Name -> Widget Name
forall n. Widget n -> Widget n
centerLayer (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
    Int -> Widget Name -> Widget Name
forall n. Int -> Widget n -> Widget n
hLimit Int
60 (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
    Int -> Widget Name -> Widget Name
forall n. Int -> Widget n -> Widget n
vLimit Int
20 (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
    Widget Name -> Widget Name -> Widget Name
forall n. Widget n -> Widget n -> Widget n
borderWithLabel (AttrName -> Widget Name -> Widget Name
forall n. AttrName -> Widget n -> Widget n
withDefAttr AttrName
clientEmphAttr (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$ Text -> Widget Name
forall n. Text -> Widget n
txt Text
"Attach File") (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
    -- invariant: cedFileBrowser is not Nothing if appMode is
    -- ManageAttachmentsBrowseFiles, and that is the only way to reach
    -- this code, ergo the fromJust.
    Bool -> FileBrowser Name -> Widget Name
forall n. (Show n, Ord n) => Bool -> FileBrowser n -> Widget n
FB.renderFileBrowser Bool
True (FileBrowser Name -> Widget Name)
-> FileBrowser Name -> Widget Name
forall a b. (a -> b) -> a -> b
$ Maybe (FileBrowser Name) -> FileBrowser Name
forall a. HasCallStack => Maybe a -> a
fromJust (ChatState
stChatState
-> Getting
     (Maybe (FileBrowser Name)) ChatState (Maybe (FileBrowser Name))
-> Maybe (FileBrowser Name)
forall s a. s -> Getting a s a -> a
^.(TeamState -> Const (Maybe (FileBrowser Name)) TeamState)
-> ChatState -> Const (Maybe (FileBrowser Name)) ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> Const (Maybe (FileBrowser Name)) TeamState)
 -> ChatState -> Const (Maybe (FileBrowser Name)) ChatState)
-> ((Maybe (FileBrowser Name)
     -> Const (Maybe (FileBrowser Name)) (Maybe (FileBrowser Name)))
    -> TeamState -> Const (Maybe (FileBrowser Name)) TeamState)
-> Getting
     (Maybe (FileBrowser Name)) ChatState (Maybe (FileBrowser Name))
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ChatEditState -> Const (Maybe (FileBrowser Name)) ChatEditState)
-> TeamState -> Const (Maybe (FileBrowser Name)) TeamState
Lens' TeamState ChatEditState
tsEditState((ChatEditState -> Const (Maybe (FileBrowser Name)) ChatEditState)
 -> TeamState -> Const (Maybe (FileBrowser Name)) TeamState)
-> ((Maybe (FileBrowser Name)
     -> Const (Maybe (FileBrowser Name)) (Maybe (FileBrowser Name)))
    -> ChatEditState -> Const (Maybe (FileBrowser Name)) ChatEditState)
-> (Maybe (FileBrowser Name)
    -> Const (Maybe (FileBrowser Name)) (Maybe (FileBrowser Name)))
-> TeamState
-> Const (Maybe (FileBrowser Name)) TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe (FileBrowser Name)
 -> Const (Maybe (FileBrowser Name)) (Maybe (FileBrowser Name)))
-> ChatEditState -> Const (Maybe (FileBrowser Name)) ChatEditState
Lens' ChatEditState (Maybe (FileBrowser Name))
cedFileBrowser)