<?php
declare(strict_types=1);

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

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

date_default_timezone_set('Asia/Dubai');

/* لا نطبع أي شيء قبل انتهاء الفحص */
ob_start();

$report = [];
$fatalData = null;

register_shutdown_function(function () use (&$report, &$fatalData) {
    $e = error_get_last();
    if ($e) {
        $fatalData = $e;
    }

    while (ob_get_level() > 0) {
        ob_end_clean();
    }

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

    echo '<!doctype html><html lang="ar" dir="rtl"><head><meta charset="utf-8"><title>كاشف أخطاء الحضور الآمن</title>';
    echo '<style>
      body{font-family:Tahoma,Arial,sans-serif;background:#f6f8fb;padding:20px}
      .ok,.err,.info{padding:10px;margin:8px 0;border-radius:8px}
      .ok{background:#e8fff0;border:1px solid #86d39d}
      .err{background:#fff0f0;border:1px solid #e09a9a}
      .info{background:#f4f7ff;border:1px solid #9db5e0}
      pre{direction:ltr;text-align:left;background:#111;color:#0f0;padding:15px;border-radius:10px;white-space:pre-wrap;overflow:auto}
      h1,h2{margin:12px 0}
    </style></head><body>';

    echo '<h1>كاشف أخطاء hr_attendance.php</h1>';

    foreach ($report as $row) {
        $cls = $row['type'];
        echo '<div class="'.$cls.'"><strong>'.htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8').'</strong>';
        if (!empty($row['text'])) {
            echo '<br><small>'.htmlspecialchars($row['text'], ENT_QUOTES, 'UTF-8').'</small>';
        }
        echo '</div>';
    }

    if ($fatalData) {
        echo '<h2 style="color:red">FATAL ERROR</h2>';
        echo '<pre>';
        print_r($fatalData);
        echo '</pre>';
    }

    echo '</body></html>';
    exit;
});

set_exception_handler(function (Throwable $e) use (&$report) {
    $report[] = [
        'type' => 'err',
        'title' => 'UNCAUGHT EXCEPTION',
        'text' => 'Message: '.$e->getMessage().' | File: '.$e->getFile().' | Line: '.$e->getLine()
    ];
    throw $e;
});

set_error_handler(function ($severity, $message, $file, $line) use (&$report) {
    if (!(error_reporting() & $severity)) {
        return false;
    }

    $report[] = [
        'type' => 'err',
        'title' => 'PHP ERROR',
        'text' => 'Message: '.$message.' | File: '.$file.' | Line: '.$line
    ];

    throw new ErrorException($message, 0, $severity, $file, $line);
});

function rep(array &$report, string $type, string $title, string $text = ''): void {
    $report[] = ['type' => $type, 'title' => $title, 'text' => $text];
}

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

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

/* ===== الملفات ===== */
$files = [
    'db.php' => $base . '/db.php',
    'inc/db.php' => $base . '/inc/db.php',
    'inc/auth.php' => $base . '/inc/auth.php',
    'inc/layout.php' => $base . '/inc/layout.php',
    'hr_attendance.php' => $base . '/hr_attendance.php',
];

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

/* ===== فحص محتوى inc/db.php ===== */
$incDbPath = $base . '/inc/db.php';
if (is_file($incDbPath)) {
    $incDbContent = file_get_contents($incDbPath);
    if (stripos($incDbContent, 'function db(') !== false) {
        rep($report, 'err', 'inc/db.php يحتوي function db()', 'هذا يسبب Cannot redeclare db()');
    } else {
        rep($report, 'ok', 'inc/db.php لا يحتوي تعريف db()');
    }
}

/* ===== تحميل db.php ===== */
require_once $base . '/db.php';

if (!function_exists('db')) {
    rep($report, 'err', 'الدالة db() غير موجودة');
    exit;
}
rep($report, 'ok', 'الدالة db() موجودة');

$pdo = db();
if (!$pdo instanceof PDO) {
    rep($report, 'err', 'db() لم تُعد PDO');
    exit;
}
rep($report, 'ok', 'db() أعادت PDO بنجاح');

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

try {
    $pdo->exec("SET time_zone = '+04:00'");
    rep($report, 'ok', 'تم ضبط time_zone داخل MySQL');
} catch (Throwable $e) {
    rep($report, 'err', 'فشل ضبط time_zone', $e->getMessage());
}

/* ===== الجداول ===== */
foreach (['employees', 'attendance_logs'] as $tbl) {
    try {
        $pdo->query("SELECT 1 FROM `$tbl` LIMIT 1");
        rep($report, 'ok', "الجدول موجود: {$tbl}");
    } catch (Throwable $e) {
        rep($report, 'err', "مشكلة في الجدول: {$tbl}", $e->getMessage());
    }
}

$empCols = [];
$attCols = [];

try {
    $empCols = cols($pdo, 'employees');
    rep($report, 'ok', 'أعمدة employees', implode(', ', $empCols));
} catch (Throwable $e) {
    rep($report, 'err', 'فشل قراءة أعمدة employees', $e->getMessage());
}

try {
    $attCols = cols($pdo, 'attendance_logs');
    rep($report, 'ok', 'أعمدة attendance_logs', implode(', ', $attCols));
} catch (Throwable $e) {
    rep($report, 'err', 'فشل قراءة أعمدة attendance_logs', $e->getMessage());
}

if (!in_array('employee_id', $attCols, true) || !in_array('log_date', $attCols, true)) {
    rep($report, 'err', 'attendance_logs ناقص', 'يجب وجود employee_id و log_date');
}

/* ===== تحميل auth/layout ===== */
require_once $base . '/inc/auth.php';
rep($report, 'ok', 'تم تحميل inc/auth.php');

require_once $base . '/inc/layout.php';
rep($report, 'ok', 'تم تحميل inc/layout.php');

foreach (['dbx','require_login','current_user_id','current_role','current_branch_id','is_admin','render_layout_start','render_layout_end'] as $fn) {
    if (function_exists($fn)) rep($report, 'ok', "الدالة موجودة: {$fn}");
    else rep($report, 'err', "الدالة غير موجودة: {$fn}");
}

/* ===== فحص بناء الجملة ===== */
$target = $base . '/hr_attendance.php';
$phpBin = PHP_BINARY;
$cmd = escapeshellarg($phpBin) . ' -l ' . escapeshellarg($target) . ' 2>&1';
$lint = shell_exec($cmd);
rep($report, 'info', 'نتيجة فحص syntax لـ hr_attendance.php', trim((string)$lint));

/* ===== فحص منطقي خاص ===== */
$raw = file_get_contents($target);

if (strpos($raw, '$vals[]=$nowTime') !== false && strpos($raw, '$nowTime =') !== false) {
    $posUse = strpos($raw, '$vals[]=$nowTime');
    $posDef = strpos($raw, '$nowTime =');
    if ($posUse < $posDef) {
        rep($report, 'err', 'تم اكتشاف استخدام $nowTime قبل تعريفه', 'هذا موجود داخل التسجيل اليدوي وقد يسبب خطأ');
    } else {
        rep($report, 'ok', '$nowTime يبدو معرّفًا قبل الاستخدام');
    }
}

/* ===== تجربة تحميل الصفحة بدون إخراج فوري ===== */
try {
    $_GET['debug'] = '1';

    $beforeLevel = ob_get_level();
    ob_start();
    include $target;
    $pageOutput = ob_get_clean();

    while (ob_get_level() > $beforeLevel) {
        ob_end_clean();
    }

    rep($report, 'ok', 'تم تحميل hr_attendance.php داخل الكاشف');
    rep($report, 'info', 'أول 1500 حرف من الإخراج', mb_substr(strip_tags($pageOutput), 0, 1500));
} catch (Throwable $e) {
    while (ob_get_level() > 0) {
        @ob_end_clean();
    }
    rep($report, 'err', 'فشل تحميل hr_attendance.php', $e->getMessage().' | File: '.$e->getFile().' | Line: '.$e->getLine());
}