<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/session_bootstrap.php';

if (!empty($_SESSION['logged_in'])) {
    header('Location: /home/');
    exit();
}

$host = "localhost";
$db   = "togethere_cloud";
$user = "root";
$pass = "HasloDoSQL";

try {
    $pdo = new PDO(
        "mysql:host=$host;dbname=$db;charset=utf8mb4",
        $user,
        $pass,
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    );
    $pdo->exec("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci");
} catch (PDOException $e) {
    die("Błąd połączenia z bazą danych.");
}

function fp_validatePassword(string $p, string $email = '', string $username = ''): array {
    $errors = [];
    if (strlen($p) < 12)                    $errors[] = "Hasło musi mieć minimum 12 znaków";
    if (strlen($p) > 72)                    $errors[] = "Hasło może mieć maksymalnie 72 znaki";
    if (!preg_match('/[A-Z]/', $p))         $errors[] = "Hasło musi zawierać wielką literę";
    if (!preg_match('/[a-z]/', $p))         $errors[] = "Hasło musi zawierać małą literę";
    if (!preg_match('/[0-9]/', $p))         $errors[] = "Hasło musi zawierać cyfrę";
    if (!preg_match('/[^A-Za-z0-9]/', $p))  $errors[] = "Hasło musi zawierać znak specjalny";
    if (preg_match('/\s/', $p))            $errors[] = "Hasło nie może zawierać spacji";
    if (preg_match('/(.)\1\1/', $p))      $errors[] = "Hasło nie może zawierać potrójnych powtórzeń znaków";

    $lowerPassword = strtolower($p);
    $emailLocal = '';
    if ($email !== '' && strpos($email, '@') !== false) {
        $emailLocal = strtolower((string) explode('@', $email, 2)[0]);
    }
    $lowerUsername = strtolower($username);

    if ($emailLocal !== '' && strlen($emailLocal) >= 3 && strpos($lowerPassword, $emailLocal) !== false) {
        $errors[] = "Hasło nie może zawierać nazwy z adresu email";
    }
    if ($lowerUsername !== '' && strlen($lowerUsername) >= 3 && strpos($lowerPassword, $lowerUsername) !== false) {
        $errors[] = "Hasło nie może zawierać nazwy użytkownika";
    }

    $commonWeak = ['password', 'qwerty', '123456', 'admin', 'letmein', 'welcome'];
    foreach ($commonWeak as $weak) {
        if (strpos($lowerPassword, $weak) !== false) {
            $errors[] = "Hasło jest zbyt słabe (zawiera popularny schemat)";
            break;
        }
    }
    return $errors;
}

$step  = 1; // 1=email, 2=kod, 3=nowe hasło
$error = '';
$success = '';
$email = '';

/* ------------------------------------------------------------------ */
/* KROK 1 – Wysłanie kodu na email                                     */
/* ------------------------------------------------------------------ */
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'send_code') {
    $email = trim((string)($_POST['email'] ?? ''));

    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $error = 'Podaj prawidłowy adres email.';
        $step  = 1;
    } else {
        $stmt = $pdo->prepare("SELECT id, disabled, account_suspended FROM users WHERE email = ? LIMIT 1");
        $stmt->execute([$email]);
        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        // Nie zdradzamy, czy email istnieje (ochrona przed wyliczeniem kont)
        if ($row && (int)($row['disabled'] ?? 0) === 0 && (int)($row['account_suspended'] ?? 0) === 0) {
            $code    = str_pad(random_int(0, 999999), 6, '0', STR_PAD_LEFT);
            $expires = date('Y-m-d H:i:s', strtotime('+15 minutes'));

            $pdo->prepare("UPDATE users SET password_reset_code = ?, password_reset_expires = ? WHERE id = ?")
                ->execute([$code, $expires, (int)$row['id']]);

            require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/smtp_helper.php';

            $subject = "Kod zmiany hasła - Wspólnie";
            $message = "
<!DOCTYPE html>
<html>
<head><meta charset='utf-8'>
<style>
body { font-family: Arial, sans-serif; background:#f0f8ff; padding:20px; }
.c { max-width:600px; margin:0 auto; background:white; padding:40px; border-radius:15px; box-shadow:0 4px 6px rgba(0,0,0,.1); }
h1 { color:#ff9800; text-align:center; }
.code { font-size:32px; font-weight:bold; color:#ff9800; text-align:center; letter-spacing:5px; margin:30px 0; padding:20px; background:#fff3e0; border-radius:10px; }
p { color:#2c3e50; line-height:1.6; }
.footer { margin-top:30px; padding-top:20px; border-top:2px solid #fff3e0; text-align:center; color:#7f8c8d; font-size:14px; }
</style></head>
<body>
<div class='c'>
<h1>🔒 Zmiana hasła</h1>
<p>Otrzymaliśmy prośbę o zmianę hasła do Twojego konta.</p>
<p>Twój kod weryfikacyjny to:</p>
<div class='code'>$code</div>
<p>Kod jest ważny przez <strong>15 minut</strong>.</p>
<p><strong>Jeśli to nie Ty zażądałeś zmiany hasła, zignoruj tę wiadomość.</strong></p>
<div class='footer'><p>&copy; 2026 Wspólnie. Wszelkie prawa zastrzeżone.</p></div>
</div>
</body>
</html>";
            sendEmailSMTP($email, $subject, $message);
        }

        // Zawsze pokazujemy krok 2 (nie ujawniamy, czy email istnieje)
        $_SESSION['fp_email']   = $email;
        $_SESSION['fp_step']    = 2;
        header('Location: /login/forgot_password.php');
        exit();
    }
}

/* ------------------------------------------------------------------ */
/* KROK 2a – Ponowne wysłanie kodu                                     */
/* ------------------------------------------------------------------ */
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'resend_code') {
    $email = trim((string)($_SESSION['fp_email'] ?? ''));

    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $error = 'Sesja resetowania wygasła. Zacznij od nowa.';
        unset($_SESSION['fp_email'], $_SESSION['fp_step'], $_SESSION['fp_user_id']);
        $step = 1;
    } else {
        $stmt = $pdo->prepare("SELECT id, disabled, account_suspended FROM users WHERE email = ? LIMIT 1");
        $stmt->execute([$email]);
        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        if ($row && (int)($row['disabled'] ?? 0) === 0 && (int)($row['account_suspended'] ?? 0) === 0) {
            $code = str_pad(random_int(0, 999999), 6, '0', STR_PAD_LEFT);
            $expires = date('Y-m-d H:i:s', strtotime('+15 minutes'));

            $pdo->prepare("UPDATE users SET password_reset_code = ?, password_reset_expires = ? WHERE id = ?")
                ->execute([$code, $expires, (int)$row['id']]);

            require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/smtp_helper.php';

            $subject = "Nowy kod zmiany hasła - Wspólnie";
            $message = "
<!DOCTYPE html>
<html>
<head><meta charset='utf-8'>
<style>
body { font-family: Arial, sans-serif; background:#f0f8ff; padding:20px; }
.c { max-width:600px; margin:0 auto; background:white; padding:40px; border-radius:15px; box-shadow:0 4px 6px rgba(0,0,0,.1); }
h1 { color:#ff9800; text-align:center; }
.code { font-size:32px; font-weight:bold; color:#ff9800; text-align:center; letter-spacing:5px; margin:30px 0; padding:20px; background:#fff3e0; border-radius:10px; }
p { color:#2c3e50; line-height:1.6; }
.footer { margin-top:30px; padding-top:20px; border-top:2px solid #fff3e0; text-align:center; color:#7f8c8d; font-size:14px; }
</style></head>
<body>
<div class='c'>
<h1>🔒 Nowy kod zmiany hasła</h1>
<p>Twój nowy kod weryfikacyjny to:</p>
<div class='code'>$code</div>
<p>Kod jest ważny przez <strong>15 minut</strong>.</p>
<div class='footer'><p>&copy; 2026 Wspólnie. Wszelkie prawa zastrzeżone.</p></div>
</div>
</body>
</html>";
            sendEmailSMTP($email, $subject, $message);
        }

        $success = 'Jeśli konto istnieje, nowy kod został wysłany na email.';
        $step = 2;
    }
}

/* ------------------------------------------------------------------ */
/* KROK 2 – Weryfikacja kodu                                           */
/* ------------------------------------------------------------------ */
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'verify_code') {
    $email = trim((string)($_SESSION['fp_email'] ?? ''));
    $code  = trim((string)($_POST['code'] ?? ''));

    if ($email === '' || $code === '') {
        $error = 'Kod weryfikacyjny jest wymagany.';
        $step  = 2;
    } elseif (!preg_match('/^[0-9]{6}$/', $code)) {
        $error = 'Kod musi mieć dokładnie 6 cyfr.';
        $step = 2;
    } else {
        $stmt = $pdo->prepare("SELECT id, password_reset_code, password_reset_expires FROM users WHERE email = ? LIMIT 1");
        $stmt->execute([$email]);
        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$row || empty($row['password_reset_code'])) {
            $error = 'Nieprawidłowy lub wygasły kod. Zacznij od nowa.';
            unset($_SESSION['fp_email'], $_SESSION['fp_step']);
            $step = 1;
        } elseif (strtotime((string)$row['password_reset_expires']) < time()) {
            $pdo->prepare("UPDATE users SET password_reset_code = NULL, password_reset_expires = NULL WHERE id = ?")
                ->execute([(int)$row['id']]);
            $error = 'Kod wygasł. Zacznij od nowa.';
            unset($_SESSION['fp_email'], $_SESSION['fp_step']);
            $step = 1;
        } elseif ($row['password_reset_code'] !== $code) {
            $error = 'Nieprawidłowy kod weryfikacyjny.';
            $step  = 2;
        } else {
            $_SESSION['fp_step']     = 3;
            $_SESSION['fp_user_id']  = (int)$row['id'];
            header('Location: /login/forgot_password.php');
            exit();
        }
    }
}

/* ------------------------------------------------------------------ */
/* KROK 3 – Ustawienie nowego hasła                                    */
/* ------------------------------------------------------------------ */
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'set_password') {
    $user_id  = (int)($_SESSION['fp_user_id'] ?? 0);
    $new_pass = $_POST['new_password']     ?? '';
    $confirm  = $_POST['confirm_password'] ?? '';

    if ($user_id === 0) {
        $error = 'Sesja wygasła. Zacznij od nowa.';
        unset($_SESSION['fp_email'], $_SESSION['fp_step'], $_SESSION['fp_user_id']);
        $step = 1;
    } elseif (empty($new_pass) || empty($confirm)) {
        $error = 'Wszystkie pola są wymagane.';
        $step  = 3;
    } elseif ($new_pass !== $confirm) {
        $error = 'Hasła nie są identyczne.';
        $step  = 3;
    } else {
        // Sprawdź, czy to samo hasło co poprzednie i pobierz dane do silniejszej walidacji.
        $stmt = $pdo->prepare("SELECT username, email, password FROM users WHERE id = ?");
        $stmt->execute([$user_id]);
        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        $ve = fp_validatePassword(
            $new_pass,
            (string)($row['email'] ?? ''),
            (string)($row['username'] ?? '')
        );
        if (!empty($ve)) {
            $error = implode(', ', $ve);
            $step  = 3;
        } elseif ($row && password_verify($new_pass, (string)$row['password'])) {
            $error = 'Nowe hasło nie może być takie samo jak poprzednie.';
            $step  = 3;
        } else {
            $hash = password_hash($new_pass, PASSWORD_DEFAULT);

            try {
                $pdo->beginTransaction();
                $pdo->prepare("UPDATE users SET password = ?, password_reset_code = NULL, password_reset_expires = NULL WHERE id = ?")
                    ->execute([$hash, $user_id]);

                try {
                    $pdo->prepare("DELETE FROM remember_tokens WHERE user_id = ?")->execute([$user_id]);
                } catch (Throwable $e) {
                    // Tabela remember_tokens może nie istnieć.
                }

                $pdo->commit();
            } catch (Throwable $e) {
                if ($pdo->inTransaction()) {
                    $pdo->rollBack();
                }
                $error = 'Nie udało się zapisać nowego hasła. Spróbuj ponownie.';
                $step = 3;
            }

            if ($error === '') {
                unset($_SESSION['fp_email'], $_SESSION['fp_step'], $_SESSION['fp_user_id']);
                og_session_destroy_auth(true);

                header('Location: /login/?success=' . urlencode('Hasło zostało zmienione. Zaloguj się ponownie.'));
                exit();
            }
        }
    }
}

/* ------------------------------------------------------------------ */
/* Odczyt stanu sesji (dla GET lub po błędzie)                         */
/* ------------------------------------------------------------------ */
if ($step === 1 && !empty($_SESSION['fp_step'])) {
    $step  = (int)$_SESSION['fp_step'];
    $email = (string)($_SESSION['fp_email'] ?? '');
}
?>
<!DOCTYPE html>
<html>
<head>
    <title>Resetowanie hasła | Wspólnie</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta charset="utf-8">
    <link rel="stylesheet" href="/css/header.css" type="text/css" media="all"/>
    <link rel="stylesheet" href="/css/footer.css" type="text/css" media="all"/>
    <link href="/css/font-awesome.min.css" rel="stylesheet" type="text/css" media="all">
    <link href="/css/style.css" rel="stylesheet" type="text/css" media="all"/>
    <style>
        body { background: linear-gradient(135deg, #e3f2fd 0%, #ffffff 100%); min-height: 100vh; display: flex; flex-direction: column; }
        .container { max-width: 480px; margin: 80px auto; padding: 40px; background: white; border-radius: 15px; box-shadow: 0 10px 30px rgba(100,181,246,0.2); flex: 1; }
        .container * { box-sizing: border-box; }
        h1 { color: #1976d2; text-align: center; margin-bottom: 10px; }
        .subtitle { text-align: center; color: #7f8c8d; margin-bottom: 30px; font-size: .95em; }
        .error   { background: #ffebee; color: #c62828; padding: 15px; border-radius: 8px; margin-bottom: 20px; text-align: center; border-left: 4px solid #c62828; }
        .success { background: #d4edda; color: #155724; padding: 15px; border-radius: 8px; margin-bottom: 20px; text-align: center; border-left: 4px solid #28a745; }
        .info-box { background: #e3f2fd; border-left: 4px solid #42a5f5; padding: 15px; margin: 0 auto 25px; border-radius: 5px; font-size: .95em; color: #2c3e50; max-width: 420px; }
        .container form { max-width: 360px !important; width: 100% !important; margin: 0 auto !important; }
        .container form + form { margin-top: 12px !important; }
        label { display: block; color: #2c3e50; font-weight: 600; margin-bottom: 6px; }
        input[type="email"], input[type="text"], input[type="password"] {
            width: 100%; padding: 12px 15px; border: 2px solid #e3f2fd; border-radius: 8px; font-size: 1em; margin-bottom: 20px; box-sizing: border-box;
        }
        input[type="text"].code-input {
            font-size: 24px; letter-spacing: 8px; text-align: center; font-weight: bold; color: #007BFF; max-width: 260px; display: block; margin: 0 auto 20px;
        }
        button[type="submit"] {
            width: 100%; padding: 14px; background: linear-gradient(135deg, #007BFF 0%, #0056b3 100%); color: white; border: none; border-radius: 8px; font-size: 1.1em; font-weight: 600; cursor: pointer;
        }
        button[type="submit"]:hover { opacity: .9; }
        .back-link { display: block; text-align: center; margin-top: 18px; color: #7f8c8d; font-size: .9em; }
        .back-link a { color: #007BFF; text-decoration: none; font-weight: 600; }
        .steps { display: flex; justify-content: center; gap: 8px; margin-bottom: 30px; }
        .step { width: 28px; height: 28px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: .8em; font-weight: 700; }
        .step.active   { background: #007BFF; color: white; }
        .step.done     { background: #28a745; color: white; }
        .step.inactive { background: #e3f2fd; color: #7f8c8d; }

        @media (max-width: 640px) {
            .container { margin: 32px auto; padding: 26px 20px; }
            .container form { max-width: 100% !important; }
            .info-box { max-width: 100%; }
        }
    </style>
</head>
<body>
    <?php include __DIR__ . '/../global/navNoLogined.php'; ?>

    <div class="container">
        <h1>🔑 Resetowanie hasła</h1>

        <div class="steps">
            <div class="step <?= $step === 1 ? 'active' : ($step > 1 ? 'done' : 'inactive') ?>">1</div>
            <div class="step <?= $step === 2 ? 'active' : ($step > 2 ? 'done' : 'inactive') ?>">2</div>
            <div class="step <?= $step === 3 ? 'active' : 'inactive' ?>">3</div>
        </div>

        <?php if ($error): ?>
            <div class="error"><?= htmlspecialchars($error) ?></div>
        <?php endif; ?>

        <?php if ($success): ?>
            <div class="success"><?= htmlspecialchars($success) ?></div>
        <?php endif; ?>

        <!-- KROK 1: email -->
        <?php if ($step === 1): ?>
            <p class="subtitle">Podaj adres email przypisany do konta</p>
            <form method="POST" action="/login/forgot_password.php">
                <input type="hidden" name="action" value="send_code">
                <label for="email">Adres email</label>
                <input type="email" id="email" name="email" value="<?= htmlspecialchars($email) ?>" placeholder="twoj@email.com" required autofocus>
                <button type="submit">Wyślij kod resetowania</button>
            </form>

        <!-- KROK 2: kod -->
        <?php elseif ($step === 2): ?>
            <p class="subtitle">Wpisz 6-cyfrowy kod wysłany na<br><strong><?= htmlspecialchars($email) ?></strong></p>
            <div class="info-box">⏱️ Kod jest ważny przez 15 minut od wysłania.</div>
            <form method="POST" action="/login/forgot_password.php">
                <input type="hidden" name="action" value="verify_code">
                <input type="text" name="code" class="code-input" maxlength="6" pattern="[0-9]{6}" placeholder="000000" required autofocus>
                <button type="submit">Zweryfikuj kod</button>
            </form>
            <form method="POST" action="/login/forgot_password.php" style="margin-top:12px;">
                <input type="hidden" name="action" value="resend_code">
                <button type="submit">Wyślij kod ponownie</button>
            </form>

        <!-- KROK 3: nowe hasło -->
        <?php elseif ($step === 3): ?>
            <p class="subtitle">Ustaw nowe hasło do swojego konta</p>
            <div class="info-box">Hasło: minimum 12 znaków, mała i wielka litera, cyfra, znak specjalny, bez spacji.</div>
            <form method="POST" action="/login/forgot_password.php">
                <input type="hidden" name="action" value="set_password">
                <label for="new_password">Nowe hasło</label>
                <input type="password" id="new_password" name="new_password" placeholder="Min. 12 znaków, A-z, 0-9, znak specjalny" required autofocus>
                <label for="confirm_password">Powtórz hasło</label>
                <input type="password" id="confirm_password" name="confirm_password" placeholder="Powtórz nowe hasło" required>
                <button type="submit">Ustaw nowe hasło</button>
            </form>
        <?php endif; ?>

        <span class="back-link"><a href="/login/">← Wróć do logowania</a></span>
    </div>

    <?php include __DIR__ . '/../global/footerNoLogined.php'; ?>
</body>
</html>
