#include "game.h"

void initGame(Game * game) {
	// Window.
	InitWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Killa Facsista");

	// Settings.
	initSettings(&game->settings);
	applySettings(&game->settings);

	// Assets.
	LoadAssets(&game->assets);

	// Screen id.
	game->screenId = SCREEN_GAME;

	// Main menu.
	initMainMenu(game);

	// Camera.
	initPlayerCamera(&game->playerCamera);

	DisableCursor();
	
	// World.
	initWorld(&game->world);

	// Debug.
	// Add player.
	//addEntityToWorld(
	//	&game->world,
	//	createEntity(ENTITY_ANTIFA, game)
	//);

	WorldEntry entries[] = {
		(WorldEntry){ENTITY_ANTIFA, Vector3Zero(), QuaternionIdentity()},
		(WorldEntry){ENTITY_SOLDATO, (Vector3){10.0, 10.0, 10.0}, QuaternionIdentity()},
		(WorldEntry){ENTITY_SOLDATO, (Vector3){20.0, 20.0, 20.0}, QuaternionIdentity()},
		(WorldEntry){ENTITY_SOLDATO, (Vector3){30.0, 30.0, 30.0}, QuaternionIdentity()},
		(WorldEntry){ENTITY_SOLDATO, (Vector3){40.0, 40.0, 40.0}, QuaternionIdentity()}
	};

	addEntriesToWorld(
		&game->world,
		game,
		entries,
		sizeof(entries) / sizeof(WorldEntry)
	);

	puts("v");

	for (int i = 0; i < game->world.vacantIdsCount; ++i)
		printf("%d\n", game->world.vacantIds[i]);

	puts("l");

	for (int i = 0; i < game->world.lookUpSize; ++i) {
		printf("%d\n", game->world.lookUp[i]);

		Entity * e = getEntityFromWorld(game->world, i);

		if (e == NULL) {
			puts("null");
			continue;
		}

		if (e->id == i)
			printf("good %x\n", e->fingerprint);
		else
			printf("bad %d\n", e->id);
	}
}

void closeGame(Game * game) {
	unloadAssets(&game->assets);
	freeWorld(&game->world);

	// Close window last.
	CloseWindow();
}

void updateGame(Game * game) {
	BeginDrawing();

	switch (game->screenId) {
		case SCREEN_MAIN_MENU:
			updateMainMenu(game);
			break;
		case SCREEN_GAME:
			updateGameScreen(game);
			break;
		default:
			break;
	}

	if (game->settings.drawFps)
		DrawFPS(5, 5);

	EndDrawing();
}