////////////////////////////////////////////////////////////////////////////////
// Filename: cameraclass.h
////////////////////////////////////////////////////////////////////////////////
#ifndef _CAMERACLASS_H_
#define _CAMERACLASS_H_


//////////////
// INCLUDES //
//////////////
#include <directxmath.h>
using namespace DirectX;


////////////////////////////////////////////////////////////////////////////////
// Class name: camera_class
////////////////////////////////////////////////////////////////////////////////
class camera_class
{
public:
	/**
	 * @brief Default constructor for camera_class.
	 * Initializes the camera position and rotation to zero.
	 */
	camera_class();
	camera_class(const camera_class&);
	~camera_class();

	/** 
	 * @brief Sets the position of the camera in 3D space.
	 * 
	 * @param position_x The x-coordinate of the camera's position.
	 * @param position_y The y-coordinate of the camera's position.
	 * @param position_z The z-coordinate of the camera's position.
	 */
	void set_position(float, float, float);
	/**
	 * @brief Sets the rotation of the camera in 3D space.
	 * 
	 * @param rotation_x The rotation around the x-axis in degrees.
	 * @param rotation_y The rotation around the y-axis in degrees.
	 * @param rotation_z The rotation around the z-axis in degrees.
	 */
	void set_rotation(float, float, float);

	/**
	 * @brief Gets the current position of the camera.
	 * 
	 * @return A 3D vector representing the camera's position.
	 */
	XMFLOAT3 get_position();
	/**
	 * @brief Gets the current rotation of the camera.
	 * 
	 * @return A 3D vector representing the camera's rotation in degrees.
	 */
	XMFLOAT3 get_rotation();


	/**
	 * @brief Updates the camera's view matrix based on its position and rotation.
	 * This method recalculates the view matrix to reflect the current camera state.
	 */
	void render();
	/**
	 * @brief Retrieves the current view matrix of the camera.
	 * 
	 * @return The view matrix representing the camera's orientation and position.
	 */
	XMMATRIX get_view_matrix(XMMATRIX& view_matrix) const;

	/**
	 * @brief Renders the reflection of the scene from the camera's perspective.
	 * 
	 * @param reflection_plane_y The y-coordinate of the reflection plane.
	 */
	void render_reflection(float);
	/**
	 * @brief Retrieves the reflection view matrix of the camera.
	 * 
	 * @param reflection_view_matrix The matrix to store the reflection view matrix.
	 */
	void get_reflection_view_matrix(XMMATRIX&) const;

private:
	float position_x_, position_y_, position_z_;
	float rotation_x_, rotation_y_, rotation_z_;
	XMMATRIX view_matrix_;
	XMMATRIX reflection_view_matrix_;

};

#endif