module Matterhorn.Events.EditNotifyPrefs
    ( onEventEditNotifyPrefs
    , editNotifyPrefsKeybindings
    , editNotifyPrefsKeyHandlers
    , handleEditNotifyPrefsEvent
    )
where

import           Prelude ()
import           Matterhorn.Prelude

import           Brick
import           Brick.Forms (handleFormEvent, formState)
import           Data.Maybe (fromJust)
import qualified Graphics.Vty as V
import qualified Network.Mattermost.Endpoints as MM
import           Network.Mattermost.Types ( TeamId )

import           Lens.Micro.Platform (_Just, (.=), singular)

import           Matterhorn.Types
import           Matterhorn.Types.KeyEvents
import           Matterhorn.Events.Keybindings
import           Matterhorn.State.NotifyPrefs
import           Matterhorn.State.Async

onEventEditNotifyPrefs :: TeamId -> V.Event -> MH Bool
onEventEditNotifyPrefs :: TeamId -> Event -> MH Bool
onEventEditNotifyPrefs TeamId
tId =
    [Event -> MH Bool] -> Event -> MH Bool
handleEventWith [ (KeyConfig -> KeyHandlerMap) -> Event -> MH Bool
handleKeyboardEvent (TeamId -> KeyConfig -> KeyHandlerMap
editNotifyPrefsKeybindings TeamId
tId)
                    , TeamId -> BrickEvent Name MHEvent -> MH Bool
handleEditNotifyPrefsEvent TeamId
tId (BrickEvent Name MHEvent -> MH Bool)
-> (Event -> BrickEvent Name MHEvent) -> Event -> MH Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event -> BrickEvent Name MHEvent
forall n e. Event -> BrickEvent n e
VtyEvent
                    ]

handleEditNotifyPrefsEvent :: TeamId -> BrickEvent Name MHEvent -> MH Bool
handleEditNotifyPrefsEvent :: TeamId -> BrickEvent Name MHEvent -> MH Bool
handleEditNotifyPrefsEvent TeamId
tId BrickEvent Name MHEvent
e = do
    Form ChannelNotifyProps MHEvent Name
form <- Getting
  (Form ChannelNotifyProps MHEvent Name)
  ChatState
  (Form ChannelNotifyProps MHEvent Name)
-> MH (Form ChannelNotifyProps MHEvent Name)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState
  -> Const (Form ChannelNotifyProps MHEvent Name) TeamState)
 -> ChatState
 -> Const (Form ChannelNotifyProps MHEvent Name) ChatState)
-> ((Form ChannelNotifyProps MHEvent Name
     -> Const
          (Form ChannelNotifyProps MHEvent Name)
          (Form ChannelNotifyProps MHEvent Name))
    -> TeamState
    -> Const (Form ChannelNotifyProps MHEvent Name) TeamState)
-> Getting
     (Form ChannelNotifyProps MHEvent Name)
     ChatState
     (Form ChannelNotifyProps MHEvent Name)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe (Form ChannelNotifyProps MHEvent Name)
 -> Const
      (Form ChannelNotifyProps MHEvent Name)
      (Maybe (Form ChannelNotifyProps MHEvent Name)))
-> TeamState
-> Const (Form ChannelNotifyProps MHEvent Name) TeamState
Lens' TeamState (Maybe (Form ChannelNotifyProps MHEvent Name))
tsNotifyPrefs((Maybe (Form ChannelNotifyProps MHEvent Name)
  -> Const
       (Form ChannelNotifyProps MHEvent Name)
       (Maybe (Form ChannelNotifyProps MHEvent Name)))
 -> TeamState
 -> Const (Form ChannelNotifyProps MHEvent Name) TeamState)
-> ((Form ChannelNotifyProps MHEvent Name
     -> Const
          (Form ChannelNotifyProps MHEvent Name)
          (Form ChannelNotifyProps MHEvent Name))
    -> Maybe (Form ChannelNotifyProps MHEvent Name)
    -> Const
         (Form ChannelNotifyProps MHEvent Name)
         (Maybe (Form ChannelNotifyProps MHEvent Name)))
-> (Form ChannelNotifyProps MHEvent Name
    -> Const
         (Form ChannelNotifyProps MHEvent Name)
         (Form ChannelNotifyProps MHEvent Name))
-> TeamState
-> Const (Form ChannelNotifyProps MHEvent Name) TeamState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Traversal
  (Maybe (Form ChannelNotifyProps MHEvent Name))
  (Maybe (Form ChannelNotifyProps MHEvent Name))
  (Form ChannelNotifyProps MHEvent Name)
  (Form ChannelNotifyProps MHEvent Name)
-> Lens
     (Maybe (Form ChannelNotifyProps MHEvent Name))
     (Maybe (Form ChannelNotifyProps MHEvent Name))
     (Form ChannelNotifyProps MHEvent Name)
     (Form ChannelNotifyProps MHEvent Name)
forall s t a. HasCallStack => Traversal s t a a -> Lens s t a a
singular forall a a'. Traversal (Maybe a) (Maybe a') a a'
Traversal
  (Maybe (Form ChannelNotifyProps MHEvent Name))
  (Maybe (Form ChannelNotifyProps MHEvent Name))
  (Form ChannelNotifyProps MHEvent Name)
  (Form ChannelNotifyProps MHEvent Name)
_Just)
    Form ChannelNotifyProps MHEvent Name
updatedForm <- EventM Name (Form ChannelNotifyProps MHEvent Name)
-> MH (Form ChannelNotifyProps MHEvent Name)
forall a. EventM Name a -> MH a
mh (EventM Name (Form ChannelNotifyProps MHEvent Name)
 -> MH (Form ChannelNotifyProps MHEvent Name))
-> EventM Name (Form ChannelNotifyProps MHEvent Name)
-> MH (Form ChannelNotifyProps MHEvent Name)
forall a b. (a -> b) -> a -> b
$ BrickEvent Name MHEvent
-> Form ChannelNotifyProps MHEvent Name
-> EventM Name (Form ChannelNotifyProps MHEvent Name)
forall n e s.
Eq n =>
BrickEvent n e -> Form s e n -> EventM n (Form s e n)
handleFormEvent BrickEvent Name MHEvent
e Form ChannelNotifyProps MHEvent Name
form
    TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState -> Identity TeamState)
 -> ChatState -> Identity ChatState)
-> ((Maybe (Form ChannelNotifyProps MHEvent Name)
     -> Identity (Maybe (Form ChannelNotifyProps MHEvent Name)))
    -> TeamState -> Identity TeamState)
-> (Maybe (Form ChannelNotifyProps MHEvent Name)
    -> Identity (Maybe (Form ChannelNotifyProps MHEvent Name)))
-> ChatState
-> Identity ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe (Form ChannelNotifyProps MHEvent Name)
 -> Identity (Maybe (Form ChannelNotifyProps MHEvent Name)))
-> TeamState -> Identity TeamState
Lens' TeamState (Maybe (Form ChannelNotifyProps MHEvent Name))
tsNotifyPrefs ((Maybe (Form ChannelNotifyProps MHEvent Name)
  -> Identity (Maybe (Form ChannelNotifyProps MHEvent Name)))
 -> ChatState -> Identity ChatState)
-> Maybe (Form ChannelNotifyProps MHEvent Name) -> MH ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Form ChannelNotifyProps MHEvent Name
-> Maybe (Form ChannelNotifyProps MHEvent Name)
forall a. a -> Maybe a
Just Form ChannelNotifyProps MHEvent Name
updatedForm
    Bool -> MH Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True

editNotifyPrefsKeybindings :: TeamId -> KeyConfig -> KeyHandlerMap
editNotifyPrefsKeybindings :: TeamId -> KeyConfig -> KeyHandlerMap
editNotifyPrefsKeybindings TeamId
tId = [KeyEventHandler] -> KeyConfig -> KeyHandlerMap
mkKeybindings (TeamId -> [KeyEventHandler]
editNotifyPrefsKeyHandlers TeamId
tId)

editNotifyPrefsKeyHandlers :: TeamId -> [KeyEventHandler]
editNotifyPrefsKeyHandlers :: TeamId -> [KeyEventHandler]
editNotifyPrefsKeyHandlers TeamId
tId =
    [ KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
CancelEvent Text
"Close channel notification preferences" (MH () -> KeyEventHandler) -> MH () -> KeyEventHandler
forall a b. (a -> b) -> a -> b
$
        TeamId -> MH ()
exitEditNotifyPrefsMode TeamId
tId
    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
FormSubmitEvent Text
"Save channel notification preferences" (MH () -> KeyEventHandler) -> MH () -> KeyEventHandler
forall a b. (a -> b) -> a -> b
$ do
        ChatState
st <- Getting ChatState ChatState ChatState -> MH ChatState
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting ChatState ChatState ChatState
forall a. a -> a
id
        TeamId -> (ChannelId -> ClientChannel -> MH ()) -> MH ()
withCurrentChannel TeamId
tId ((ChannelId -> ClientChannel -> MH ()) -> MH ())
-> (ChannelId -> ClientChannel -> MH ()) -> MH ()
forall a b. (a -> b) -> a -> b
$ \ChannelId
cId ClientChannel
_ -> do
            let form :: Form ChannelNotifyProps MHEvent Name
form = Maybe (Form ChannelNotifyProps MHEvent Name)
-> Form ChannelNotifyProps MHEvent Name
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe (Form ChannelNotifyProps MHEvent Name)
 -> Form ChannelNotifyProps MHEvent Name)
-> Maybe (Form ChannelNotifyProps MHEvent Name)
-> Form ChannelNotifyProps MHEvent Name
forall a b. (a -> b) -> a -> b
$ ChatState
stChatState
-> Getting
     (Maybe (Form ChannelNotifyProps MHEvent Name))
     ChatState
     (Maybe (Form ChannelNotifyProps MHEvent Name))
-> Maybe (Form ChannelNotifyProps MHEvent Name)
forall s a. s -> Getting a s a -> a
^.TeamId -> Lens' ChatState TeamState
csTeam(TeamId
tId)((TeamState
  -> Const (Maybe (Form ChannelNotifyProps MHEvent Name)) TeamState)
 -> ChatState
 -> Const (Maybe (Form ChannelNotifyProps MHEvent Name)) ChatState)
-> ((Maybe (Form ChannelNotifyProps MHEvent Name)
     -> Const
          (Maybe (Form ChannelNotifyProps MHEvent Name))
          (Maybe (Form ChannelNotifyProps MHEvent Name)))
    -> TeamState
    -> Const (Maybe (Form ChannelNotifyProps MHEvent Name)) TeamState)
-> Getting
     (Maybe (Form ChannelNotifyProps MHEvent Name))
     ChatState
     (Maybe (Form ChannelNotifyProps MHEvent Name))
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Maybe (Form ChannelNotifyProps MHEvent Name)
 -> Const
      (Maybe (Form ChannelNotifyProps MHEvent Name))
      (Maybe (Form ChannelNotifyProps MHEvent Name)))
-> TeamState
-> Const (Maybe (Form ChannelNotifyProps MHEvent Name)) TeamState
Lens' TeamState (Maybe (Form ChannelNotifyProps MHEvent Name))
tsNotifyPrefs
            DoAsyncChannelMM ()
forall a. DoAsyncChannelMM a
doAsyncChannelMM AsyncPriority
Preempt ChannelId
cId
              (\Session
s ChannelId
_ -> ChannelId -> UserId -> ChannelNotifyProps -> Session -> IO ()
MM.mmUpdateChannelNotifications ChannelId
cId (ChatState -> UserId
myUserId ChatState
st) (Form ChannelNotifyProps MHEvent Name -> ChannelNotifyProps
forall s e n. Form s e n -> s
formState Form ChannelNotifyProps MHEvent Name
form) Session
s)
              (\ChannelId
_ ()
_ -> Maybe (MH ())
forall a. Maybe a
Nothing)
            TeamId -> MH ()
exitEditNotifyPrefsMode TeamId
tId
    ]