content: module Matterhorn.Events.ChannelTopicWindow
    ( onEventChannelTopicWindow
    , channelTopicWindowMouseHandler
    )
  where
  
  import           Prelude ()
  import           Matterhorn.Prelude
  
  import           Brick ( BrickEvent(VtyEvent, MouseDown) )
  import           Brick.Focus
  import           Brick.Widgets.Edit ( handleEditorEvent, getEditContents )
  import qualified Data.Text as T
  import           Lens.Micro.Platform ( (%=) )
  import qualified Graphics.Vty as Vty
  
  import           Network.Mattermost.Types ( TeamId )
  
  import           Matterhorn.Types
  import           Matterhorn.State.Channels ( setChannelTopic )
  
  
  onEventChannelTopicWindow :: TeamId -> Vty.Event -> MH ()
  onEventChannelTopicWindow tId (Vty.EvKey (Vty.KChar '\t') []) =
      csTeam(tId).tsChannelTopicDialog.channelTopicDialogFocus %= focusNext
  onEventChannelTopicWindow tId (Vty.EvKey Vty.KBackTab []) =
      csTeam(tId).tsChannelTopicDialog.channelTopicDialogFocus %= focusPrev
  onEventChannelTopicWindow tId e@(Vty.EvKey Vty.KEnter []) = do
      f <- use (csTeam(tId).tsChannelTopicDialog.channelTopicDialogFocus)
      case focusGetCurrent f of
          Just (ChannelTopicSaveButton {}) -> do
              doSaveTopic tId
          Just (ChannelTopicEditor {}) ->
              mhZoom (csTeam(tId).tsChannelTopicDialog.channelTopicDialogEditor)
                                  handleEditorEvent (VtyEvent e)
          Just (ChannelTopicCancelButton {}) ->
              doCancelTopicEdit tId
          _ ->
              popMode tId
  onEventChannelTopicWindow tId (Vty.EvKey Vty.KEsc []) = do
      popMode tId
  onEventChannelTopicWindow tId e = do
      f <- use (csTeam(tId).tsChannelTopicDialog.channelTopicDialogFocus)
      case focusGetCurrent f of
          Just (ChannelTopicEditor {}) ->
              mhZoom (csTeam(tId).tsChannelTopicDialog.channelTopicDialogEditor)
                                  handleEditorEvent (VtyEvent e)
          _ ->
              return ()
  
  channelTopicWindowMouseHandler :: TeamId -> BrickEvent Name MHEvent -> MH ()
  channelTopicWindowMouseHandler tId (MouseDown (ChannelTopicSaveButton {}) _ _ _) = doSaveTopic tId
  channelTopicWindowMouseHandler tId (MouseDown (ChannelTopicCancelButton {}) _ _ _) = doCancelTopicEdit tId
  channelTopicWindowMouseHandler _ _ = return ()
  
  doSaveTopic :: TeamId -> MH ()
  doSaveTopic tId = do
      ed <- use (csTeam(tId).tsChannelTopicDialog.channelTopicDialogEditor)
      let topic = T.unlines $ getEditContents ed
      setChannelTopic tId topic
      popMode tId
  
  doCancelTopicEdit :: TeamId -> MH ()
  doCancelTopicEdit tId = popMode tId
  