<?php
declare(strict_types=1);

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

require_once __DIR__ . '/db.php';
require_once __DIR__ . '/inc/layout.php';

if (empty($_SESSION['user_id'])) {
    header("Location: index.html?e=1");
    exit;
}

$role = strtoupper((string)($_SESSION['role'] ?? ''));
if (!in_array($role, ['OWNER', 'ADMIN'], true)) {
    http_response_code(403);
    exit('غير مصرح');
}

function h($s): string
{
    return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8');
}

function csrf_token(): string
{
    if (empty($_SESSION['csrf_admin_reset'])) {
        $_SESSION['csrf_admin_reset'] = bin2hex(random_bytes(32));
    }
    return (string)$_SESSION['csrf_admin_reset'];
}

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

$pdo = db();
if (!$pdo instanceof PDO) {
    http_response_code(500);
    exit('DB not ready');
}

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

$requestId = (int)($_GET['request_id'] ?? $_POST['request_id'] ?? 0);
if ($requestId <= 0) {
    http_response_code(400);
    exit('طلب غير صالح');
}

$usersCols = get_table_columns($pdo, 'users');
$resetCols = get_table_columns($pdo, 'password_reset_requests');

$displayExpr = "CAST(u.id AS CHAR)";
if (in_array('full_name', $usersCols, true)) {
    $displayExpr = "u.full_name";
} elseif (in_array('name', $usersCols, true)) {
    $displayExpr = "u.name";
} elseif (in_array('username', $usersCols, true)) {
    $displayExpr = "u.username";
} elseif (in_array('email', $usersCols, true)) {
    $displayExpr = "u.email";
}

$emailExpr = in_array('email', $usersCols, true) ? "u.email" : "NULL";
$usernameExpr = in_array('username', $usersCols, true)
    ? "u.username"
    : (in_array('name', $usersCols, true) ? "u.name" : "NULL");

$foreignKeyColumn = in_array('user_id', $resetCols, true) ? 'user_id' : 'employee_id';

$st = $pdo->prepare("
    SELECT
        r.id,
        r.`{$foreignKeyColumn}` AS account_id,
        r.status,
        r.note,
        r.created_at,
        {$displayExpr} AS display_name,
        {$usernameExpr} AS username_value,
        {$emailExpr} AS email
    FROM password_reset_requests r
    LEFT JOIN users u ON u.id = r.`{$foreignKeyColumn}`
    WHERE r.id = ?
    LIMIT 1
");
$st->execute([$requestId]);
$row = $st->fetch();

if (!$row) {
    http_response_code(404);
    exit('الطلب غير موجود');
}

if ((string)$row['status'] !== 'pending') {
    exit('هذا الطلب تمت معالجته مسبقاً.');
}

$error = '';
$ok = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $csrf = (string)($_POST['csrf'] ?? '');

    if (
        $csrf === '' ||
        empty($_SESSION['csrf_admin_reset']) ||
        !hash_equals((string)$_SESSION['csrf_admin_reset'], $csrf)
    ) {
        $error = 'انتهت الجلسة. حاول مرة أخرى.';
    } else {
        $password = (string)($_POST['password'] ?? '');
        $confirm  = (string)($_POST['confirm_password'] ?? '');

        if (mb_strlen($password) < 6) {
            $error = 'كلمة المرور يجب أن تكون 6 أحرف على الأقل.';
        } elseif ($password !== $confirm) {
            $error = 'كلمتا المرور غير متطابقتين.';
        } else {
            try {
                if (!in_array('password', $usersCols, true)) {
                    throw new RuntimeException('جدول users لا يحتوي على عمود password.');
                }

                $hash = password_hash($password, PASSWORD_DEFAULT);

                $pdo->beginTransaction();

                $up1 = $pdo->prepare("
                    UPDATE users
                    SET password = ?
                    WHERE id = ?
                ");
                $up1->execute([
                    $hash,
                    (int)$row['account_id']
                ]);

                $updateFields = ["status = 'done'"];
                $params = [];

                if (in_array('handled_at', $resetCols, true)) {
                    $updateFields[] = "handled_at = NOW()";
                }

                if (in_array('handled_by', $resetCols, true)) {
                    $updateFields[] = "handled_by = ?";
                    $params[] = (int)$_SESSION['user_id'];
                }

                $params[] = $requestId;

                $sqlUpdate = "
                    UPDATE password_reset_requests
                    SET " . implode(', ', $updateFields) . "
                    WHERE id = ?
                ";

                $up2 = $pdo->prepare($sqlUpdate);
                $up2->execute($params);

                $pdo->commit();
                $ok = 'تمت إعادة تعيين كلمة المرور بنجاح.';
            } catch (Throwable $e) {
                if ($pdo->inTransaction()) {
                    $pdo->rollBack();
                }
                $error = 'حدث خطأ أثناء الحفظ: ' . $e->getMessage();
            }
        }
    }
}
?>
<!doctype html>
<html lang="ar" dir="rtl">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <title>إعادة تعيين كلمة المرور</title>
  <link href="https://fonts.googleapis.com/css2?family=Tajawal:wght@400;500;700;800&display=swap" rel="stylesheet">
  <style>
    body{
      margin:0;
      min-height:100vh;
      font-family:'Tajawal',sans-serif;
      background:#f4f7f8;
      display:flex;
      align-items:center;
      justify-content:center;
      padding:24px;
    }
    .card{
      width:100%;
      max-width:560px;
      background:#fff;
      border:1px solid #e6edef;
      border-radius:22px;
      box-shadow:0 14px 35px rgba(0,0,0,.08);
      padding:24px;
    }
    h1{margin:0 0 10px;color:#00424f}
    .info{
      background:#f7fbfc;
      border:1px solid #e6edef;
      border-radius:16px;
      padding:14px 16px;
      margin-bottom:18px;
      line-height:1.9;
      color:#35535b;
    }
    .field{margin-bottom:14px}
    label{display:block;margin-bottom:7px;font-weight:700;color:#00424f}
    input{
      width:100%;
      height:50px;
      border:1px solid #dbe7ea;
      border-radius:14px;
      padding:0 14px;
      font-family:'Tajawal',sans-serif;
      font-size:16px;
      background:#eef4f7
    }
    .btn{
      width:100%;
      height:52px;
      border:none;
      border-radius:14px;
      background:#006a7a;
      color:#fff;
      font-family:'Tajawal',sans-serif;
      font-size:17px;
      font-weight:800;
      cursor:pointer
    }
    .msg{
      padding:12px 14px;
      border-radius:14px;
      margin-bottom:14px;
      line-height:1.8
    }
    .err{
      background:#fff1f1;
      color:#9f1d1d;
      border:1px solid #f3c2c2
    }
    .ok{
      background:#ecfdf3;
      color:#0f6b3f;
      border:1px solid #b7e4c7
    }
    .back{
      display:inline-block;
      margin-top:14px;
      color:#006a7a;
      text-decoration:none;
      font-weight:700
    }
  </style>
</head>
<body>
  <div class="card">
    <h1>إعادة تعيين كلمة المرور</h1>

    <div class="info">
      المستخدم: <?= h($row['display_name'] ?: ('مستخدم #' . (int)$row['account_id'])) ?><br>
      اسم الدخول: <?= h($row['username_value'] ?: '—') ?><br>
      البريد الإلكتروني: <?= h($row['email'] ?: '—') ?><br>
      الملاحظة: <?= h($row['note'] ?: '—') ?><br>
      تاريخ الطلب: <?= h($row['created_at']) ?>
    </div>

    <?php if ($error !== ''): ?>
      <div class="msg err"><?= h($error) ?></div>
    <?php endif; ?>

    <?php if ($ok !== ''): ?>
      <div class="msg ok"><?= h($ok) ?></div>
      <a class="back" href="password_reset_requests.php">العودة إلى الطلبات</a>
    <?php else: ?>
      <form method="post">
        <input type="hidden" name="csrf" value="<?= h(csrf_token()) ?>">
        <input type="hidden" name="request_id" value="<?= (int)$requestId ?>">

        <div class="field">
          <label for="password">كلمة المرور الجديدة</label>
          <input type="password" id="password" name="password" required>
        </div>

        <div class="field">
          <label for="confirm_password">تأكيد كلمة المرور</label>
          <input type="password" id="confirm_password" name="confirm_password" required>
        </div>

        <button class="btn" type="submit">حفظ كلمة المرور الجديدة</button>
      </form>

      <a class="back" href="password_reset_requests.php">العودة إلى الطلبات</a>
    <?php endif; ?>
  </div>
</body>
</html>