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

require_once __DIR__ . '/db.php';

function redirect_to(string $url): void
{
    header('Location: ' . $url);
    exit;
}

function flash_and_back(string $key, string $message): void
{
    $_SESSION[$key] = $message;
    redirect_to('forgot_password.php');
}

function table_exists(PDO $pdo, string $table): bool
{
    $st = $pdo->prepare("
        SELECT COUNT(*)
        FROM information_schema.tables
        WHERE table_schema = DATABASE()
          AND table_name = ?
    ");
    $st->execute([$table]);
    return (int)$st->fetchColumn() > 0;
}

function get_table_columns(PDO $pdo, string $table): array
{
    $st = $pdo->prepare("
        SELECT COLUMN_NAME
        FROM information_schema.columns
        WHERE table_schema = DATABASE()
          AND table_name = ?
    ");
    $st->execute([$table]);
    return $st->fetchAll(PDO::FETCH_COLUMN);
}

try {
    $csrf = (string)($_POST['csrf'] ?? '');
    if (
        $csrf === '' ||
        empty($_SESSION['csrf_forgot']) ||
        !hash_equals((string)$_SESSION['csrf_forgot'], $csrf)
    ) {
        flash_and_back('forgot_err', 'انتهت الجلسة. حاول مرة أخرى.');
    }

    if (!function_exists('db')) {
        flash_and_back('forgot_err', 'دالة db() غير موجودة.');
    }

    $pdo = db();
    if (!$pdo instanceof PDO) {
        flash_and_back('forgot_err', 'قاعدة البيانات غير جاهزة.');
    }

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

    if (!table_exists($pdo, 'users')) {
        flash_and_back('forgot_err', 'جدول users غير موجود.');
    }

    if (!table_exists($pdo, 'password_reset_requests')) {
        flash_and_back('forgot_err', 'جدول password_reset_requests غير موجود.');
    }

    $login = trim((string)($_POST['login'] ?? ''));
    $note  = trim((string)($_POST['note'] ?? ''));

    if ($login === '') {
        flash_and_back('forgot_err', 'يرجى إدخال اسم المستخدم أو البريد الإلكتروني.');
    }

    $columns = get_table_columns($pdo, 'users');

    if (!in_array('id', $columns, true)) {
        flash_and_back('forgot_err', 'جدول users لا يحتوي على العمود id.');
    }

    $searchable = [];
    foreach (['email', 'username', 'full_name', 'name', 'user_code', 'employee_code', 'login', 'phone'] as $col) {
        if (in_array($col, $columns, true)) {
            $searchable[] = $col;
        }
    }

    if (!$searchable) {
        flash_and_back(
            'forgot_err',
            'لم يتم العثور على أعمدة مناسبة للبحث في جدول users. الأعمدة الموجودة: ' . implode(', ', $columns)
        );
    }

    $whereParts = [];
    $params = [];

    foreach ($searchable as $col) {
        $whereParts[] = "`{$col}` = ?";
        $params[] = $login;
    }

    $sql = "
        SELECT `id`
        FROM `users`
        WHERE " . implode(' OR ', $whereParts) . "
        LIMIT 1
    ";

    $st = $pdo->prepare($sql);
    $st->execute($params);
    $user = $st->fetch();

    if (!$user) {
        flash_and_back('forgot_err', 'الحساب غير موجود.');
    }

    $userId = (int)$user['id'];

    $resetColumns = get_table_columns($pdo, 'password_reset_requests');

    $foreignKeyColumn = in_array('user_id', $resetColumns, true) ? 'user_id' : 'employee_id';
$ins = $pdo->prepare("
    INSERT INTO password_reset_requests (
        employee_id,
        note,
        status,
        created_at
    ) VALUES (?, ?, 'pending', NOW())
");

$ins->execute([
    $userId,
    ($note !== '' ? $note : 'طلب إعادة تعيين كلمة المرور'),
]);
    unset($_SESSION['csrf_forgot']);
    $_SESSION['forgot_ok'] = 'تم إرسال طلب إعادة تعيين كلمة المرور إلى الإدارة بنجاح.';
    redirect_to('forgot_password.php');

} catch (PDOException $e) {
    $_SESSION['forgot_err'] = 'خطأ قاعدة بيانات: ' . $e->getMessage();
    redirect_to('forgot_password.php');
} catch (Throwable $e) {
    $_SESSION['forgot_err'] = 'خطأ عام: ' . $e->getMessage();
    redirect_to('forgot_password.php');
}