#pragma once

#include <camera/camera.hpp>

namespace lt {

class SceneCamera: public Camera
{
public:
	enum class ProjectionType
	{
		Orthographic = 0,
		Perspetcive = 1
	};

	struct OrthographicSpecification
	{
		float size;

		float near_plane;

		float far_plane;
	};

	struct PerspectiveSpecification
	{
		float vertical_fov;

		float near_plane;

		float far_plane;
	};

	SceneCamera();

	void set_viewport_size(unsigned int width, unsigned int height);

	void set_projection_type(ProjectionType projection_type);

	void set_orthographic_size(float size);

	void set_orthographic_far_plane(float far_plane);

	void set_orthographic_near_plane(float near_plane);

	void set_perspective_vertical_fov(float vertical_fov);

	void set_perspective_far_plane(float far_plane);

	void set_perspective_near_plane(float near_plane);

	[[nodiscard]] auto get_orthographic_size() const -> float
	{
		return m_orthographic_specification.size;
	}

	[[nodiscard]] auto get_orthographic_far_plane() const -> float
	{
		return m_orthographic_specification.far_plane;
	}

	[[nodiscard]] auto get_orthographic_near_plane() const -> float
	{
		return m_orthographic_specification.near_plane;
	}

	[[nodiscard]] auto get_perspective_vertical_fov() const -> float
	{
		return m_perspective_specification.vertical_fov;
	}

	[[nodiscard]] auto get_perspective_far_plane() const -> float
	{
		return m_perspective_specification.far_plane;
	}

	[[nodiscard]] auto get_perspective_near_plane() const -> float
	{
		return m_perspective_specification.near_plane;
	}

	[[nodiscard]] auto get_projection_type() const -> ProjectionType
	{
		return m_projection_type;
	}


private:
	OrthographicSpecification m_orthographic_specification;

	PerspectiveSpecification m_perspective_specification;

	float m_aspect_ratio;

	ProjectionType m_projection_type { ProjectionType::Orthographic };

	void calculate_projection();
};

} // namespace lt
