#pragma once

#include <extra2d/core/types.h>
#include <string>
#include <vector>
#include <typeindex>

namespace extra2d {

class Application;

/**
 * @brief 模块基类
 * 所有模块必须继承此类
 */
class Module {
public:
    virtual ~Module() = default;
    
    /**
     * @brief 初始化模块
     * @return 初始化成功返回 true
     */
    virtual bool init() = 0;
    
    /**
     * @brief 关闭模块
     */
    virtual void shutdown() = 0;
    
    /**
     * @brief 检查模块是否已初始化
     * @return 已初始化返回 true
     */
    virtual bool ok() const = 0;
    
    /**
     * @brief 获取模块名称
     * @return 模块名称
     */
    virtual const char* name() const = 0;
    
    /**
     * @brief 获取模块优先级（数值越小越优先）
     * @return 优先级值
     */
    virtual int priority() const { return 100; }
    
    /**
     * @brief 获取模块依赖列表
     * @return 依赖模块类型列表
     */
    virtual std::vector<std::type_index> deps() const { return {}; }
    
    /**
     * @brief 设置所属Application
     * @param app Application指针
     */
    void setApp(class Application* app) { app_ = app; }
    
    /**
     * @brief 获取Application
     * @return Application指针
     */
    class Application* app() const { return app_; }

protected:
    class Application* app_ = nullptr;
};

/**
 * @brief 模块工厂函数类型
 */
using ModuleFactory = std::function<UniquePtr<Module>()>;

} // namespace extra2d
