#include "player_controller.h"
#include "physics.h"

void initialize_player(PlayerState *player) {
	player->position = (Vector3){0};
	player->velocity = (Vector3){0};
	player->acceleration = (Vector3){0};
	player->yaw = 0.0f;
	player->pitch = 0.0f;
	player->isGrounded = false;
	player->isSprinting = false;
	player->isSliding = false;
}

void update_player_movement(PlayerState *player, InputState *input, float delta) {
	Vector3 wishDir = calculate_wish_direction(input, player->yaw);
	float wishSpeed = player->isSprinting ? PLAYER_SPRINT_SPEED : PLAYER_WALK_SPEED;

	if (player->isGrounded) {
		if (input->jump) {
			player->velocity.y = PLAYER_JUMP_VELOCITY;
			player->isGrounded = false;
		}
		player->velocity = ground_accelerate(player->velocity, wishDir, wishSpeed, delta);
		if (input->crouch) player->isSliding = true;
	} else {
		player->velocity = air_accelerate(player->velocity, wishDir, wishSpeed, delta);
	}

	player->velocity = apply_friction(player->velocity, delta, player->isGrounded);
	player->velocity = apply_gravity(player->velocity, delta);
	player->position = Vector3Add(player->position, Vector3Scale(player->velocity, delta));
}
