content: {-# LANGUAGE MultiWayIf #-}
  {-# LANGUAGE PackageImports #-}
  module Matterhorn.Draw (draw) where
  
  import Prelude ()
  import Matterhorn.Prelude
  
  import Brick
  
  import Lens.Micro.Platform ( _2, singular, _Just )
  
  import Matterhorn.Draw.ChannelTopicWindow
  import Matterhorn.Draw.ChannelSelectPrompt
  import Matterhorn.Draw.MessageDeleteConfirm
  import Matterhorn.Draw.DeleteChannelConfirm
  import Matterhorn.Draw.LeaveChannelConfirm
  import Matterhorn.Draw.Main
  import Matterhorn.Draw.ThemeListWindow
  import Matterhorn.Draw.PostListWindow
  import Matterhorn.Draw.ShowHelp
  import Matterhorn.Draw.UserListWindow
  import Matterhorn.Draw.ChannelListWindow
  import Matterhorn.Draw.ReactionEmojiListWindow
  import Matterhorn.Draw.TabbedWindow
  import Matterhorn.Draw.NotifyPrefs
  import Matterhorn.Types
  
  
  draw :: ChatState -> [Widget Name]
  draw st = fromMaybe (drawMain st Main) $ do
      tId <- st^.csCurrentTeamId
      let messageViewWindow = st^.csTeam(tId).tsViewedMessage.singular _Just._2
          monochrome = fmap (forceAttr $ attrName "invalid")
          drawMode m ms =
              let rest = case ms of
                      (a:as) -> drawMode a as
                      _ -> []
              in case m of
                  -- For this first section of modes, we only want
                  -- to draw for the current mode and ignore the
                  -- mode stack because we expect the current mode
                  -- to be all we need to draw what should be on
                  -- the screen.
                  Main                          -> drawMain st m
                  ShowHelp topic                -> drawShowHelp topic st
  
                  -- For the following modes, we want to draw the
                  -- whole mode stack since we expect the UI to
                  -- have layers and we want to show prior modes
                  -- underneath.
                  ChannelSelect                 -> drawChannelSelectPrompt st tId : drawMain st m
                  MessageSelectDeleteConfirm {} -> drawMessageDeleteConfirm : rest
                  ThemeListWindow               -> drawThemeListWindow st tId : rest
                  LeaveChannelConfirm           -> drawLeaveChannelConfirm st tId : monochrome rest
                  DeleteChannelConfirm          -> drawDeleteChannelConfirm st tId : monochrome rest
                  PostListWindow contents       -> drawPostListWindow contents st tId : monochrome rest
                  UserListWindow                -> drawUserListWindow st tId : monochrome rest
                  ChannelListWindow             -> drawChannelListWindow st tId : monochrome rest
                  ReactionEmojiListWindow       -> drawReactionEmojiListWindow st tId : monochrome rest
                  ViewMessage                   -> drawTabbedWindow messageViewWindow st tId : monochrome rest
                  EditNotifyPrefs               -> drawNotifyPrefs st tId : monochrome rest
                  ChannelTopicWindow            -> drawChannelTopicWindow st tId : monochrome rest
          topMode = teamMode $ st^.csTeam(tId)
          otherModes = tail $ teamModes $ st^.csTeam(tId)
  
      return $ drawMode topMode otherModes
  