{-# LANGUAGE ForeignFunctionInterface #-}

module Init where

import Affection as A

import SDL (($=))
import qualified SDL

import qualified Graphics.Rendering.OpenGL as GL

import NanoVG hiding (V2(..), V3(..))

import Linear

import Control.Monad (when)
import Control.Monad.IO.Class (liftIO)

import Control.Concurrent.STM

import qualified Data.Set as S
import qualified Data.Map.Strict as M
import Data.Ecstasy
import Data.Maybe

import System.Exit (exitFailure)

import Foreign.C.Types (CInt(..))

import Types

import Floorplan

import Debug.Trace

foreign import ccall unsafe "glewInit"
  glewInit :: IO CInt

load :: IO UserData
load = do
  _ <- glewInit
  nvg <- createGL3 (S.fromList [Antialias, StencilStrokes])
  subs <- Subsystems
    <$> (Window <$> newTVarIO [])
    <*> (Mouse <$> newTVarIO [])
  (ws, _) <- yieldSystemT (0, defWorld) (return ())
  mwallasc <- createImage nvg (FileName "assets/walls/wall_asc.png") 0
  mwalldesc <- createImage nvg (FileName "assets/walls/wall_desc.png") 0
  mwallcornern <- createImage nvg (FileName "assets/walls/wall_corner_n.png") 0
  mwallcornere <- createImage nvg (FileName "assets/walls/wall_corner_e.png") 0
  mwallcorners <- createImage nvg (FileName "assets/walls/wall_corner_s.png") 0
  mwallcornerw <- createImage nvg (FileName "assets/walls/wall_corner_w.png") 0
  mwalltne <- createImage nvg (FileName "assets/walls/wall_t_ne.png") 0
  mwalltse <- createImage nvg (FileName "assets/walls/wall_t_se.png") 0
  mwalltsw <- createImage nvg (FileName "assets/walls/wall_t_sw.png") 0
  mwalltnw <- createImage nvg (FileName "assets/walls/wall_t_nw.png") 0
  mwallcross <- createImage nvg (FileName "assets/walls/wall_cross.png") 0
  mmiscbox1 <- createImage nvg (FileName "assets/misc/box1.png") 0
  _ <- createFont nvg "bedstead"
    (FileName "assets/font/Bedstead-Semicondensed.ttf")
  let mimgs = [ mwallasc, mwalldesc,
        mwallcornern, mwallcornere, mwallcorners, mwallcornerw,
        mwalltne, mwalltse, mwalltsw, mwalltnw, mwallcross,
        mmiscbox1
        ]
  when (any isNothing mimgs) $ do
    logIO Error "Failed to load walls"
    exitFailure
  let imgs = zipWith (\a b -> (a, fromJust b)) [ImgWallAsc ..] mimgs
  return UserData
    { state       = Menu
    , subsystems  = subs
    , assetImages = M.fromList
      imgs
    , assetFonts  = M.fromList
      [ (FontBedstead, "bedstead")
      ]
    , nano        = nvg
    , uuid        = []
    , worldState  = ws
    , stateData   = None
    }
