<?php
/**
 * سكريبت بديل لإصلاح جدول roles
 * يستخدم نفس Database class المستخدم في index.php
 */

// تحميل الملفات المطلوبة
require_once __DIR__ . '/src/Core/Database.php';
require_once __DIR__ . '/src/Core/Logger.php';

$config = require __DIR__ . '/config/config.php';

// تهيئة Logger
$logger = new \App\Core\Logger();

try {
    // استخدام Database class مباشرة
    $db = \App\Core\Database::getInstance($config['db'])->connection();
    
    echo "✓ تم الاتصال بقاعدة البيانات بنجاح\n\n";
    
    // التأكد من charset صحيح
    try {
        $db->exec("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci");
    } catch (PDOException $e) {}
    
    // التحقق من وجود جدول roles
    try {
        $db->query("SELECT 1 FROM roles LIMIT 1");
        echo "✓ جدول roles موجود\n\n";
    } catch (PDOException $e) {
        echo "✗ جدول roles غير موجود. جاري إنشاؤه...\n";
        $db->exec("CREATE TABLE roles (
            id INT AUTO_INCREMENT PRIMARY KEY,
            name VARCHAR(100) NOT NULL,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci");
        echo "✓ تم إنشاء جدول roles\n\n";
    }
    
    // التحقق من وجود دور Administrator
    $stmt = $db->prepare('SELECT id, name FROM roles WHERE name = ? LIMIT 1');
    $stmt->execute(['Administrator']);
    $role = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if ($role && isset($role['id']) && (int)$role['id'] > 0) {
        $roleId = (int)$role['id'];
        echo "✓ دور Administrator موجود (ID: $roleId)\n";
    } else {
        echo "✗ دور Administrator غير موجود. جاري إنشاؤه...\n";
        
        // محاولة إنشاء الدور بمعرف 1
        $roleId = null;
        try {
            $db->exec("INSERT INTO roles (id, name) VALUES (1, 'Administrator')");
            $roleId = 1;
            echo "✓ تم إنشاء دور Administrator بمعرف 1\n";
        } catch (PDOException $e) {
            // إذا فشل (ربما المعرف 1 مستخدم)، أنشئه بدون معرف
            if (strpos($e->getMessage(), 'Duplicate entry') !== false || strpos($e->getMessage(), 'PRIMARY') !== false) {
                // المعرف 1 مستخدم، جرب جلب الدور مرة أخرى
                try {
                    $stmt = $db->prepare('SELECT id FROM roles WHERE name = ? LIMIT 1');
                    $stmt->execute(['Administrator']);
                    $role = $stmt->fetch(PDO::FETCH_ASSOC);
                    if ($role && isset($role['id']) && (int)$role['id'] > 0) {
                        $roleId = (int)$role['id'];
                        echo "✓ تم العثور على دور Administrator بمعرف $roleId\n";
                    }
                } catch (PDOException $e3) {}
            }
            
            if ($roleId === null || $roleId <= 0) {
                try {
                    $db->prepare('INSERT INTO roles (name) VALUES (?)')->execute(['Administrator']);
                    $newId = (int)$db->lastInsertId();
                    if ($newId > 0) {
                        $roleId = $newId;
                        echo "✓ تم إنشاء دور Administrator بمعرف $newId\n";
                    } else {
                        // محاولة جلب الدور مرة أخرى
                        $stmt = $db->prepare('SELECT id FROM roles WHERE name = ? LIMIT 1');
                        $stmt->execute(['Administrator']);
                        $role = $stmt->fetch(PDO::FETCH_ASSOC);
                        if ($role && isset($role['id']) && (int)$role['id'] > 0) {
                            $roleId = (int)$role['id'];
                            echo "✓ تم العثور على دور Administrator بمعرف $roleId\n";
                        } else {
                            echo "⚠️ تحذير: تم إنشاء الدور لكن لم يتم الحصول على المعرف\n";
                        }
                    }
                } catch (PDOException $e2) {
                    // المحاولة الأخيرة: INSERT IGNORE
                    try {
                        $db->exec("INSERT IGNORE INTO roles (id, name) VALUES (1, 'Administrator')");
                        $stmt = $db->prepare('SELECT id FROM roles WHERE name = ? LIMIT 1');
                        $stmt->execute(['Administrator']);
                        $role = $stmt->fetch(PDO::FETCH_ASSOC);
                        if ($role && isset($role['id']) && (int)$role['id'] > 0) {
                            $roleId = (int)$role['id'];
                            echo "✓ تم إنشاء/العثور على دور Administrator بمعرف $roleId\n";
                        } else {
                            echo "❌ فشل إنشاء دور Administrator: " . $e2->getMessage() . "\n";
                        }
                    } catch (PDOException $e3) {
                        echo "❌ فشل إنشاء دور Administrator: " . $e2->getMessage() . "\n";
                    }
                }
            }
        }
        
        if ($roleId === null || $roleId <= 0) {
            echo "⚠️ تحذير: لم يتم الحصول على معرف صحيح لدور Administrator\n";
        }
    }
    
    // عرض جميع الأدوار الموجودة
    echo "\nالأدوار الموجودة في النظام:\n";
    echo str_repeat("-", 50) . "\n";
    try {
        $allRoles = $db->query('SELECT id, name, created_at FROM roles ORDER BY id')->fetchAll(PDO::FETCH_ASSOC);
        if (empty($allRoles)) {
            echo "لا توجد أدوار في النظام\n";
        } else {
            foreach ($allRoles as $r) {
                $id = isset($r['id']) ? (int)$r['id'] : 'NULL';
                $name = isset($r['name']) ? $r['name'] : 'NULL';
                $created = isset($r['created_at']) ? $r['created_at'] : 'NULL';
                echo "ID: $id | Name: $name | Created: $created\n";
            }
        }
        
        // التحقق النهائي من دور Administrator
        $finalCheck = $db->prepare('SELECT id FROM roles WHERE name = ? LIMIT 1');
        $finalCheck->execute(['Administrator']);
        $adminRole = $finalCheck->fetch(PDO::FETCH_ASSOC);
        if ($adminRole && isset($adminRole['id'])) {
            $adminId = (int)$adminRole['id'];
            echo "\n✓ التحقق النهائي: دور Administrator موجود بمعرف $adminId\n";
        } else {
            echo "\n⚠️ تحذير: لم يتم العثور على دور Administrator بعد الإنشاء!\n";
        }
    } catch (Throwable $displayError) {
        echo "⚠️ تحذير: فشل عرض الأدوار: " . $displayError->getMessage() . "\n";
    }
    
    echo "\n✅ تم إصلاح جدول roles بنجاح!\n";
    echo "\nيمكنك الآن محاولة إنشاء المستخدم الأول من صفحة الإعداد.\n";
    
} catch (PDOException $e) {
    $errorCode = $e->getCode();
    $errorMessage = $e->getMessage();
    
    echo "❌ خطأ في قاعدة البيانات:\n";
    echo "   " . $errorMessage . "\n\n";
    
    if ($errorCode == 1045) {
        echo "🔧 الحلول المقترحة:\n";
        echo "   1. تحقق من كلمة المرور في ملف config/config.php\n";
        echo "   2. تأكد من أن المستخدم موجود في MySQL\n";
        echo "   3. تحقق من صلاحيات المستخدم في cPanel أو phpMyAdmin\n";
    } elseif ($errorCode == 1049) {
        echo "🔧 الحل: قم بإنشاء قاعدة البيانات أولاً من cPanel\n";
    }
    
    $logger->error("fix_roles_v2 failed", ['error' => $errorMessage, 'code' => $errorCode]);
    exit(1);
} catch (Throwable $e) {
    echo "❌ خطأ غير متوقع: " . $e->getMessage() . "\n";
    echo "   File: " . $e->getFile() . "\n";
    echo "   Line: " . $e->getLine() . "\n";
    $logger->exception($e);
    exit(1);
}
