<?php
// forgot_password.php - Self-Service Passwort-Reset (Anfrage)
require_once 'db.php';
require_once 'security.php';
require_once 'RateLimiter.php';
require_once 'password_reset_helpers.php';

if (isLoggedIn()) {
    header('Location: index.php');
    exit;
}

ensurePasswordResetsTable($db);

$rateLimiter = new RateLimiter($db);
$clientIP = $_SERVER['REMOTE_ADDR'] ?? 'unknown';

$message = '';
$error = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $submitted_token = $_POST['csrf_token'] ?? '';
    $session_token   = $_SESSION['csrf_token'] ?? '';
    if (empty($submitted_token) || $submitted_token !== $session_token) {
        $error = 'Ungültiges Sicherheits-Token. Bitte Seite neu laden.';
    } elseif ($rateLimiter->isLocked($clientIP, 'password_reset')) {
        $minutes = ceil($rateLimiter->getRemainingLockTime($clientIP, 'password_reset') / 60);
        $error = "Zu viele Anfragen. Bitte in $minutes Minute(n) erneut versuchen.";
    } else {
        $usernameInput = trim($_POST['username'] ?? '');
        $rateLimiter->recordAttempt($clientIP, 'password_reset');

        // Immer dieselbe generische Meldung, unabhängig davon ob der Nutzer existiert
        // oder eine E-Mail hinterlegt hat (kein Enumeration-Leck).
        $message = 'Falls ein Konto mit diesem Benutzernamen existiert und eine E-Mail-Adresse '
                  . 'hinterlegt ist, wurde soeben ein Link zum Zurücksetzen des Passworts versendet.';

        if ($usernameInput !== '') {
            try {
                $user = $db->selectOne(
                    "SELECT id, email FROM users WHERE LOWER(username) = LOWER(?)",
                    [$usernameInput]
                );
                if ($user && !empty($user['email'])) {
                    $token = createPasswordResetToken($db, (int)$user['id']);
                    $host = $_SERVER['HTTP_HOST'] ?? 'localhost';
                    $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
                    $resetLink = $scheme . '://' . $host . '/reset_password.php?token=' . $token;

                    $appName = defined('APP_NAME') ? APP_NAME : 'Valu-Basic';
                    sendPasswordResetEmail($user['email'], $resetLink, $appName);

                    Security::logSecurityEvent('password_reset_requested', ['username' => $usernameInput]);
                }
            } catch (Exception $e) {
                // Bewusst keine Fehlerdetails an den Client — generische Meldung bleibt bestehen.
                Security::logSecurityEvent('password_reset_error', ['error' => $e->getMessage()]);
            }
        }
    }
}

$appName = defined('APP_NAME') ? APP_NAME : 'Valu-Basic';
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Passwort vergessen – <?php echo htmlspecialchars($appName); ?></title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
    min-height: 100vh; display: flex; align-items: center; justify-content: center;
    background: linear-gradient(135deg, #0c1f3d 0%, #1a3d6b 50%, #2a5f9e 100%);
    padding: 1rem;
}
.box { max-width: 420px; width: 100%; background: white; padding: 32px; border-radius: 14px; box-shadow: 0 10px 40px rgba(0,0,0,0.2); }
h2 { font-size: 20px; margin-bottom: 6px; color: #1a3d6b; }
.subtitle { color: #7f8c8d; font-size: 13px; margin-bottom: 24px; }
label { display: block; font-size: 13px; font-weight: 600; color: #555; margin-bottom: 5px; }
input { width: 100%; padding: 10px 12px; border: 1px solid #ddd; border-radius: 6px; font-size: 14px; margin-bottom: 16px; }
button { width: 100%; padding: 12px; background: #1a3d6b; color: white; border: none; border-radius: 6px; font-size: 15px; font-weight: 600; cursor: pointer; }
button:hover { background: #15305a; }
.msg-success { background: #f0fdf4; border-left: 4px solid #27ae60; color: #166534; padding: 12px 14px; border-radius: 6px; margin-bottom: 16px; font-size: 13px; }
.msg-error { background: #fef2f2; border-left: 4px solid #dc2626; color: #991b1b; padding: 12px 14px; border-radius: 6px; margin-bottom: 16px; font-size: 13px; }
.back-link { display: block; text-align: center; margin-top: 16px; color: #888; font-size: 13px; text-decoration: underline; }
</style>
</head>
<body>
<div class="box">
    <h2>🔑 Passwort vergessen</h2>
    <p class="subtitle">Gib deinen Benutzernamen ein — falls eine E-Mail-Adresse hinterlegt ist, senden wir dir einen Link zum Zurücksetzen.</p>

    <?php if ($message): ?><div class="msg-success"><?php echo htmlspecialchars($message); ?></div><?php endif; ?>
    <?php if ($error): ?><div class="msg-error"><?php echo htmlspecialchars($error); ?></div><?php endif; ?>

    <?php if (!$message): ?>
    <form method="POST" action="">
        <?php echo Security::getCSRFInput(); ?>
        <label for="username">Benutzername</label>
        <input type="text" id="username" name="username" required autofocus autocomplete="username">
        <button type="submit">Link anfordern</button>
    </form>
    <?php endif; ?>

    <a href="login.php" class="back-link">← Zurück zum Login</a>
</div>
</body>
</html>
