#pragma once

#ifndef LIGHTSOURCE_H
#define LIGHTSOURCE_H

#include <glm/glm.hpp>
#include <glm/vec2.hpp>
#include <glm/vec3.hpp>

namespace Vivid2D::util {

    struct VIVID_2D_MYDLL_API Color {
        int r, g, b;
        Color() : r(255), g(255), b(255) {}
        Color(int red, int green, int blue) : r(red), g(green), b(blue) {}
    };

    /**
     * 光源系统
     */
    class VIVID_2D_MYDLL_API LightSource {
    public:
        // 构造函数：点光源/常规光源
        LightSource(const glm::vec2& pos, const Color& color, float intensity);

        // 构造函数：环境光
        LightSource(const Color& color, float intensity);

        // 静态工具函数：将 Color 转换为 glm::vec3 (归一化到 0.0-1.0)
        static glm::vec3 colorToVector3f(const Color& color);

        // 静态工具函数：将 glm::vec3 (0.0-1.0) 转换为 Color (0-255)
        static Color vector3fToColor(const glm::vec3& colorVec);

        // Getter 方法
        const glm::vec2& getPosition() const { return position; }
        const glm::vec3& getColor() const { return color; }
        float getIntensity() const { return intensity; }
        bool isEnabled() const { return enabled; }
        bool isAmbient() const { return m_isAmbient; }

        // Setter 方法
        void setEnabled(bool enabled) { this->enabled = enabled; }
        void setAmbient(bool ambient) { this->m_isAmbient = ambient; }

        bool operator==(const LightSource& other) const {
            return position == other.position &&
                color == other.color &&
                intensity == other.intensity &&
                enabled == other.enabled &&
                m_isAmbient == other.m_isAmbient;
        }
    private:
        glm::vec2 position; // 光源位置
        glm::vec3 color;    // 光源颜色 (RGB, 0.0 - 1.0)
        float intensity;    // 光源强度
        bool enabled = true;
        bool m_isAmbient = false; // 是否为环境光
    };

} // namespace Vivid2D

#endif // LIGHTSOURCE_H