<?php
require_once __DIR__ . '/../../config.php';
require_once __DIR__ . '/../../engine/Kernel.php';
Kernel::handle(['auth' => false, 'public' => true]);
require_once __DIR__ . '/../engine/Logger.php'; // COVERAGE
start_secure_session();

if (empty($_SESSION['user_id']) || empty($_SESSION['session_token'])) {
    json_response(['authenticated' => false], 401);
}

// Session Rotation — حماية من Session Fixation
// نستخدم mutex بسيط: نقرأ _last_regen أولاً BEFORE regenerate
// لمنع race condition: نتحقق ونجدد في خطوة واحدة مشروطة
$now = time();
$last = (int)($_SESSION['_last_regen'] ?? 0);
if ($last === 0 || ($now - $last) > 900) {
    // تحديث الوقت أولاً قبل الـ regenerate لمنع طلبين متزامنين من التجديد
    $_SESSION['_last_regen'] = $now;
    session_write_close();
    // إعادة فتح الجلسة ثم التجديد — يمنع الـ race condition في بيئات multi-threaded
    start_secure_session();
    session_regenerate_id(true);
}

try {
    // استعلام واحد فقط يجلب المستخدم + يتحقق من الجلسة + يمدّد صلاحيتها معاً
    $token_hash = hash('sha256', $_SESSION['session_token']);
    $near_expiry = date('Y-m-d H:i:s', time() + 604800); // 7 أيام
    $new_expiry  = date('Y-m-d H:i:s', time() + SESSION_LIFETIME);

    // تمديد الجلسة إذا اقتربت من الانتهاء (استعلام واحد بدلاً من اثنين)
    db()->prepare(
        'UPDATE sessions SET expires_at = ?
         WHERE user_id = ? AND token = ? AND expires_at < ?'
    )->execute([$new_expiry, $_SESSION['user_id'], $token_hash, $near_expiry]);

    $st = db()->prepare(
        'SELECT u.* FROM users u
         JOIN sessions s ON s.user_id = u.id
         WHERE u.id = ? AND s.token = ? AND s.expires_at > NOW() LIMIT 1'
    );
    $st->execute([$_SESSION['user_id'], $token_hash]);
    $u = $st->fetch();

} catch (Throwable $e) {
    json_response(['authenticated' => false, 'error' => 'db_error'], 503);
}

if (!$u) {
    session_unset();
    json_response(['authenticated' => false], 401);
}

json_response(['authenticated' => true, 'user' => [
    'id'                => (int)$u['id'],
    'name'              => $u['name'],
    'email'             => $u['email'],
    'onboarding_done'   => (bool)$u['onboarding_done'],
    'subscription_tier' => $u['subscription_tier'],
    'learning_track'    => $u['learning_track'] ?: 'foundation',
    'rank_title'        => $u['rank_title']     ?: 'طالب جديد',
    'points_learn'      => (int)$u['points_learn'],
    'points_trade'      => (int)$u['points_trade'],
    'points_community'  => (int)$u['points_community'],
    'points_family'     => (int)$u['points_family'],
    'neighborhood_id'   => (int)$u['neighborhood_id'],
    'state'             => $u['state']        ?? '',
    'city'              => $u['city']         ?? '',
    'neighborhood'      => $u['neighborhood'] ?? '',
]]);
