<?php

namespace Core\System;

use PDO;

class PluginRegistry
{
    /**
     * جميع الإضافات المكتشفة من النظام
     */
    protected static array $discovered = [];

    /**
     * جميع الإضافات المسجلة في قاعدة البيانات
     */
    protected static array $installed = [];

    /**
     * تحميل البيانات مرة واحدة فقط
     */
    public static function boot(): void
    {
        self::discoverFromFilesystem();
        self::loadFromDatabase();
    }

    /**
     * اكتشاف الإضافات من مجلد plugins
     */
    protected static function discoverFromFilesystem(): void
    {
        if (!empty(self::$discovered)) {
            return;
        }

        $base = ROOT_PATH . '/plugins';

        if (!is_dir($base)) {
            return;
        }

        foreach (scandir($base) as $dir) {
            if ($dir === '.' || $dir === '..') {
                continue;
            }

            $manifest = $base . '/' . $dir . '/plugin.json';

            if (!is_file($manifest)) {
                continue;
            }

            $data = json_decode(file_get_contents($manifest), true);

            if (!is_array($data) || empty($data['slug'])) {
                continue;
            }

            self::$discovered[$data['slug']] = array_merge($data, [
                'path' => $base . '/' . $dir
            ]);
        }
    }

    /**
     * تحميل الإضافات المثبتة من قاعدة البيانات
     */
    protected static function loadFromDatabase(): void
    {
        if (!function_exists('db')) {
            return;
        }

        try {
            $stmt = db()->query("
                SELECT *
                FROM plugins
            ");

            self::$installed = [];

            while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
                self::$installed[$row['slug']] = $row;
            }

        } catch (\Throwable $e) {
            self::$installed = [];
        }
    }

    /**
     * جميع الإضافات المكتشفة (حتى غير المثبتة)
     */
    public static function allDiscovered(): array
    {
        self::boot();
        return self::$discovered;
    }

    /**
     * جميع الإضافات المثبتة
     */
    public static function allInstalled(): array
    {
        self::boot();
        return self::$installed;
    }

    /**
     * التحقق هل الإضافة مثبتة
     */
    public static function isInstalled(string $slug): bool
    {
        self::boot();
        return isset(self::$installed[$slug]);
    }

    /**
     * التحقق هل الإضافة مفعلة
     */
    public static function isActive(string $slug): bool
    {
        self::boot();
        return !empty(self::$installed[$slug]['is_active']);
    }

    /**
     * جلب بيانات إضافة واحدة (دمج FS + DB)
     */
    public static function get(string $slug): ?array
    {
        self::boot();

        if (!isset(self::$discovered[$slug])) {
            return null;
        }

        return array_merge(
            self::$discovered[$slug],
            self::$installed[$slug] ?? []
        );
    }
}
