<?php
session_start();

require_once __DIR__ . '/includes/install_bootstrap.php';
if (!rozklad_auth_allowed()) {
    rozklad_require_mail_setup('Пошта ще не налаштована. Без цього реєстрація та активація акаунтів недоступні.');
}

require_once __DIR__ . '/includes/db_config.php';
require_once __DIR__ . '/includes/PHPMailer/src/PHPMailer.php';
require_once __DIR__ . '/includes/PHPMailer/src/Exception.php';
require_once __DIR__ . '/includes/PHPMailer/src/SMTP.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

if (isset($_SESSION['user_id'])) {
    header('Location: ./index.php');
    exit;
}

$config_mail = include __DIR__ . '/includes/config_mail.php';

$message = '';
$errors  = [];

function current_base_url(): string {
    $is_https = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
                || (isset($_SERVER['SERVER_PORT']) && (int)$_SERVER['SERVER_PORT'] === 443);
    $scheme = $is_https ? 'https' : 'http';
    $host   = $_SERVER['HTTP_HOST'] ?? 'localhost';
    return $scheme . '://' . $host;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username  = trim((string)($_POST['username']  ?? ''));
    $password  = trim((string)($_POST['password']  ?? ''));
    $email     = trim((string)($_POST['email']     ?? ''));
    $full_name = trim((string)($_POST['full_name'] ?? ''));

    if ($username === '')  { $errors[] = 'Поле "Логін" обов’язкове.'; }
    if ($password === '')  { $errors[] = 'Поле "Пароль" обов’язкове.'; }
    if ($email === '')     { $errors[] = 'Поле "Імейл" обов’язкове.'; }
    if ($full_name === '') { $errors[] = 'Поле "ПІБ" обов’язкове.'; }

    if ($email && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors[] = 'Вкажіть коректний Email.';
    }
    if (mb_strlen($username) > 50)   $errors[] = 'Логін занадто довгий (макс. 50).';
    if (mb_strlen($email) > 100)     $errors[] = 'Email занадто довгий (макс. 100).';
    if (mb_strlen($full_name) > 100) $errors[] = 'ПІБ занадто довгий (макс. 100).';

    if (!$errors) {
        $sql  = 'SELECT id, username, email FROM users WHERE username = ? OR email = ? LIMIT 1';
        $stmt = $conn->prepare($sql);
        if ($stmt) {
            $stmt->bind_param('ss', $username, $email);
            $stmt->execute();
            $res = $stmt->get_result();
            if ($res && $res->num_rows > 0) {
                $row = $res->fetch_assoc();
                if (strcasecmp((string)$row['username'], $username) === 0) $errors[] = 'Такий логін уже зайнятий.';
                if (strcasecmp((string)$row['email'], $email) === 0)       $errors[] = 'Цей Email уже використовується.';
            }
            $stmt->close();
        } else {
            $errors[] = 'Помилка запиту (перевірка унікальності).';
        }
    }

    if (!$errors) {
        $password_hash      = password_hash($password, PASSWORD_BCRYPT);
        $verification_token = bin2hex(random_bytes(32));
        $is_verified        = 0;
        $role               = 'user';

        $sql = 'INSERT INTO users (username, password, full_name, email, role, is_verified, verification_token, is_active, created_at)
                VALUES (?, ?, ?, ?, ?, ?, ?, 0, NOW())';
        $stmt = $conn->prepare($sql);
        if ($stmt) {
            $stmt->bind_param('sssssis', $username, $password_hash, $full_name, $email, $role, $is_verified, $verification_token);
            if ($stmt->execute()) {
                $verify_link = current_base_url() . '/verify.php?token=' . urlencode($verification_token);

                $mail = new PHPMailer(true);
                try {
                    $mail->isSMTP();
                    $mail->Host       = $config_mail['host'];
                    $mail->SMTPAuth   = true;
                    $mail->Username   = $config_mail['username'];
                    $mail->Password   = $config_mail['password'];

                    if (($config_mail['encryption'] ?? '') === 'ssl') {
                        $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
                        $mail->Port       = $config_mail['port'] ?? 465;
                    } else {
                        $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
                        $mail->Port       = $config_mail['port'] ?? 587;
                    }

                    $mail->CharSet = 'UTF-8';
                    $mail->setFrom($config_mail['from_email'], $config_mail['from_name'] ?? 'No-Reply');
                    $mail->addAddress($email, $full_name);
                    $mail->isHTML(true);
                    $mail->Subject = 'Підтвердження реєстрації';
                    $mail->Body    = '<p>Вітаємо, ' . htmlspecialchars($full_name, ENT_QUOTES, 'UTF-8') . '!</p><p>Щоб активувати акаунт, перейдіть за посиланням:</p><p><a href="' . htmlspecialchars($verify_link, ENT_QUOTES, 'UTF-8') . '">' . htmlspecialchars($verify_link, ENT_QUOTES, 'UTF-8') . '</a></p>';
                    $mail->AltBody = "Вітаємо, {$full_name}!\nПерейдіть за посиланням: {$verify_link}\n";
                    $mail->send();
                    $message = 'Реєстрація успішна! Перевірте пошту і підтвердіть Email.';
                } catch (Exception $e) {
                    error_log('[REGISTER][MAIL] Error: ' . $mail->ErrorInfo);
                    $message = 'Реєстрація успішна, але лист підтвердження не вдалося надіслати.';
                }
            } else {
                $errors[] = 'Не вдалося створити акаунт. Спробуйте пізніше.';
            }
            $stmt->close();
        } else {
            $errors[] = 'Помилка підготовки запиту.';
        }
    }
}

$conn->close();
$siteName  = 'Розклад занять';
$pageTitle = 'Реєстрація';
$pageCss   = ['https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css', '/css/auth.css?v=3'];
include __DIR__ . '/includes/header.php';
?>
<main class="page">
  <div class="kp-container">
    <div class="auth-wrap">
      <h1 class="auth-title">Реєстрація</h1>
      <div class="auth-card">
        <?php if (!empty($errors)): ?>
          <div class="alert alert-danger" role="alert"><?php foreach ($errors as $e): ?><?= htmlspecialchars((string)$e, ENT_QUOTES, 'UTF-8'); ?><br><?php endforeach; ?></div>
        <?php endif; ?>
        <?php if (!empty($message)): ?>
          <div class="alert alert-success" role="alert"><?= htmlspecialchars((string)$message, ENT_QUOTES, 'UTF-8'); ?></div>
        <?php endif; ?>
        <form method="POST" class="auth-form" autocomplete="on">
          <div class="mb-3"><label for="username" class="form-label">Логін:</label><input type="text" class="form-control" id="username" name="username" required maxlength="50" autocomplete="username" value="<?= isset($_POST['username']) ? htmlspecialchars((string)$_POST['username'], ENT_QUOTES, 'UTF-8') : '' ?>"></div>
          <div class="mb-3"><label for="password" class="form-label">Пароль:</label><input type="password" class="form-control" id="password" name="password" required minlength="6" autocomplete="new-password"></div>
          <div class="mb-3"><label for="email" class="form-label">Імейл:</label><input type="email" class="form-control" id="email" name="email" required maxlength="100" autocomplete="email" value="<?= isset($_POST['email']) ? htmlspecialchars((string)$_POST['email'], ENT_QUOTES, 'UTF-8') : '' ?>"></div>
          <div class="mb-3"><label for="full_name" class="form-label">ПІБ:</label><input type="text" class="form-control" id="full_name" name="full_name" required maxlength="100" autocomplete="name" value="<?= isset($_POST['full_name']) ? htmlspecialchars((string)$_POST['full_name'], ENT_QUOTES, 'UTF-8') : '' ?>"></div>
          <button type="submit" class="btn btn-primary w-100">Зареєструватися</button>
          <div class="auth-links"><a href="/login.php">Вже є акаунт? Увійти</a></div>
        </form>
      </div>
    </div>
  </div>
</main>
<?php include __DIR__ . '/includes/footer.php'; ?>
</body>
</html>
