<?php include __DIR__ . '/../layouts/copyright.php'; ?>

/**
 * HuSNS 组件加载器
 * 提供统一的组件加载机制，支持参数传递和自动渲染
 */
class ComponentLoader {
    
    /**
     * 已注册的组件列表
     * @var array
     */
    private static $registeredComponents = [];
    
    /**
     * 组件目录路径
     * @var string
     */
    private static $componentDir = __DIR__;
    
    /**
     * 加载组件
     * 
     * @param string $name 组件名称（不含.php扩展名）
     * @param array $data 传递给组件的数据
     * @param bool $return 是否返回HTML而非直接输出
     * @return string|null HTML内容（当$return为true时）
     */
    public static function load($name, $data = [], $return = false) {
        // 检查是否已注册组件
        if (isset(self::$registeredComponents[$name])) {
            $component = self::$registeredComponents[$name];
            if (is_callable($component)) {
                $html = call_user_func($component, $data);
                if ($return) {
                    return $html;
                }
                echo $html;
                return null;
            }
        }
        
        // 尝试从文件加载
        $file = self::$componentDir . '/' . $name . '.php';
        
        if (!file_exists($file)) {
            error_log("Component not found: $name");
            return $return ? '' : null;
        }
        
        // 提取数据变量到当前作用域
        extract($data);
        
        if ($return) {
            ob_start();
            include $file;
            return ob_get_clean();
        }
        
        include $file;
        return null;
    }
    
    /**
     * 注册组件
     * 
     * @param string $name 组件名称
     * @param callable $callback 组件回调函数
     */
    public static function register($name, callable $callback) {
        self::$registeredComponents[$name] = $callback;
    }
    
    /**
     * 批量加载多个组件
     * 
     * @param array $components 组件数组，格式：['name' => ['data']]
     */
    public static function loadMultiple($components) {
        foreach ($components as $name => $data) {
            self::load($name, is_array($data) ? $data : []);
        }
    }
    
    /**
     * 获取所有已注册组件列表
     * 
     * @return array
     */
    public static function getRegisteredComponents() {
        return self::$registeredComponents;
    }
    
    /**
     * 设置组件目录
     * 
     * @param string $dir 目录路径
     */
    public static function setComponentDir($dir) {
        if (is_dir($dir)) {
            self::$componentDir = $dir;
        }
    }
    
    /**
     * 检查组件是否存在
     * 
     * @param string $name 组件名称
     * @return bool
     */
    public static function exists($name) {
        if (isset(self::$registeredComponents[$name])) {
            return true;
        }
        
        $file = self::$componentDir . '/' . $name . '.php';
        return file_exists($file);
    }
}
