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 = Callback st -> StageRIO st ReleaseKey
forall st. Callback st -> StageRIO st ReleaseKey
MouseButton.callback (Callback st -> StageRIO st ReleaseKey)
-> (Sink e st -> Callback st)
-> Sink e st
-> StageRIO st ReleaseKey
forall b c a. (b -> c) -> (a -> b) -> a -> c
. cursor -> ClickHandler e st -> Sink e st -> Callback st
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 <- cursor -> RIO (App GlobalHandles st) (GetOutput cursor)
forall worker (m :: * -> *).
(HasOutput worker, MonadIO m) =>
worker -> m (GetOutput worker)
Worker.getOutputData cursor
cursorP
  Utf8Builder -> StageRIO st ()
forall (m :: * -> *) env.
(MonadIO m, MonadReader env m, HasLogFunc env, HasCallStack) =>
Utf8Builder -> m ()
logDebug (Utf8Builder -> StageRIO st ()) -> Utf8Builder -> StageRIO st ()
forall a b. (a -> b) -> a -> b
$ Utf8Builder
"MouseButton event: " Utf8Builder -> Utf8Builder -> Utf8Builder
forall a. Semigroup a => a -> a -> a
<> (Vec2, (ModifierKeys, MouseButtonState, MouseButton))
-> Utf8Builder
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