#ifndef ARE_INCLUDE_SCENE_LIGHT_H
#define ARE_INCLUDE_SCENE_LIGHT_H

#include "basic/types.h"

namespace are {

/// @brief Light type enumeration
enum class LightType {
	DIRECTIONAL = 0,
	POINT = 1,
	SPOT = 2
};

/// @brief Light source
class Light {
public:
	/// @brief Constructor
	Light();

	/// @brief Destructor
	~Light();

	/// @brief Set light type
	/// @param type Light type
	void set_type(LightType type);

	/// @brief Set light position (for point and spot lights)
	/// @param position Light position
	void set_position(const Vec3 &position);

	/// @brief Set light direction (for directional and spot lights)
	/// @param direction Light direction
	void set_direction(const Vec3 &direction);

	/// @brief Set light color
	/// @param color Light color
	void set_color(const Vec3 &color);

	/// @brief Set light intensity
	/// @param intensity Light intensity
	void set_intensity(float intensity);

	/// @brief Set light range (for point and spot lights)
	/// @param range Light range
	void set_range(float range);

	/// @brief Set spot light angles
	/// @param inner_angle Inner cone angle in degrees
	/// @param outer_angle Outer cone angle in degrees
	void set_spot_angles(float inner_angle, float outer_angle);

	/// @brief Get light type
	/// @return Light type
	LightType get_type() const {
		return type_;
	}

	/// @brief Get light position
	/// @return Light position
	const Vec3 &get_position() const {
		return position_;
	}

	/// @brief Get light direction
	/// @return Light direction
	const Vec3 &get_direction() const {
		return direction_;
	}

	/// @brief Get light color
	/// @return Light color
	const Vec3 &get_color() const {
		return color_;
	}

	/// @brief Get light intensity
	/// @return Light intensity
	float get_intensity() const {
		return intensity_;
	}

	/// @brief Get light range
	/// @return Light range
	float get_range() const {
		return range_;
	}

	/// @brief Get spot light inner angle
	/// @return Inner angle in radians
	float get_inner_angle() const {
		return inner_angle_;
	}

	/// @brief Get spot light outer angle
	/// @return Outer angle in radians
	float get_outer_angle() const {
		return outer_angle_;
	}

private:
	LightType type_;
	Vec3 position_;
	Vec3 direction_;
	Vec3 color_;
	float intensity_;
	float range_;
	float inner_angle_;
	float outer_angle_;
};

} // namespace are

#endif // ARE_INCLUDE_SCENE_LIGHT_H
