#include "player_camera.h"
#include "macros.h"
#include "player_input.h"

void PlayerCamera::_bind_methods() {
}

void PlayerCamera::on_look_input(Vector2 input) {
	GETSET(rotation, {
		rotation.x = CLAMP(rotation.x + input.y, -Math::PI / 2.0, Math::PI / 2.0);
	});
}

void PlayerCamera::update_fov() {
	if (!Engine::get_singleton()->is_editor_hint() && is_ready()) {
		set_fov(this->base_fov * this->fov_factor);
	}
}

void PlayerCamera::ready() {
	PlayerInput *input{ cast_to<PlayerInput>(get_node(NodePath("%PlayerInput"))) };
	input->connect(PlayerInput::sig_look_input, callable_mp(this, &self_type::on_look_input));
	this->base_fov = get_fov();
}

void PlayerCamera::_notification(int what) {
	if (Engine::get_singleton()->is_editor_hint()) {
		return;
	}
	switch (what) {
		case NOTIFICATION_READY:
			ready();
			return;
	}
}

void PlayerCamera::set_fov_factor(float value) {
	this->fov_factor = value;
	update_fov();
}

float PlayerCamera::get_fov_factor() const {
	return this->fov_factor;
}

void PlayerCamera::recoil(float r) {
	GETSET(rotation, {
		rotation.x = CLAMP(rotation.x + r, -Math::PI / 2.0, Math::PI / 2.0);
	});
}
