{-# OPTIONS_HADDOCK hide #-}

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE LambdaCase #-}

module Imj.Game.Hamazed.Loop.Event
    ( needsRendering
    , getEvent
    -- * Reexports
    , module Imj.Game.Hamazed.Loop.Event.Types
    ) where

import           Imj.Prelude

import           Imj.Game.Hamazed.Level
import           Imj.Game.Hamazed.Loop.Deadlines
import           Imj.Game.Hamazed.Loop.Event.Types
import           Imj.Game.Hamazed.Types
import           Imj.Timing

-- | Tells if after handling an 'Event' we should render or not.
needsRendering :: Event -> Bool
needsRendering = \case
  (Action Ship _) -> False -- When the ship accelerates, nothing changes visually
  _ -> True

getEvent :: GameState -> IO Event
getEvent state = do
  mayEvent <- getEvent' state
  case mayEvent of
    Just event -> return event
    Nothing -> getEvent state

getEvent' :: GameState -> IO (Maybe Event)
getEvent' state@(GameState _ _ _ _ level _) = do
  t <- getSystemTime
  let deadline = getNextDeadline state t
  getEventForMaybeDeadline level deadline t