module Matterhorn.Draw.ChannelListOverlay
  ( drawChannelListOverlay
  )
where

import           Prelude ()
import           Matterhorn.Prelude

import           Brick
import qualified Data.Text as T
import           Text.Wrap ( defaultWrapSettings, preserveIndentation )

import           Network.Mattermost.Types
import           Network.Mattermost.Lenses

import           Matterhorn.Draw.ListOverlay ( drawListOverlay, OverlayPosition(..) )
import           Matterhorn.Types
import           Matterhorn.Types.Common ( sanitizeUserText )
import           Matterhorn.Themes


drawChannelListOverlay :: ChatState -> Widget Name
drawChannelListOverlay :: ChatState -> Widget Name
drawChannelListOverlay ChatState
st =
    let overlay :: Widget Name
overlay = ListOverlayState Channel ChannelSearchScope
-> (ChannelSearchScope -> Widget Name)
-> (ChannelSearchScope -> Widget Name)
-> (ChannelSearchScope -> Widget Name)
-> (Bool -> Channel -> Widget Name)
-> Maybe (Widget Name)
-> OverlayPosition
-> Int
-> Widget Name
forall a b.
ListOverlayState a b
-> (b -> Widget Name)
-> (b -> Widget Name)
-> (b -> Widget Name)
-> (Bool -> a -> Widget Name)
-> Maybe (Widget Name)
-> OverlayPosition
-> Int
-> Widget Name
drawListOverlay (ChatState
stChatState
-> Getting
     (ListOverlayState Channel ChannelSearchScope)
     ChatState
     (ListOverlayState Channel ChannelSearchScope)
-> ListOverlayState Channel ChannelSearchScope
forall s a. s -> Getting a s a -> a
^.(TeamState
 -> Const (ListOverlayState Channel ChannelSearchScope) TeamState)
-> ChatState
-> Const (ListOverlayState Channel ChannelSearchScope) ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState
  -> Const (ListOverlayState Channel ChannelSearchScope) TeamState)
 -> ChatState
 -> Const (ListOverlayState Channel ChannelSearchScope) ChatState)
-> ((ListOverlayState Channel ChannelSearchScope
     -> Const
          (ListOverlayState Channel ChannelSearchScope)
          (ListOverlayState Channel ChannelSearchScope))
    -> TeamState
    -> Const (ListOverlayState Channel ChannelSearchScope) TeamState)
-> Getting
     (ListOverlayState Channel ChannelSearchScope)
     ChatState
     (ListOverlayState Channel ChannelSearchScope)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ListOverlayState Channel ChannelSearchScope
 -> Const
      (ListOverlayState Channel ChannelSearchScope)
      (ListOverlayState Channel ChannelSearchScope))
-> TeamState
-> Const (ListOverlayState Channel ChannelSearchScope) TeamState
Lens' TeamState (ListOverlayState Channel ChannelSearchScope)
tsChannelListOverlay) ChannelSearchScope -> Widget Name
channelSearchScopeHeader
                                  ChannelSearchScope -> Widget Name
channelSearchScopeNoResults ChannelSearchScope -> Widget Name
channelSearchScopePrompt
                                  Bool -> Channel -> Widget Name
renderChannel
                                  Maybe (Widget Name)
forall a. Maybe a
Nothing
                                  OverlayPosition
OverlayCenter
                                  Int
80
    in Widget Name -> Widget Name
forall n. Widget n -> Widget n
joinBorders Widget Name
overlay

channelSearchScopePrompt :: ChannelSearchScope -> Widget Name
channelSearchScopePrompt :: ChannelSearchScope -> Widget Name
channelSearchScopePrompt ChannelSearchScope
scope =
    Text -> Widget Name
forall n. Text -> Widget n
txt (Text -> Widget Name) -> Text -> Widget Name
forall a b. (a -> b) -> a -> b
$ case ChannelSearchScope
scope of
        ChannelSearchScope
AllChannels -> Text
"Search channels:"

channelSearchScopeNoResults :: ChannelSearchScope -> Widget Name
channelSearchScopeNoResults :: ChannelSearchScope -> Widget Name
channelSearchScopeNoResults ChannelSearchScope
scope =
    Text -> Widget Name
forall n. Text -> Widget n
txt (Text -> Widget Name) -> Text -> Widget Name
forall a b. (a -> b) -> a -> b
$ case ChannelSearchScope
scope of
        ChannelSearchScope
AllChannels -> Text
"No matching channels found."

channelSearchScopeHeader :: ChannelSearchScope -> Widget Name
channelSearchScopeHeader :: ChannelSearchScope -> Widget Name
channelSearchScopeHeader ChannelSearchScope
scope =
    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 -> Widget Name) -> Text -> Widget Name
forall a b. (a -> b) -> a -> b
$ case ChannelSearchScope
scope of
        ChannelSearchScope
AllChannels -> Text
"Join a Channel"

renderChannel :: Bool -> Channel -> Widget Name
renderChannel :: Bool -> Channel -> Widget Name
renderChannel Bool
_ Channel
chan =
    let baseStr :: Text
baseStr = (UserText -> Text
sanitizeUserText (UserText -> Text) -> UserText -> Text
forall a b. (a -> b) -> a -> b
$ Channel
chanChannel -> Getting UserText Channel UserText -> UserText
forall s a. s -> Getting a s a -> a
^.Getting UserText Channel UserText
Lens' Channel UserText
channelDisplayNameL) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>
                  Text
" (" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> (UserText -> Text
sanitizeUserText (UserText -> Text) -> UserText -> Text
forall a b. (a -> b) -> a -> b
$ Channel
chanChannel -> Getting UserText Channel UserText -> UserText
forall s a. s -> Getting a s a -> a
^.Getting UserText Channel UserText
Lens' Channel UserText
channelNameL) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
")"
        s :: Text
s = Text
"  " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> (Text -> Text
T.strip (Text -> Text) -> Text -> Text
forall a b. (a -> b) -> a -> b
$ UserText -> Text
sanitizeUserText (UserText -> Text) -> UserText -> Text
forall a b. (a -> b) -> a -> b
$ Channel
chanChannel -> Getting UserText Channel UserText -> UserText
forall s a. s -> Getting a s a -> a
^.Getting UserText Channel UserText
Lens' Channel UserText
channelPurposeL)
    in (Int -> Widget Name -> Widget Name
forall n. Int -> Widget n -> Widget n
vLimit Int
1 (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$ 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
$ 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
baseStr) Widget Name -> Widget Name -> Widget Name
forall n. Widget n -> Widget n -> Widget n
<=>
       (Int -> Widget Name -> Widget Name
forall n. Int -> Widget n -> Widget n
vLimit Int
1 (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$ WrapSettings -> Text -> Widget Name
forall n. WrapSettings -> Text -> Widget n
txtWrapWith (WrapSettings
defaultWrapSettings { preserveIndentation :: Bool
preserveIndentation = Bool
True }) Text
s)