module Engine.Events.MouseButton
  ( ClickHandler
  , callback
  , handler
  ) where

import RIO

import Geomancy (Vec2)
import UnliftIO.Resource (ReleaseKey)

import Engine.Events.Sink (Sink)
import Engine.Types (StageRIO)
import Engine.Window.MouseButton (ModifierKeys, MouseButton, MouseButtonState)
import Engine.Window.MouseButton qualified as MouseButton
import Engine.Worker qualified as Worker

type ClickHandler e st =
  Sink e st ->
  Vec2 ->
  (ModifierKeys, MouseButtonState, MouseButton) ->
  StageRIO st ()

callback
  :: ( Worker.HasOutput cursor
     , Worker.GetOutput cursor ~ Vec2
     )
  => cursor
  -> ClickHandler e st
  -------------------------
  -> Sink e st
  -> StageRIO st ReleaseKey
callback :: forall cursor e st.
(HasOutput cursor, GetOutput cursor ~ Vec2) =>
cursor -> ClickHandler e st -> Sink e st -> StageRIO st ReleaseKey
callback cursor
cursorP ClickHandler e st
eventHandler = forall st. Callback st -> StageRIO st ReleaseKey
MouseButton.callback forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall cursor e st.
(HasOutput cursor, GetOutput cursor ~ Vec2) =>
cursor
-> ClickHandler e st
-> Sink e st
-> (ModifierKeys, MouseButtonState, MouseButton)
-> StageRIO st ()
handler cursor
cursorP ClickHandler e st
eventHandler

handler
  :: ( Worker.HasOutput cursor
     , Worker.GetOutput cursor ~ Vec2
     )
  => cursor
  -> ClickHandler e st
  -> Sink e st
  -> (ModifierKeys, MouseButtonState, MouseButton)
  -> StageRIO st ()
handler :: forall cursor e st.
(HasOutput cursor, GetOutput cursor ~ Vec2) =>
cursor
-> ClickHandler e st
-> Sink e st
-> (ModifierKeys, MouseButtonState, MouseButton)
-> StageRIO st ()
handler cursor
cursorP ClickHandler e st
eventHandler Sink e st
sink (ModifierKeys, MouseButtonState, MouseButton)
buttonEvent = do
  Vec2
cursorPos <- forall worker (m :: * -> *).
(HasOutput worker, MonadIO m) =>
worker -> m (GetOutput worker)
Worker.getOutputData cursor
cursorP
  forall (m :: * -> *) env.
(MonadIO m, MonadReader env m, HasLogFunc env, HasCallStack) =>
Utf8Builder -> m ()
logDebug forall a b. (a -> b) -> a -> b
$ Utf8Builder
"MouseButton event: " forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> Utf8Builder
displayShow (Vec2
cursorPos, (ModifierKeys, MouseButtonState, MouseButton)
buttonEvent)
  ClickHandler e st
eventHandler Sink e st
sink Vec2
cursorPos (ModifierKeys, MouseButtonState, MouseButton)
buttonEvent