package game

import (
	"log"
	"mvvasilev/last_light/render"
	"os"
	"time"
)

const TICK_RATE int64 = 50 // tick every 50ms ( 20 ticks per second )

type GameContext struct {
	renderContext *render.RenderContext

	game *Game
}

func CreateGameContext() *GameContext {
	gc := new(GameContext)

	rc, err := render.CreateRenderContext()

	if err != nil {
		log.Fatalf("%~v", err)
	}

	gc.renderContext = rc
	gc.game = CreateGame()

	return gc
}

func (gc *GameContext) Run() {
	lastTick := time.Now()

	for {
		deltaTime := 1 + time.Since(lastTick).Microseconds()
		lastTick = time.Now()

		for _, e := range gc.renderContext.CollectInputEvents() {
			gc.game.Input(e)
		}

		stop := !gc.game.Tick(deltaTime)

		if stop {
			gc.renderContext.Stop()
			os.Exit(0)
			break
		}

		drawables := gc.game.CollectDrawables()
		gc.renderContext.Draw(deltaTime, drawables)
	}
}