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

$ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
$b  = json_decode(file_get_contents('php://input'), true) ?? [];
$action = $b['action'] ?? '';

// ── إرسال الرمز ────────────────────────────────────────────
if ($action === 'send') {
    if (!check_rate_limit('forgot_' . md5($ip), 5, 900))
        Kernel::fail('rate_limit', 'حاول بعد 15 دقيقة', 429);

    $email = trim(strtolower($b['email'] ?? ''));
    if (!$email || !filter_var($email, FILTER_VALIDATE_EMAIL))
        Kernel::fail('invalid_email', '', 400);

    // تحقق من وجود المستخدم (لا نكشف إن كان موجوداً أم لا)
    $st = db()->prepare('SELECT id, name FROM users WHERE email = ? LIMIT 1');
    $st->execute([$email]);
    $u = $st->fetch();

    // دائماً نرد بنجاح حتى لو البريد غير مسجّل (أمان)
    if ($u) {
        $code    = str_pad((string)random_int(0, 999999), 6, '0', STR_PAD_LEFT);
        $expires = date('Y-m-d H:i:s', time() + 1800); // صالح 30 دقيقة

        db()->prepare('DELETE FROM password_resets WHERE email = ?')->execute([$email]);
        db()->prepare('INSERT INTO password_resets (email, code, expires_at) VALUES (?, ?, ?)')
             ->execute([$email, hash('sha256', $code), $expires]);

        _send_reset_email($email, $u['name'], $code);
    }

    json_response(['success' => true, 'message' => 'تم إرسال رمز الاستعادة إلى بريدك']);
}

// ── التحقق من الرمز وإعادة التعيين ────────────────────────
if ($action === 'reset') {
    if (!check_rate_limit('reset_' . md5($ip), 10, 900))
        Kernel::fail('rate_limit', 'حاول بعد قليل', 429);

    $email   = trim(strtolower($b['email']    ?? ''));
    $code    = trim($b['code']     ?? '');
    $newpass = $b['password'] ?? '';

    if (!$email || !$code || !$newpass)
        Kernel::fail('missing_fields', '', 400);
    if (strlen($code) !== 6 || !ctype_digit($code))
        Kernel::fail('invalid_code', 'رمز غير صحيح', 400);
    if (mb_strlen($newpass) < 6)
        Kernel::fail('weak_password', 'كلمة المرور 6 أحرف على الأقل', 400);

    $st = db()->prepare('SELECT * FROM password_resets WHERE email = ? AND expires_at > NOW() LIMIT 1');
    $st->execute([$email]);
    $row = $st->fetch();

    if (!$row || !hash_equals($row['code'], hash('sha256', $code)))
        Kernel::fail('invalid_code', 'رمز غير صحيح أو منتهي الصلاحية', 400);

    // تحديث كلمة المرور
    $hash = password_hash($newpass, PASSWORD_BCRYPT, ['cost' => 11]);
    db()->prepare('UPDATE users SET password_hash = ? WHERE email = ?')->execute([$hash, $email]);

    // حذف الرمز وإلغاء كل الجلسات القديمة
    db()->prepare('DELETE FROM password_resets WHERE email = ?')->execute([$email]);
    $u2 = db()->prepare('SELECT id FROM users WHERE email = ? LIMIT 1');
    $u2->execute([$email]);
    $uid2 = $u2->fetchColumn();
    if ($uid2) db()->prepare('DELETE FROM sessions WHERE user_id = ?')->execute([$uid2]);

    json_response(['success' => true, 'message' => 'تم تغيير كلمة المرور بنجاح']);
}

Kernel::fail('unknown_action', '', 400);

// ── إرسال البريد ────────────────────────────────────────────
function _send_reset_email(string $to, string $name, string $code): void {
    $subject = 'رمز استعادة كلمة المرور — سودانا';
    $html = '<!DOCTYPE html><html dir="rtl" lang="ar"><head><meta charset="utf-8">
<style>body{font-family:Arial,sans-serif;background:#f4f4f4;margin:0;padding:20px}
.box{background:#fff;max-width:480px;margin:0 auto;border-radius:12px;padding:32px;text-align:center}
.logo{font-size:1.5rem;font-weight:900;color:#1a5c38;margin-bottom:8px}
.code{font-size:2.4rem;font-weight:900;letter-spacing:10px;color:#1a5c38;background:#f0faf4;border-radius:10px;padding:16px 24px;margin:20px 0;display:inline-block}
.note{font-size:.82rem;color:#888;margin-top:16px}</style></head>
<body><div class="box">
<div class="logo">🇸🇩 سودانا</div>
<p>مرحباً ' . htmlspecialchars($name) . '،</p>
<p>طلبت استعادة كلمة المرور. رمز الاستعادة الخاص بك:</p>
<div class="code">' . $code . '</div>
<p>أدخل هذا الرمز في صفحة الاستعادة خلال <strong>30 دقيقة</strong>.</p>
<p class="note">إذا لم تطلب هذا، تجاهل هذا البريد. حسابك بأمان.</p>
</div></body></html>';

    $headers  = "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: text/html; charset=utf-8\r\n";
    $headers .= "From: سودانا <no-reply@sudanna.ai>\r\n";
    $headers .= "Reply-To: no-reply@sudanna.ai\r\n";
    $headers .= "X-Mailer: PHP/" . PHP_VERSION . "\r\n";

    @mail($to, '=?utf-8?B?' . base64_encode($subject) . '?=', $html, $headers);
}
