<?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

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    Kernel::fail('method_not_allowed', '', 405);
}

// قراءة البيانات أولاً قبل بدء الـ session
$b     = json_decode(file_get_contents('php://input'), true) ?? [];
$name  = mb_substr(trim($b['name']  ?? ''), 0, 100);
$email = trim(strtolower($b['email'] ?? ''));
$phone = preg_replace('/[^0-9+]/', '', $b['phone'] ?? '');
$pass  = $b['password'] ?? '';

// التحقق من المدخلات: name + password + (phone OR email)
if (!$name || !$pass || (!$phone && !$email))
    Kernel::fail('missing_fields', 'الاسم وكلمة المرور وإما الهاتف أو البريد', 400);
if ($email && !filter_var($email, FILTER_VALIDATE_EMAIL))
    Kernel::fail('invalid_email', 'بريد إلكتروني غير صحيح', 400);
if ($phone && (strlen($phone) < 9 || strlen($phone) > 15))
    Kernel::fail('invalid_phone', 'رقم هاتف غير صحيح', 400);
if (mb_strlen($pass) < 6)
    Kernel::fail('weak_password', 'كلمة المرور 6 أحرف على الأقل', 400);

// Rate limit
$ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
if (!check_rate_limit('reg_' . md5($ip), 5, 300))
    Kernel::fail('rate_limit', 'حاول بعد 5 دقائق', 429);

try {
    // التحقق من تكرار البريد أو الهاتف
    if ($email) {
        $chk = db()->prepare('SELECT id FROM users WHERE email = ? LIMIT 1');
        $chk->execute([$email]);
        if ($chk->fetch())
            Kernel::fail('email_already_registered', 'البريد مسجّل مسبقاً', 409);
    }
    if ($phone) {
        $chk = db()->prepare('SELECT id FROM users WHERE phone = ? LIMIT 1');
        $chk->execute([$phone]);
        if ($chk->fetch())
            Kernel::fail('phone_already_registered', 'الهاتف مسجّل مسبقاً', 409);
    }

    // إنشاء المستخدم
    $hash = password_hash($pass, PASSWORD_BCRYPT, ['cost' => 10]);
    $userType = in_array($b['user_type'] ?? '', ['user','student','patient','investor','service_provider'])
              ? $b['user_type'] : 'user';
    db()->prepare('INSERT INTO users (name, email, phone, password_hash, user_type) VALUES (?, ?, ?, ?, ?)')
        ->execute([$name, $email ?: null, $phone ?: null, $hash, $userType]);
    $uid = (int)db()->lastInsertId();

    if (!$uid) {
        error_log('[register] lastInsertId=0 after INSERT for email=' . $email);
        Kernel::fail('server_error', 'حدث خطأ، حاول مجدداً', 500);
    }

    // إنشاء الجلسة
    $token   = bin2hex(random_bytes(32));
    $expires = date('Y-m-d H:i:s', time() + SESSION_LIFETIME);
    db()->prepare('INSERT INTO sessions (user_id, token, expires_at) VALUES (?, ?, ?)')
        ->execute([$uid, hash('sha256', $token), $expires]);

    // حفظ الجلسة في cookie
    start_secure_session();
    $_SESSION['user_id']       = $uid;
    $_SESSION['session_token'] = $token;
    session_write_close();

    json_response(['success' => true, 'user' => [
        'id'                => $uid,
        'name'              => $name,
        'email'             => $email,
        'onboarding_done'   => false,
        'subscription_tier' => 'free',
        'learning_track'    => 'foundation',
        'rank_title'        => 'طالب جديد',
        'points_learn'      => 0,
        'points_trade'      => 0,
        'points_community'  => 0,
        'points_family'     => 0,
        'neighborhood_id'   => 0,
    ]]);

} catch (Throwable $e) {
    error_log('[register] ERROR: ' . $e->getMessage() . ' | email=' . $email);
    $msg = 'حدث خطأ في الخادم';
    // رسائل أوضح للمشاكل الشائعة
    if (str_contains($e->getMessage(), 'Duplicate')) $msg = 'البريد مسجّل مسبقاً';
    if (str_contains($e->getMessage(), 'session'))   $msg = 'خطأ في الجلسة - حاول مجدداً';
    echo json_encode(['error' => 'server_error', 'message' => 'خطأ مؤقت — حاول مرة أخرى'], JSON_UNESCAPED_UNICODE);
}
