#pragma once

#include <extra2d/core/module.h>
#include <extra2d/graphics/core/render_backend.h>
#include <extra2d/platform/window_module.h>
#include <functional>
#include <typeindex>

namespace extra2d {

/**
 * @brief 渲染模块配置结构
 */
struct RenderCfg {
    std::string backend;
    int targetFPS;
    bool vsync;
    int multisamples;
    int priority;

    RenderCfg()
        : backend("")
        , targetFPS(60)
        , vsync(true)
        , multisamples(0)
        , priority(10)
    {}
};

/**
 * @brief 渲染模块
 * 管理渲染后端，自动根据窗口后端选择兼容的渲染器
 */
class RenderModule : public Module {
public:
    /**
     * @brief 构造函数（Lambda 配置）
     * @param configFn 配置函数
     */
    explicit RenderModule(std::function<void(RenderCfg&)> configFn);

    /**
     * @brief 析构函数
     */
    ~RenderModule() override;

    bool init() override;
    void shutdown() override;
    bool ok() const override { return initialized_; }
    const char* name() const override { return "render"; }
    int priority() const override { return cfg_.priority; }

    /**
     * @brief 获取依赖
     * @return 依赖模块类型列表
     */
    std::vector<std::type_index> deps() const override {
        return {std::type_index(typeid(WindowModule))};
    }

    /**
     * @brief 获取渲染器
     * @return 渲染后端指针
     */
    RenderBackend* renderer() const { return renderer_.get(); }

private:
    RenderCfg cfg_;
    UniquePtr<RenderBackend> renderer_;
    bool initialized_ = false;
};

} // namespace extra2d
