<?php
declare(strict_types=1);

ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);

if (session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
}

header('Content-Type: text/html; charset=utf-8');

register_shutdown_function(function () {
    $e = error_get_last();
    if ($e) {
        echo '<hr>';
        echo '<h2 style="color:red">FATAL ERROR</h2>';
        echo '<pre style="direction:ltr;text-align:left;background:#111;color:#0f0;padding:15px;border-radius:10px;">';
        print_r($e);
        echo '</pre>';
    }
});

set_exception_handler(function (Throwable $e) {
    http_response_code(500);
    echo '<h2 style="color:red">UNCAUGHT EXCEPTION</h2>';
    echo '<pre style="direction:ltr;text-align:left;background:#111;color:#fff;padding:15px;border-radius:10px;">';
    echo 'Message: ' . $e->getMessage() . "\n";
    echo 'File: ' . $e->getFile() . "\n";
    echo 'Line: ' . $e->getLine() . "\n\n";
    echo $e->getTraceAsString();
    echo '</pre>';
    exit;
});

set_error_handler(function ($severity, $message, $file, $line) {
    if (!(error_reporting() & $severity)) return false;
    throw new ErrorException($message, 0, $severity, $file, $line);
});

function ok($title, $value = '') {
    echo '<div style="padding:10px;margin:8px 0;background:#e8fff0;border:1px solid #86d39d;border-radius:8px;">';
    echo '<strong>OK:</strong> ' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8');
    if ($value !== '') {
        echo '<br><small>' . htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8') . '</small>';
    }
    echo '</div>';
}

function bad($title, $value = '') {
    echo '<div style="padding:10px;margin:8px 0;background:#fff0f0;border:1px solid #e09a9a;border-radius:8px;">';
    echo '<strong>ERROR:</strong> ' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8');
    if ($value !== '') {
        echo '<br><small>' . htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8') . '</small>';
    }
    echo '</div>';
}

function infoBox($title, $value = '') {
    echo '<div style="padding:10px;margin:8px 0;background:#f4f7ff;border:1px solid #9db5e0;border-radius:8px;">';
    echo '<strong>INFO:</strong> ' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8');
    if ($value !== '') {
        echo '<br><small>' . htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8') . '</small>';
    }
    echo '</div>';
}

function has_col(PDO $pdo, string $table, string $col): bool {
    $st = $pdo->query("SHOW COLUMNS FROM `$table`");
    $cols = $st->fetchAll(PDO::FETCH_COLUMN, 0);
    return in_array($col, $cols, true);
}

echo '<!doctype html><html lang="ar" dir="rtl"><head><meta charset="utf-8"><title>كاشف أخطاء hr_leaves</title></head><body style="font-family:Tahoma,Arial,sans-serif;background:#f6f8fb;padding:20px;">';
echo '<h1>كاشف أخطاء hr_leaves.php</h1>';

$base = __DIR__;
infoBox('المجلد الحالي', $base);

/* =========================
   Files check
========================= */
$files = [
    'db.php' => $base . '/db.php',
    'inc/auth.php' => $base . '/inc/auth.php',
    'inc/layout.php' => $base . '/inc/layout.php',
    'inc/hr_leave_notifications.php' => $base . '/inc/hr_leave_notifications.php',
    'inc/mailer.php' => $base . '/inc/mailer.php',
    'hr_leaves.php' => $base . '/hr_leaves.php',
];

foreach ($files as $name => $path) {
    if (is_file($path)) ok("الملف موجود: $name", $path);
    else bad("الملف غير موجود: $name", $path);
}

echo '<hr><h2>1) تحميل db.php</h2>';
require_once $base . '/db.php';

if (function_exists('db')) ok('الدالة db() موجودة');
else bad('الدالة db() غير موجودة');

$pdo = null;
if (function_exists('db')) {
    $pdo = db();
    if ($pdo instanceof PDO) {
        ok('db() أعادت كائن PDO بنجاح');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    } else {
        bad('db() لم تعد PDO');
    }
}

echo '<hr><h2>2) فحص قاعدة البيانات</h2>';
if ($pdo instanceof PDO) {
    try {
        $dbName = $pdo->query('SELECT DATABASE()')->fetchColumn();
        ok('اسم قاعدة البيانات', (string)$dbName);
    } catch (Throwable $e) {
        bad('تعذر معرفة اسم قاعدة البيانات', $e->getMessage());
    }

    try {
        $tables = $pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
        ok('عدد الجداول', (string)count($tables));
    } catch (Throwable $e) {
        bad('فشل قراءة الجداول', $e->getMessage());
    }

    foreach (['employees', 'leave_requests', 'users'] as $tbl) {
        try {
            $pdo->query("SELECT 1 FROM `$tbl` LIMIT 1");
            ok("الجدول موجود: $tbl");
        } catch (Throwable $e) {
            bad("الجدول غير موجود أو به مشكلة: $tbl", $e->getMessage());
        }
    }
}

echo '<hr><h2>3) فحص أعمدة employees</h2>';
if ($pdo instanceof PDO) {
    $employeeCols = ['id','user_id','branch_id','qr_token2','full_name','name','employee_name','email'];
    foreach ($employeeCols as $c) {
        try {
            if (has_col($pdo, 'employees', $c)) ok("employees.$c موجود");
            else infoBox("employees.$c غير موجود");
        } catch (Throwable $e) {
            bad("فشل فحص employees.$c", $e->getMessage());
        }
    }
}

echo '<hr><h2>4) فحص أعمدة leave_requests</h2>';
if ($pdo instanceof PDO) {
    $leaveCols = [
        'id','employee_id','leave_type','date_from','date_to','branch_id',
        'reason','status','created_by','decided_by','decided_at','created_at',
        'last_notified_status','last_notified_at'
    ];
    foreach ($leaveCols as $c) {
        try {
            if (has_col($pdo, 'leave_requests', $c)) ok("leave_requests.$c موجود");
            else infoBox("leave_requests.$c غير موجود");
        } catch (Throwable $e) {
            bad("فشل فحص leave_requests.$c", $e->getMessage());
        }
    }
}

echo '<hr><h2>5) تحميل auth.php</h2>';
require_once $base . '/inc/auth.php';
ok('تم تحميل inc/auth.php');

$authFuncs = [
    'dbx','require_login','h','current_user_id','current_role','current_branch_id',
    'is_admin','can_cases','can_tasks','can_hr','can_finance','can_reports',
    'can_permissions','branch_name_ar','csrf_token','csrf_check','require_perm'
];

foreach ($authFuncs as $fn) {
    if (function_exists($fn)) ok("الدالة موجودة: $fn");
    else bad("الدالة غير موجودة: $fn");
}

echo '<hr><h2>6) تحميل layout.php</h2>';
require_once $base . '/inc/layout.php';
ok('تم تحميل inc/layout.php');

$layoutFuncs = [
    'render_layout_start',
    'render_layout_end'
];

foreach ($layoutFuncs as $fn) {
    if (function_exists($fn)) ok("الدالة موجودة: $fn");
    else infoBox("الدالة غير موجودة أو اسمها مختلف: $fn");
}

echo '<hr><h2>7) تحميل hr_leave_notifications.php</h2>';
require_once $base . '/inc/hr_leave_notifications.php';
ok('تم تحميل inc/hr_leave_notifications.php');

$notifyFuncs = [
    'send_leave_request_email',
    'send_leave_status_to_employee',
    'send_leave_to_admin'
];

foreach ($notifyFuncs as $fn) {
    if (function_exists($fn)) ok("الدالة موجودة: $fn");
    else infoBox("الدالة غير موجودة: $fn");
}

echo '<hr><h2>8) اختبار استعلام الموظفين</h2>';
if ($pdo instanceof PDO) {
    try {
        $nameExpr = "CONCAT('EMP#', e.id)";
        foreach (['full_name','name','employee_name','email'] as $c) {
            if (has_col($pdo, 'employees', $c)) {
                $nameExpr = "e.`$c`";
                break;
            }
        }

        $sql = "SELECT e.id, ($nameExpr) AS full_name FROM employees e ORDER BY e.id DESC LIMIT 3";
        $st = $pdo->query($sql);
        $rows = $st->fetchAll();

        ok('استعلام الموظفين نجح', 'عدد النتائج: ' . count($rows));
        echo '<pre style="direction:ltr;text-align:left;background:#111;color:#0f0;padding:15px;border-radius:10px;">';
        print_r($rows);
        echo '</pre>';
    } catch (Throwable $e) {
        bad('فشل استعلام الموظفين', $e->getMessage());
    }
}

echo '<hr><h2>9) اختبار استعلام الإجازات</h2>';
if ($pdo instanceof PDO) {
    try {
        $selects = [
            "r.id",
            "r.employee_id",
            "r.leave_type",
            "r.date_from",
            "r.date_to"
        ];

        if (has_col($pdo, 'leave_requests', 'reason')) $selects[] = "r.reason";
        if (has_col($pdo, 'leave_requests', 'status')) $selects[] = "r.status";
        if (has_col($pdo, 'leave_requests', 'created_at')) $selects[] = "r.created_at";

        $nameExpr = "CONCAT('EMP#', e.id)";
        foreach (['full_name','name','employee_name','email'] as $c) {
            if (has_col($pdo, 'employees', $c)) {
                $nameExpr = "e.`$c`";
                break;
            }
        }

        $sql = "SELECT " . implode(', ', $selects) . ", ($nameExpr) AS full_name
                FROM leave_requests r
                JOIN employees e ON e.id = r.employee_id
                ORDER BY r.id DESC
                LIMIT 5";

        $st = $pdo->query($sql);
        $rows = $st->fetchAll();

        ok('استعلام الإجازات نجح', 'عدد النتائج: ' . count($rows));
        echo '<pre style="direction:ltr;text-align:left;background:#111;color:#0f0;padding:15px;border-radius:10px;">';
        print_r($rows);
        echo '</pre>';
    } catch (Throwable $e) {
        bad('فشل استعلام الإجازات', $e->getMessage());
    }
}

echo '<hr><h2>10) بيانات الجلسة الحالية</h2>';
echo '<pre style="direction:ltr;text-align:left;background:#111;color:#fff;padding:15px;border-radius:10px;">';
print_r($_SESSION);
echo '</pre>';

echo '<hr><h2>11) اختبار تحميل hr_leaves.php مباشرة</h2>';
infoBox('مهم', 'إذا كان هناك تعارض دوال أو Fatal Error داخل hr_leaves.php فسيظهر هنا مباشرة.');
try {
    ob_start();
    include $base . '/hr_leaves.php';
    $out = ob_get_clean();
    ok('تم تحميل hr_leaves.php بدون Fatal Error');
    echo '<details style="margin-top:10px;"><summary>عرض أول 3000 حرف من الناتج</summary>';
    echo '<pre style="direction:ltr;text-align:left;background:#111;color:#0f0;padding:15px;border-radius:10px;white-space:pre-wrap;">';
    echo htmlspecialchars(mb_substr($out, 0, 3000), ENT_QUOTES, 'UTF-8');
    echo '</pre></details>';
} catch (Throwable $e) {
    ob_end_clean();
    bad('فشل تحميل hr_leaves.php', $e->getMessage() . ' | File: ' . $e->getFile() . ' | Line: ' . $e->getLine());
}

echo '</body></html>';