<?php
declare(strict_types=1);
session_start();

require_once __DIR__ . '/includes/db_connect.php';

/* Назва для хедера */
$header_title = 'Новий пароль';

/**
 * Безпечний вивід тексту в HTML.
 */
function rp_h(string $value): string
{
    return htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}

/**
 * Беремо токен з можливих назв параметра.
 * Це страхує ситуацію, якщо forgot_password.php сформував посилання
 * з token, reset_token або code.
 */
function rp_get_token(): string
{
    $sources = [];

    if (isset($_POST['token'])) {
        $sources[] = (string)$_POST['token'];
    }
    if (isset($_GET['token'])) {
        $sources[] = (string)$_GET['token'];
    }
    if (isset($_GET['reset_token'])) {
        $sources[] = (string)$_GET['reset_token'];
    }
    if (isset($_GET['code'])) {
        $sources[] = (string)$_GET['code'];
    }

    foreach ($sources as $token) {
        $token = trim($token);
        if ($token !== '') {
            return $token;
        }
    }

    return '';
}

/**
 * Шукаємо користувача по токену.
 * Перевірку reset_expires НЕ ставимо прямо у WHERE, бо на різних серверах
 * PHP і MySQL можуть мати різний часовий пояс, і тоді свіже посилання
 * помилково стає "простроченим".
 */
function rp_find_user_by_token(mysqli $conn, string $token): ?array
{
    if ($token === '') {
        return null;
    }

    $tokenHash = hash('sha256', $token);

    $stmt = $conn->prepare(
        "SELECT id, reset_expires, NOW() AS db_now
         FROM users
         WHERE reset_token = ? OR reset_token = ?
         LIMIT 1"
    );

    if (!$stmt) {
        return null;
    }

    $stmt->bind_param('ss', $token, $tokenHash);
    $stmt->execute();
    $res = $stmt->get_result();
    $row = $res ? $res->fetch_assoc() : null;
    $stmt->close();

    return $row ?: null;
}

/**
 * Перевірка строку дії токена.
 * Вважаємо токен дійсним, якщо він ще не прострочений хоча б відносно
 * часу PHP або часу MySQL. Це прибирає типову проблему після переносу
 * сайту на інший сервер/панель.
 */
function rp_token_is_not_expired(array $user): bool
{
    $expires = trim((string)($user['reset_expires'] ?? ''));
    if ($expires === '') {
        return false;
    }

    $expiresTs = strtotime($expires);
    if ($expiresTs === false) {
        return false;
    }

    $phpNowTs = time();
    if ($expiresTs >= $phpNowTs) {
        return true;
    }

    $dbNow = trim((string)($user['db_now'] ?? ''));
    $dbNowTs = $dbNow !== '' ? strtotime($dbNow) : false;
    if ($dbNowTs !== false && $expiresTs >= $dbNowTs) {
        return true;
    }

    return false;
}

$token = rp_get_token();
$message = '';
$messageType = '';
$canShowForm = false;
$passwordChanged = false;

$userByToken = rp_find_user_by_token($conn, $token);

if ($token === '' || !$userByToken || !rp_token_is_not_expired($userByToken)) {
    $message = 'Посилання недійсне або прострочене. Спробуйте відновити пароль ще раз.';
    $messageType = 'err';
} else {
    $canShowForm = true;
}

if (($_SERVER['REQUEST_METHOD'] ?? '') === 'POST') {
    $new_password = (string)($_POST['password'] ?? '');
    $new_password_repeat = (string)($_POST['password_repeat'] ?? '');

    if (!$canShowForm || !$userByToken) {
        $message = 'Посилання недійсне або прострочене. Спробуйте відновити пароль ще раз.';
        $messageType = 'err';
    } elseif (mb_strlen($new_password, 'UTF-8') < 6) {
        $message = 'Пароль має містити щонайменше 6 символів.';
        $messageType = 'err';
    } elseif ($new_password !== $new_password_repeat) {
        $message = 'Паролі не співпадають.';
        $messageType = 'err';
    } else {
        $hash = password_hash($new_password, PASSWORD_DEFAULT);
        $uid = (int)$userByToken['id'];

        $upd = $conn->prepare(
            "UPDATE users
             SET password = ?, reset_token = NULL, reset_expires = NULL
             WHERE id = ?"
        );

        if ($upd) {
            $upd->bind_param('si', $hash, $uid);
            $upd->execute();
            $affected = $upd->affected_rows;
            $upd->close();

            if ($affected >= 0) {
                $passwordChanged = true;
                $canShowForm = false;
                $message = 'Пароль змінено. Тепер ви можете <a href="index.php">увійти</a>.';
                $messageType = 'ok';
            } else {
                $message = 'Не вдалося змінити пароль. Спробуйте ще раз.';
                $messageType = 'err';
            }
        } else {
            $message = 'Не вдалося змінити пароль. Спробуйте ще раз.';
            $messageType = 'err';
        }
    }
}
?>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Новий пароль</title>
<link rel="stylesheet" href="/assets/css/style.css">
<style>
:root{
  --brand-mint:#a3e8d3;
  --brand-mint-2:#92dec7;
  --brand-purple:#432755;
  --brand-purple-2:#3a244d;

  --ink:#1f2937;
  --muted:#4b5563;
  --card:#ffffff;
  --shadow: 0 10px 24px rgba(0,0,0,.08);
  --focus: rgba(67,39,85,.25);
}

.rp-wrap{
  max-width:1100px;
  margin:16px auto;
  padding:16px;
}

.rp-card{
  max-width:520px;
  margin:0 auto;
  background: var(--card);
  padding:18px;
  border-radius:16px;
  box-shadow: var(--shadow);
  border: 1px solid rgba(0,0,0,.06);
}

.rp-head{
  text-align:center;
  margin-bottom: 10px;
}
.rp-head h2{
  margin:0 0 8px 0;
  font-size:24px;
  font-weight:900;
  color: var(--brand-purple);
}
.rp-head p{
  margin:0;
  color: var(--muted);
  font-weight:700;
  font-size:14px;
  line-height:1.4;
}

label{
  display:block;
  font-size:14px;
  margin: 10px 0 6px 0;
  font-weight:900;
  color: var(--brand-purple);
}

input[type=password]{
  width:100%;
  padding:12px 12px;
  border:1px solid rgba(0,0,0,.14);
  border-radius:12px;
  font-size:16px;
  outline:none;
  transition: border-color .15s ease, box-shadow .15s ease;
  background:#fff;
  color: var(--ink);
}

input[type=password]:focus{
  border-color: rgba(67,39,85,.35);
  box-shadow: 0 0 0 4px var(--focus);
}

button,
.rp-link-btn{
  margin-top:12px;
  width:100%;
  background: var(--brand-purple);
  color:#fff;
  border:none;
  padding:12px 16px;
  border-radius:12px;
  cursor:pointer;
  font-weight:900;
  box-shadow: 0 10px 18px rgba(67,39,85,.16);
  transition: background .15s ease, transform .05s ease, box-shadow .15s ease;
  display:block;
  text-align:center;
  text-decoration:none;
  box-sizing:border-box;
}
button:hover,
.rp-link-btn:hover{
  background: var(--brand-purple-2);
  box-shadow: 0 12px 22px rgba(67,39,85,.20);
}
button:active,
.rp-link-btn:active{ transform: translateY(1px); }

.msg{
  margin-top:14px;
  font-weight:900;
  padding: 12px 14px;
  border-radius:14px;
  border: 1px solid rgba(0,0,0,.08);
  background: rgba(163,232,211,.18);
  color: var(--brand-purple);
  line-height:1.45;
}
.msg a{
  color: var(--brand-purple-2);
  text-decoration: underline;
}

.msg.err{
  background: rgba(185,28,28,.08);
  border-color: rgba(185,28,28,.20);
  color: #b91c1c;
}

.msg.ok{
  background: rgba(22,163,74,.10);
  border-color: rgba(22,163,74,.22);
  color: #166534;
}

@media (max-width:600px){
  .rp-wrap{ padding: 12px; }
  .rp-card{ padding: 16px; border-radius: 14px; }
}
</style>
</head>
<body>

<?php require_once __DIR__ . '/includes/header.php'; ?>

<main class="rp-wrap">
  <section class="rp-card" aria-label="Створення нового паролю">
    <div class="rp-head">
      <h2>Створіть новий пароль</h2>
      <p>Пароль має містити щонайменше 6 символів.</p>
    </div>

    <?php if ($canShowForm && !$passwordChanged): ?>
      <form method="post" action="reset_password.php?token=<?= urlencode($token) ?>" autocomplete="off">
        <input type="hidden" name="token" value="<?= rp_h($token) ?>">

        <label for="password">Новий пароль</label>
        <input id="password" type="password" name="password" required minlength="6" autocomplete="new-password">

        <label for="password_repeat">Повторіть новий пароль</label>
        <input id="password_repeat" type="password" name="password_repeat" required minlength="6" autocomplete="new-password">

        <button type="submit">Зберегти</button>
      </form>
    <?php endif; ?>

    <?php if ($message): ?>
      <p class="msg <?= rp_h($messageType) ?>"><?= $message ?></p>
    <?php endif; ?>

    <?php if (!$canShowForm && !$passwordChanged): ?>
      <a class="rp-link-btn" href="forgot_password.php">Відновити пароль ще раз</a>
    <?php endif; ?>
  </section>
</main>

<?php require_once __DIR__ . '/includes/footer.php'; ?>

</body>
</html>