<?php
session_start();
require_once __DIR__ . '/includes/db_connect.php';
$config = require __DIR__ . '/includes/config_mail.php';

/* ========= PHPMailer (ручне підключення) ========= */
require_once __DIR__ . '/includes/PHPMailer/src/PHPMailer.php';
require_once __DIR__ . '/includes/PHPMailer/src/SMTP.php';
require_once __DIR__ . '/includes/PHPMailer/src/Exception.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

/* ========= CSRF ========= */
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(16));
}
$csrf = $_SESSION['csrf_token'];

/* ========= Throttle (простий ліміт запитів на IP) ========= */
$clientIp = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
$_SESSION['reg_throttle'] = $_SESSION['reg_throttle'] ?? [];
$_SESSION['reg_throttle'][$clientIp] = array_values(array_filter(
    $_SESSION['reg_throttle'][$clientIp] ?? [],
    fn($ts) => (time() - $ts) < 60
));
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $_SESSION['reg_throttle'][$clientIp][] = time();
}
$tooMany = count($_SESSION['reg_throttle'][$clientIp] ?? []) > 20;

/* ========= Хелпери ========= */
function make_activation_code(): string {
    return bin2hex(random_bytes(16)); // 32 hex
}
function site_url(string $path): string {
    $is_https = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || (($_SERVER['SERVER_PORT'] ?? '80') == '443');
    $scheme = $is_https ? 'https' : 'http';
    $host   = $_SERVER['HTTP_HOST'] ?? 'localhost';
    return $scheme . '://' . $host . $path;
}
function h(?string $s): string {
    return htmlspecialchars((string)$s, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}

$error = null;
$success = null;

/* ========= Обробка реєстрації ========= */
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!isset($_POST['csrf_token']) || !hash_equals($_SESSION['csrf_token'], (string)$_POST['csrf_token'])) {
        $error = "Помилка безпеки (CSRF). Оновіть сторінку й спробуйте знову.";
    } elseif ($tooMany) {
        $error = "Забагато запитів. Спробуйте пізніше.";
    } else {
        $full_name = trim($_POST['full_name'] ?? '');
        $email_raw = trim($_POST['email'] ?? '');
        $password_raw = (string)($_POST['password'] ?? '');
        $group_id = (int)($_POST['group_id'] ?? 0);

        if ($full_name === '' || $email_raw === '' || $password_raw === '' || $group_id <= 0) {
            $error = "Усі поля обов'язкові, включаючи групу!";
        } elseif (mb_strlen($full_name) > 255) {
            $error = "ПІБ не може бути довшим за 255 символів!";
        } elseif (!filter_var($email_raw, FILTER_VALIDATE_EMAIL)) {
            $error = "Некоректний формат email.";
        } elseif (strlen($password_raw) < 6) {
            $error = "Пароль має містити щонайменше 6 символів.";
        } else {
            $email = $email_raw;

            // Перевіримо наявність групи
            $grp_sql = "SELECT id FROM `groups` WHERE id = ?";
            if ($gstmt = $conn->prepare($grp_sql)) {
                $gstmt->bind_param('i', $group_id);
                $gstmt->execute();
                $gres = $gstmt->get_result();
                if ($gres->num_rows === 0) {
                    $error = "Обрану групу не знайдено.";
                }
                $gstmt->close();
            } else {
                $error = "Помилка підготовки запиту (group).";
            }

            if (!$error) {
                // Чи існує вже користувач із таким email?
                $check_sql = "SELECT id, active FROM users WHERE email = ?";
                if ($cstmt = $conn->prepare($check_sql)) {
                    $cstmt->bind_param("s", $email);
                    $cstmt->execute();
                    $cres = $cstmt->get_result();

                    $activation_code = make_activation_code();
                    $password_hash   = password_hash($password_raw, PASSWORD_DEFAULT);
                    $now_active      = 0;

                    if ($cres->num_rows > 0) {
                        $usr = $cres->fetch_assoc();
                        $uid = (int)$usr['id'];
                        $is_active = (int)$usr['active'] === 1;

                        if ($is_active) {
                            $error = "Цей email вже зареєстрований і активований.";
                        } else {
                            // Перереєстрація (оновимо дані + новий код)
                            $upd_sql = "UPDATE users
                                        SET full_name = ?, password = ?, role = 'student',
                                            group_id = ?, activation_code = ?, active = 0
                                        WHERE id = ?";
                            if ($ustmt = $conn->prepare($upd_sql)) {
                                $ustmt->bind_param("ssisi", $full_name, $password_hash, $group_id, $activation_code, $uid);
                                if (!$ustmt->execute()) {
                                    $error = "Помилка оновлення користувача: " . $conn->error;
                                }
                                $ustmt->close();
                            } else {
                                $error = "Помилка підготовки запиту (update): " . $conn->error;
                            }
                        }
                    } else {
                        // Новий користувач
                        $ins_sql = "INSERT INTO users (full_name, email, password, role, group_id, activation_code, active)
                                    VALUES (?, ?, ?, 'student', ?, ?, ?)";
                        if ($istmt = $conn->prepare($ins_sql)) {
                            $istmt->bind_param("sssisi", $full_name, $email, $password_hash, $group_id, $activation_code, $now_active);
                            if (!$istmt->execute()) {
                                $error = "Помилка при реєстрації: " . $conn->error;
                            }
                            $istmt->close();
                        } else {
                            $error = "Помилка підготовки запиту (insert): " . $conn->error;
                        }
                    }
                    $cstmt->close();
                } else {
                    $error = "Помилка підготовки запиту (select user): " . $conn->error;
                }

                // Надсилаємо лист, якщо помилок немає
                if (!$error) {
                    $mail = new PHPMailer(true);
                    try {
                        $mail->SMTPDebug  = 0;
                        $mail->isSMTP();
                        $mail->Host       = $config['host'];
                        $mail->SMTPAuth   = true;
                        $mail->Username   = $config['username'];
                        $mail->Password   = $config['password'];
                        $mail->SMTPSecure = $config['encryption'];
                        $mail->Port       = $config['port'];
                        $mail->CharSet    = 'UTF-8';

                        $mail->setFrom($config['username'], $config['from_name'] ?? 'Електронний журнал');
                        $mail->addAddress($email, $full_name);

                        $mail->Subject = "Активація аккаунта на Електронному журналі КПКІТП";

                        $activation_url = site_url("/activate.php?code=" . urlencode($activation_code));

                        $mail->isHTML(true);
                        $body_html = sprintf(
                            "Привіт, %s!<br><br>
                            Ви зареєструвалися в електронному журналі КПКІТП.<br>
                            Активуйте свій обліковий запис, перейшовши за посиланням:<br>
                            <a href='%s'>Активувати аккаунт</a><br><br>
                            Якщо ви не реєструвалися — проігноруйте це повідомлення.",
                            h($full_name),
                            h($activation_url)
                        );
                        $mail->Body    = $body_html;
                        $mail->AltBody = "Привіт, {$full_name}!\n\n"
                            ."Ви зареєструвалися в електронному журналі КПКІТП.\n"
                            ."Активуйте свій обліковий запис за посиланням:\n{$activation_url}\n\n"
                            ."Якщо ви не реєструвалися — проігноруйте цей лист.";

                        $mail->send();
                        $success = "Реєстрація успішна! Перевірте email для активації облікового запису.";
                    } catch (Exception $e) {
                        $error = "Реєстрація успішна, але виникла помилка при відправці листа: {$mail->ErrorInfo}";
                        error_log("Mail error to {$email}: {$mail->ErrorInfo}");
                    }
                }
            }
        }
    }
}

/* Заголовок для хедера */
$header_title = 'Реєстрація (студент)';
?>
<!DOCTYPE html>
<html lang="uk">
<head>
    <meta charset="UTF-8">
    <meta name="robots" content="noindex, nofollow">
    <title>Реєстрація учня</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <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;
          --bg:#f6f7fb;
          --card:#ffffff;
          --shadow: 0 10px 24px rgba(0,0,0,.08);
          --focus: rgba(67,39,85,.25);

          --danger:#b91c1c;
          --ok:#16a34a;
        }

        html,body{margin:0;padding:0;background:var(--bg);color:var(--ink);font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif}
        *{box-sizing:border-box}

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

        h1{
          color: var(--brand-purple);
          text-align:center;
          margin: 6px 0 12px;
          font-size: clamp(20px, 4vw, 26px);
          font-weight: 900;
          letter-spacing:.2px;
        }

        .form-group{margin-bottom:12px}
        .form-group label{display:block;margin-bottom:6px;font-weight:900;color:var(--brand-purple);font-size:14px}
        .form-group input, .form-group select{
          width:100%;
          padding:12px;
          border:1px solid rgba(0,0,0,.14);
          border-radius:12px;
          box-sizing:border-box;
          font-size:16px;
          outline:none;
          transition: border-color .15s ease, box-shadow .15s ease;
          background:#fff;
          color: var(--ink);
        }
        .form-group input:focus, .form-group select:focus{
          border-color: rgba(67,39,85,.35);
          box-shadow: 0 0 0 4px var(--focus);
        }

        button{
          background: var(--brand-purple);
          color: white;
          padding: 12px 16px;
          border: none;
          border-radius: 12px;
          cursor: pointer;
          width: 100%;
          font-weight: 900;
          font-size: 16px;
          box-shadow: 0 10px 18px rgba(67,39,85,.16);
          transition: background .15s ease, transform .05s ease, box-shadow .15s ease;
        }
        button:hover{
          background: var(--brand-purple-2);
          box-shadow: 0 12px 22px rgba(67,39,85,.20);
        }
        button:active{transform: translateY(1px);}

        .error{
          color: var(--danger);
          margin: 10px 0;
          font-weight: 900;
          background: rgba(185,28,28,.08);
          border: 1px solid rgba(185,28,28,.20);
          padding: 10px 12px;
          border-radius: 14px;
        }
        .success{
          color: var(--brand-purple);
          margin: 10px 0;
          font-weight: 900;
          background: rgba(163,232,211,.22);
          border: 1px solid rgba(67,39,85,.14);
          padding: 10px 12px;
          border-radius: 14px;
        }
        .muted{
          color:var(--muted);
          font-size:13px;
          margin-top:10px;
          text-align:center;
          font-weight:700;
        }
        .muted a{
          color: var(--brand-purple);
          font-weight: 900;
          text-decoration: underline;
        }
        .muted a:hover{ color: var(--brand-purple-2); }

        @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="Реєстрація учня">
    <h1>Реєстрація учня</h1>

    <?php if ($error): ?>
      <p class="error"><?= h($error) ?></p>
    <?php endif; ?>
    <?php if ($success): ?>
      <p class="success"><?= h($success) ?></p>
      <p class="muted">Після активації ви зможете увійти у свій акаунт.</p>
    <?php endif; ?>

    <form method="POST" action="">
      <div class="form-group">
        <label for="student_full_name">ПІБ</label>
        <input type="text" name="full_name" id="student_full_name" maxlength="255" required
               value="<?= h($_POST['full_name'] ?? '') ?>">
      </div>

      <div class="form-group">
        <label for="student_email">Email</label>
        <input type="email" name="email" id="student_email" required
               value="<?= h($_POST['email'] ?? '') ?>">
      </div>

      <div class="form-group">
        <label for="student_password">Пароль</label>
        <input type="password" name="password" id="student_password" minlength="6" required>
      </div>

      <div class="form-group">
        <label for="student_group">Група</label>
        <select name="group_id" id="student_group" required>
          <option value="">— Оберіть групу —</option>
          <?php
            $groups_result = $conn->query("SELECT id, group_name FROM `groups` ORDER BY group_name ASC");
            $selected = (int)($_POST['group_id'] ?? 0);
            if ($groups_result) {
                while ($group = $groups_result->fetch_assoc()) {
                    $gid  = (int)$group['id'];
                    $name = h($group['group_name'] ?? '');
                    $sel  = ($selected === $gid) ? 'selected' : '';
                    echo "<option value='{$gid}' {$sel}>{$name}</option>";
                }
            }
          ?>
        </select>
      </div>

      <input type="hidden" name="csrf_token" value="<?= h($csrf) ?>">
      <button type="submit">Зареєструватися</button>
    </form>

    <p class="muted"><a href="index.php">Повернутися на головну</a></p>
  </section>
</main>

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

</body>
</html>
