#include "Camera.h"

Camera::Camera()
    : position(0.0f, 0.0f, 5.0f),
      yaw(-90.0f),
      pitch(0.0f),
      fov(45.0f),
      aspect(4.0f / 3.0f),
      nearPlane(0.1f),
      farPlane(100.0f)
{
}

Camera::~Camera() {
}

void Camera::Update(float deltaTime) {
    // For now, we do not modify the camera over time.
    // Input or smoothing could be handled here.
}

void Camera::SetPosition(const glm::vec3& pos) {
    position = pos;
}

void Camera::SetRotation(float newYaw, float newPitch) {
    yaw = newYaw;
    pitch = newPitch;
}

glm::mat4 Camera::GetViewMatrix() const {
    // Compute the forward vector from yaw and pitch.
    glm::vec3 front;
    front.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
    front.y = sin(glm::radians(pitch));
    front.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));
    front = glm::normalize(front);
    return glm::lookAt(position, position + front, glm::vec3(0, 1, 0));
}

glm::mat4 Camera::GetProjectionMatrix() const {
    return glm::perspective(glm::radians(fov), aspect, nearPlane, farPlane);
}

void Camera::SetPerspective(float fov, float aspect, float nearPlane, float farPlane) {
    this->fov = fov;
    this->aspect = aspect;
    this->nearPlane = nearPlane;
    this->farPlane = farPlane;
}

glm::vec3 Camera::GetPosition() const {
    return position;
}

float Camera::GetYaw() const {
    return yaw;
}

float Camera::GetPitch() const {
    return pitch;
}