<?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 (простий ліміт POST на IP/хв) ===== */
$ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
$_SESSION['reg_teacher_throttle'] = $_SESSION['reg_teacher_throttle'] ?? [];
$_SESSION['reg_teacher_throttle'][$ip] = array_values(array_filter(
    $_SESSION['reg_teacher_throttle'][$ip] ?? [],
    fn($ts) => (time() - $ts) < 60
));
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $_SESSION['reg_teacher_throttle'][$ip][] = time();
}
$tooMany = count($_SESSION['reg_teacher_throttle'][$ip] ?? []) > 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';
    // $path має починатися зі слеша
    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') {
    // CSRF
    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'] ?? '');
        $passwordRaw = (string)($_POST['password'] ?? '');
        $secret_word = trim($_POST['secret_word'] ?? '');

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

            // Отримуємо секретне слово
            $secret_sql = "SELECT setting_value FROM `settings` WHERE setting_name = 'teacher_secret_word' LIMIT 1";
            $correct_secret = null;
            if ($sres = $conn->query($secret_sql)) {
                if ($row = $sres->fetch_assoc()) {
                    $correct_secret = (string)$row['setting_value'];
                }
            } else {
                $error = "Помилка доступу до налаштувань.";
            }

            if (!$error) {
                if ($correct_secret === null || $correct_secret === '') {
                    $error = "Секретне слово не налаштоване. Зверніться до адміністратора.";
                } elseif (!hash_equals($correct_secret, $secret_word)) {
                    // hash_equals — безпечніше порівняння
                    $error = "Неправильне секретне слово!";
                }
            }

            if (!$error) {
                // Чи є такий користувач?
                $check_sql = "SELECT id, active FROM users WHERE email = ? LIMIT 1";
                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($passwordRaw, PASSWORD_DEFAULT);

                    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 = 'teacher',
                                            activation_code = ?, active = 0
                                        WHERE id = ?";
                            if ($ustmt = $conn->prepare($upd_sql)) {
                                $ustmt->bind_param('sssi', $full_name, $password_hash, $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, activation_code, active)
                                    VALUES (?, ?, ?, 'teacher', ?, 0)";
                        if ($istmt = $conn->prepare($ins_sql)) {
                            $istmt->bind_param('ssss', $full_name, $email, $password_hash, $activation_code);
                            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);
                        if (!empty($config['reply_to'])) {
                            $mail->addReplyTo($config['reply_to']);
                        }

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

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

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

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

/* Заголовок для хедера */
$header_title = 'Реєстрація (викладач)';
?>
<!DOCTYPE html>
<html lang="uk">
<head>
    <meta charset="UTF-8">
    <meta name="robots" content="noindex, nofollow">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <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;
          --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{
          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{
          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="teacher_full_name">ПІБ</label>
        <input type="text" name="full_name" id="teacher_full_name" maxlength="255" required
               value="<?= h($_POST['full_name'] ?? '') ?>">
      </div>

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

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

      <div class="form-group">
        <label for="secret_word">Секретне слово</label>
        <input type="text" name="secret_word" id="secret_word" required
               value="<?= h($_POST['secret_word'] ?? '') ?>">
      </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>
