<?php
// profile_change_request.php
require_once __DIR__ . '/../Login/config.php';
require_once __DIR__ . '/mail_helper.php';

if (session_status() === PHP_SESSION_NONE) session_start();
if (!isset($_SESSION['user_id'])) {
    header('Location: ../Login/login.php');
    exit;
}

// ambil email user dari DB (lebih aman daripada session jika email bisa berubah)
$stmt = $pdo->prepare("SELECT email FROM users WHERE id = ? LIMIT 1");
$stmt->execute([$_SESSION['user_id']]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$user) {
    die('User tidak ditemukan.');
}
$email = $user['email'];

// rate limit sederhana: cek berapa token confirm_change dalam 15 menit terakhir
$limitWindow = date('Y-m-d H:i:s', time() - 15*60);
$check = $pdo->prepare("SELECT COUNT(*) FROM password_resets WHERE email = ? AND created_at >= ? AND (purpose = 'confirm_change' OR ? = ?)");
/* catatan: query di atas memakai trick agar kode tetap jalan walau kolom purpose tidak ada.
   Jika kolom purpose tidak ada, database akan error — jika kamu yakin purpose belum ada,
   gunakan query alternatif di komentar di bawah. */
try {
    $check->execute([$email, $limitWindow, 'x','x']); // harmless execute if purpose exists
    $count = $check->fetchColumn();
} catch (Throwable $e) {
    // fallback: jika kolom purpose tidak ada, hitung semua token berdasarkan created_at
    $check2 = $pdo->prepare("SELECT COUNT(*) FROM password_resets WHERE email = ? AND created_at >= ?");
    $check2->execute([$email, $limitWindow]);
    $count = $check2->fetchColumn();
}

if ($count >= 3) {
    // batasi: max 3 request dalam 15 menit
    $_SESSION['profile_change_msg'] = "Anda sudah meminta kode terlalu sering. Tunggu beberapa menit lalu coba lagi.";
    header('Location: akun.php');
    exit;
}

// buat kode numeric 6 digit
$tokenPlain = strval(random_int(100000, 999999)); // contoh: 6-digit
$tokenHash = password_hash($tokenPlain, PASSWORD_DEFAULT);
$expires_at = date('Y-m-d H:i:s', time() + 15*60); // berlaku 15 menit

// simpan token ke DB (purpose = confirm_change jika kolom ada)
try {
    // jika kolom purpose ada -> gunakan INSERT with purpose
    $pdo->prepare("INSERT INTO password_resets (email, token_hash, expires_at, created_at, purpose) VALUES (?, ?, ?, NOW(), 'confirm_change')")
        ->execute([$email, $tokenHash, $expires_at]);
} catch (Throwable $e) {
    // fallback: jika kolom purpose tidak ada, insert tanpa purpose
    $pdo->prepare("INSERT INTO password_resets (email, token_hash, expires_at) VALUES (?, ?, ?)")
        ->execute([$email, $tokenHash, $expires_at]);
}

// kirim email berisi token (bukan link)
$subject = "Kode Konfirmasi Ganti Password - Pustakaia";
$html = "<p>Halo,</p>
<p>Kode untuk konfirmasi ganti password akunmu adalah:</p>
<h2 style='letter-spacing:4px;'>{$tokenPlain}</h2>
<p>Kode berlaku 15 menit. Jika kamu tidak meminta kode ini, abaikan email ini.</p>
<p>Salam,<br>Pustakaia</p>";

$sent = sendMail($email, $subject, $html);

// jangan tampilkan detail apakah sukses atau tidak ke user — cukup notifikasi umum
$_SESSION['profile_change_msg'] = "Kode konfirmasi telah dikirim ke email terdaftar (cek Inbox / Spam).";
header('Location: akun.php');
exit;
