-- | Contains the SDL engine types.
module Helm.Engine.SDL.Engine
  (
    -- * Types
    SDLEngine(..)
  , SDLEngineConfig(..)
  ) where

import           Data.Word (Word32)

import           FRP.Elerea.Param (Signal, SignalGen)
import           Linear.V2 (V2)
import qualified SDL.Video as Video
import qualified SDL.Video.Renderer as Renderer

import           Helm.Engine (MouseButton, Key)

-- | Represents the configuration to run the SDL engine with.
-- Use 'defaultConfig' and then only change the necessary fields.
data SDLEngineConfig = SDLEngineConfig
  { windowDimensions :: V2 Int
  , windowIsFullscreen :: !Bool
  , windowIsResizable :: !Bool
  , windowTitle :: !String
  }

-- | Represents the SDL engine's internal state.
data SDLEngine = SDLEngine
  { window :: Video.Window
  , renderer :: Video.Renderer
  , texture :: !Renderer.Texture
  , engineConfig :: SDLEngineConfig
  , lastMousePress :: Maybe (Word32, V2 Double)

  , mouseMoveEventSignal :: SignalGen SDLEngine (Signal [V2 Int])
  , mouseMoveEventSink :: V2 Int -> IO ()
  , mouseDownEventSignal :: SignalGen SDLEngine (Signal [(MouseButton, V2 Int)])
  , mouseDownEventSink :: (MouseButton, V2 Int) -> IO ()
  , mouseUpEventSignal :: SignalGen SDLEngine (Signal [(MouseButton, V2 Int)])
  , mouseUpEventSink :: (MouseButton, V2 Int) -> IO ()
  , mouseClickEventSignal :: SignalGen SDLEngine (Signal [(MouseButton, V2 Int)])
  , mouseClickEventSink :: (MouseButton, V2 Int) -> IO ()

  , keyboardDownEventSignal :: SignalGen SDLEngine (Signal [Key])
  , keyboardDownEventSink :: Key -> IO ()
  , keyboardUpEventSignal :: SignalGen SDLEngine (Signal [Key])
  , keyboardUpEventSink :: Key -> IO ()
  , keyboardPressEventSignal :: SignalGen SDLEngine (Signal [Key])
  , keyboardPressEventSink :: Key -> IO ()

  , windowResizeEventSignal :: SignalGen SDLEngine (Signal [V2 Int])
  , windowResizeEventSink :: V2 Int -> IO ()
  }