{-# LANGUAGE OverloadedStrings #-}

module YampaSDL2.Backend.SDL
  (sdlBackend) where

import qualified SDL
import SDL.Vect
import Control.Concurrent.MVar
import FRP.Yampa
import Data.Text (pack)

import qualified YampaSDL2.Backend.Init as Init
import qualified YampaSDL2.Backend.Input as Input
import qualified YampaSDL2.Backend.Output as Output
import qualified YampaSDL2.Backend.Parse as Parse
import qualified YampaSDL2.Backend.Close as Close

import YampaSDL2.AppOutput (AppOutput)
import YampaSDL2.Backend

-- | Set up SDL
sdlBackend ::
     BackendConfiguration -> IO (Backend (Event SDL.EventPayload) AppOutput)
sdlBackend bc = do
  SDL.initialize [SDL.InitVideo]
  window <- SDL.createWindow (pack $ windowName bc) windowConf
  SDL.showWindow window
  renderer <- SDL.createRenderer window (-1) SDL.defaultRenderer
  lastInteraction <- newMVar =<< SDL.time
  lastGraphics <- newMVar Nothing
  lastRender <- newMVar 0
  imageTextures <- newMVar []
  return $
    Backend
    { initAction = Init.initAction
    , inputAction = Input.inputAction lastInteraction
    , outputAction = Output.outputAction (fps bc) imageTextures lastRender lastGraphics window renderer
    , parseInput = Parse.parseInput
    , closeAction = Close.closeAction renderer window
    }
  where
    windowConf =
      SDL.defaultWindow
      { SDL.windowInitialSize =
          V2 (fromIntegral (windowWidth bc)) (fromIntegral (windowHeight bc))
        , SDL.windowResizable = windowResizable (bc)
      }