<?php
session_start();

header('Content-Type: application/json; charset=utf-8');

function respond($success, $message, $redirect = null, $httpCode = 200)
{
    http_response_code($httpCode);

    $payload = array(
        'success' => (bool)$success,
        'message' => (string)$message,
    );

    if ($redirect !== null) {
        $payload['redirect'] = $redirect;
    }

    echo json_encode($payload, JSON_UNESCAPED_UNICODE);
    exit;
}

if (!isset($_SERVER['REQUEST_METHOD']) || $_SERVER['REQUEST_METHOD'] !== 'POST') {
    respond(false, 'Phương thức không được hỗ trợ.', null, 405);
}

$csrfToken = isset($_POST['csrf_token']) ? (string)$_POST['csrf_token'] : '';
$sessionToken = isset($_SESSION['csrf_token']) ? (string)$_SESSION['csrf_token'] : '';

if ($csrfToken === '' || $sessionToken === '' || !hash_equals($sessionToken, $csrfToken)) {
    respond(false, 'Yêu cầu không hợp lệ. Vui lòng tải lại trang.', null, 403);
}

$fullName = trim(isset($_POST['full_name']) ? (string)$_POST['full_name'] : '');
$phone = trim(isset($_POST['phone']) ? (string)$_POST['phone'] : '');
$email = trim(isset($_POST['email']) ? (string)$_POST['email'] : '');
$password = isset($_POST['password']) ? (string)$_POST['password'] : '';
$passwordConfirm = isset($_POST['password_confirm']) ? (string)$_POST['password_confirm'] : '';

if ($fullName === '') {
    respond(false, 'Vui lòng nhập họ và tên.');
}

if ($phone === '' && $email === '') {
    respond(false, 'Vui lòng nhập số điện thoại hoặc Gmail.');
}

if ($phone !== '' && !preg_match('/^0\d{9}$/', $phone)) {
    respond(false, 'Số điện thoại không hợp lệ. Vui lòng nhập 10 chữ số bắt đầu bằng 0.');
}

if ($email !== '' && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
    respond(false, 'Gmail không hợp lệ.');
}

if (strlen($password) < 8) {
    respond(false, 'Mật khẩu phải có ít nhất 8 ký tự.');
}

if ($password !== $passwordConfirm) {
    respond(false, 'Xác nhận mật khẩu không khớp.');
}

require_once __DIR__ . '/../config/database.php';

try {
    $pdo = getDbConnection();

    if ($phone !== '') {
        $stmt = $pdo->prepare('SELECT id FROM students WHERE phone = :phone LIMIT 1');
        $stmt->execute(array(':phone' => $phone));
        if ($stmt->fetchColumn()) {
            respond(false, 'Số điện thoại này đã được đăng ký.');
        }
    }

    if ($email !== '') {
        $stmt = $pdo->prepare('SELECT id FROM students WHERE email = :email LIMIT 1');
        $stmt->execute(array(':email' => $email));
        if ($stmt->fetchColumn()) {
            respond(false, 'Gmail này đã được đăng ký.');
        }
    }

    $passwordHash = password_hash($password, PASSWORD_DEFAULT);

    $stmt = $pdo->prepare(
        "INSERT INTO students (
            full_name,
            phone,
            email,
            password_hash,
            status,
            created_at,
            updated_at
        ) VALUES (
            :full_name,
            :phone,
            :email,
            :password_hash,
            'active',
            NOW(),
            NOW()
        )"
    );

    $stmt->execute(array(
        ':full_name' => $fullName,
        ':phone' => ($phone !== '' ? $phone : null),
        ':email' => ($email !== '' ? $email : null),
        ':password_hash' => $passwordHash,
    ));

    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));

    respond(
        true,
        'Đăng ký thành công.',
        '/EnglishSpeak/student/student-login.php?registered=1',
        200
    );
} catch (Throwable $e) {
    error_log('Student registration error: ' . $e->getMessage());
    respond(false, 'Lỗi máy chủ. Vui lòng thử lại sau.', null, 500);
}
