#include "gameScreen.h"
#include "game.h"
#include "world.h"
#include "bullets.h"
#include "assets.h"

void initGameScreenGui(GameScreen * gameScreen) {
	float width = GetScreenWidth();
	float height = GetScreenHeight();

	// It is kind of terrible but works.
	gameScreen->infoText = (Vector2){0.0, height / 1.5};

	// Gyroscope indeed
	initGyroscope(&gameScreen->gyroscope);

	// Radar indeed.
	initRadar(&gameScreen->radar);
}

void initGameScreen(GameScreen * gameScreen) {
	initGameScreenGui(gameScreen);
}

void freeGameScreen(GameScreen * gameScreen) {
	closeGyroscope(&gameScreen->gyroscope);
	closeRadar(&gameScreen->radar);
}

void drawCrossHair(float size, float thick, Color color) {
	Vector3 center = (Vector3){GetScreenWidth() / 2.0, GetScreenHeight() / 2.0};

	// Left to right.
	DrawLineEx(
		(Vector2){center.x - size, center.y},
		(Vector2){center.x + size, center.y},
		thick,
		color
	);

	// Top to bottom.
	DrawLineEx(
		(Vector2){center.x, center.y - size},
		(Vector2){center.x, center.y + size},
		thick,
		color
	);
}

void drawGameScreenGui(Game * game) {
	GameScreen * gameScreen = &game->gameScreen;
	Entity * player = getEntityFromWorld(game->world, 0);

	// Hello reader. I fucking hate you!
	size_t bufSize = 255;
	char buf[bufSize];

	// Draw cross hair.
	drawCrossHair(10.0, 2.0, BLUE);

	Vector3 position = player->position;
	Vector3 velocity = player->velocity.velocity;

	// Format text.
	snprintf(
		buf,
		bufSize,
		"Health %.2f\n\nX %.2f\nY %.2f\nZ %.2f\n\nSpeed %.2f",
		player->health,
		position.x,
		position.y,
		position.z,
		Vector3Length(velocity)
	);

	// Draw info text.
	DrawText(
		buf,
		gameScreen->infoText.x,
		gameScreen->infoText.y,
		GAME_SCREEN_TEXT_SIZE,
		GREEN
	);

	drawGyroscope(game, &gameScreen->gyroscope);
	drawRadar(game, &gameScreen->radar);
}

void updateGameScreen(Game * game) {
	ClearBackground(BLACK);

	drawGameScreenGui(game);

	// Update world.
	updateWorld(&game->world, game);

	// Camera.
	updatePlayerCamera(&game->playerCamera, game);

	// Draw.
	BeginMode3D(game->playerCamera);

	DrawGrid(50, 25.0);

	// Draw world.
	drawWorld(&game->world, game);

	EndMode3D();
}

void openGameScreen(Game * game) {
	game->screenId = SCREEN_GAME;

	if (game->settings.lockMouse)
		DisableCursor();
}

void closeGameScreen(Game * game) {
	if (game->settings.lockMouse)
		EnableCursor();
}