<?php
declare(strict_types=1);

session_start();
require_once __DIR__ . '/../config/database.php';

if (!empty($_SESSION['user_id']) && in_array($_SESSION['user_role'] ?? '', ['teacher', 'admin'], true)) {
    header('Location: dashboard/');
    exit;
}

if (empty($_SESSION['teacher_register_csrf'])) {
    $_SESSION['teacher_register_csrf'] = bin2hex(random_bytes(32));
}

$error = '';
$success = false;

$fullName = trim((string)($_POST['full_name'] ?? ''));
$phone = trim((string)($_POST['phone'] ?? ''));
$email = trim((string)($_POST['email'] ?? ''));
$provinceIdRaw = (int)($_POST['province_id'] ?? 0);
$provinceId = max(0, $provinceIdRaw);
$otherProvinceName = trim((string)($_POST['other_province_name'] ?? ''));
$schoolIdRaw = (int)($_POST['school_id'] ?? 0);
$schoolId = max(0, $schoolIdRaw);
$otherSchoolName = trim((string)($_POST['other_school_name'] ?? ''));
$username = strtolower(trim((string)($_POST['username'] ?? '')));
$pendingSchoolApproval = false;

$provinceOptions = [];
$schoolOptions = [];

function esNormalizeSchoolName(string $name): string
{
    $name = mb_strtolower(trim($name), 'UTF-8');
    $map = [
        'đ'=>'d','á'=>'a','à'=>'a','ả'=>'a','ã'=>'a','ạ'=>'a','ă'=>'a','ắ'=>'a','ằ'=>'a','ẳ'=>'a','ẵ'=>'a','ặ'=>'a',
        'â'=>'a','ấ'=>'a','ầ'=>'a','ẩ'=>'a','ẫ'=>'a','ậ'=>'a','é'=>'e','è'=>'e','ẻ'=>'e','ẽ'=>'e','ẹ'=>'e','ê'=>'e',
        'ế'=>'e','ề'=>'e','ể'=>'e','ễ'=>'e','ệ'=>'e','í'=>'i','ì'=>'i','ỉ'=>'i','ĩ'=>'i','ị'=>'i','ó'=>'o','ò'=>'o',
        'ỏ'=>'o','õ'=>'o','ọ'=>'o','ô'=>'o','ố'=>'o','ồ'=>'o','ổ'=>'o','ỗ'=>'o','ộ'=>'o','ơ'=>'o','ớ'=>'o','ờ'=>'o',
        'ở'=>'o','ỡ'=>'o','ợ'=>'o','ú'=>'u','ù'=>'u','ủ'=>'u','ũ'=>'u','ụ'=>'u','ư'=>'u','ứ'=>'u','ừ'=>'u','ử'=>'u',
        'ữ'=>'u','ự'=>'u','ý'=>'y','ỳ'=>'y','ỷ'=>'y','ỹ'=>'y','ỵ'=>'y'
    ];
    $name = strtr($name, $map);
    $name = preg_replace('/\b(truong|th|tieu hoc|primary school)\b/u', ' ', $name) ?? $name;
    $name = preg_replace('/[^a-z0-9]+/', ' ', $name) ?? $name;
    $name = preg_replace('/\s+/', ' ', trim($name)) ?? trim($name);
    return $name;
}


try {
    $pdo = getDbConnection();

    // Province/school catalogs are independent from student accounts.
    $provinceOptions = $pdo->query(
        "SELECT id, name
         FROM provinces
         WHERE status = 'active'
         ORDER BY name ASC"
    )->fetchAll(PDO::FETCH_ASSOC);

    $allActiveSchools = $pdo->query(
        "SELECT s.id, s.province_id, s.name
         FROM schools s
         INNER JOIN provinces p ON p.id = s.province_id
         WHERE s.status = 'active'
           AND p.status = 'active'
         ORDER BY p.name ASC, s.name ASC"
    )->fetchAll(PDO::FETCH_ASSOC);

    // Chỉ hiện tối đa 20 trường / tỉnh để danh sách gọn.
    $schoolCountByProvince = [];
    foreach ($allActiveSchools as $schoolRow) {
        $pid = (int)$schoolRow['province_id'];
        $schoolCountByProvince[$pid] = ($schoolCountByProvince[$pid] ?? 0) + 1;
        if ($schoolCountByProvince[$pid] <= 20) {
            $schoolOptions[] = $schoolRow;
        }
    }

    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $csrf = (string)($_POST['csrf_token'] ?? '');
        $password = (string)($_POST['password'] ?? '');
        $confirm = (string)($_POST['password_confirm'] ?? '');

        if ($csrf === '' || !hash_equals((string)$_SESSION['teacher_register_csrf'], $csrf)) {
            throw new RuntimeException('Phiên đăng ký không hợp lệ. Vui lòng tải lại trang.');
        }
        if ($fullName === '') {
            throw new RuntimeException('Vui lòng nhập họ và tên.');
        }
        if ($phone === '') {
            throw new RuntimeException('Vui lòng nhập số điện thoại.');
        }
        if (!preg_match('/^[0-9+\s().-]{8,20}$/', $phone)) {
            throw new RuntimeException('Số điện thoại không hợp lệ.');
        }
        if ($email !== '' && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
            throw new RuntimeException('Email không hợp lệ.');
        }
        $useOtherProvince = ($provinceIdRaw === -1);
        if (!$useOtherProvince && $provinceId <= 0) {
            throw new RuntimeException('Vui lòng chọn tỉnh.');
        }
        if ($useOtherProvince && $otherProvinceName === '') {
            throw new RuntimeException('Vui lòng nhập tên tỉnh.');
        }
        $useOtherSchool = ($schoolIdRaw === -1);
        if (!$useOtherSchool && $schoolId <= 0) {
            throw new RuntimeException('Vui lòng chọn trường.');
        }
        if ($useOtherSchool && $otherSchoolName === '') {
            throw new RuntimeException('Vui lòng nhập tên trường.');
        }
        if (!preg_match('/^[a-z0-9._]{4,30}$/', $username)) {
            throw new RuntimeException('Tên đăng nhập cần 4–30 ký tự: chữ thường, số, dấu chấm hoặc gạch dưới.');
        }
        if (strlen($password) < 8) {
            throw new RuntimeException('Mật khẩu phải có ít nhất 8 ký tự.');
        }
        if ($password !== $confirm) {
            throw new RuntimeException('Xác nhận mật khẩu không khớp.');
        }

        if (!$useOtherProvince) {
            $provinceStmt = $pdo->prepare(
                "SELECT id, name FROM provinces WHERE id = :province_id AND status = 'active' LIMIT 1"
            );
            $provinceStmt->execute(['province_id' => $provinceId]);
            $provinceRow = $provinceStmt->fetch(PDO::FETCH_ASSOC);
            if (!$provinceRow) throw new RuntimeException('Tỉnh đã chọn không còn hoạt động.');
            $provinceName = trim((string)$provinceRow['name']);
        } else {
            $provinceName = $otherProvinceName;
            $wantedProvince = mb_strtolower(trim($otherProvinceName), 'UTF-8');
            $matchedProvince = null;
            foreach ($pdo->query("SELECT id, name, status FROM provinces ORDER BY id ASC")->fetchAll(PDO::FETCH_ASSOC) as $candidateProvince) {
                if (mb_strtolower(trim((string)$candidateProvince['name']), 'UTF-8') === $wantedProvince) {
                    $matchedProvince = $candidateProvince; break;
                }
            }
            if ($matchedProvince) {
                $provinceId = (int)$matchedProvince['id'];
                $provinceName = trim((string)$matchedProvince['name']);
            } else {
                $createProvince = $pdo->prepare("INSERT INTO provinces (name, status) VALUES (:name, 'inactive')");
                $createProvince->execute(['name' => $otherProvinceName]);
                $provinceId = (int)$pdo->lastInsertId();
            }
        }

        $schoolName = '';

        if (!$useOtherSchool) {
            // Trường có sẵn.
            $schoolCheck = $pdo->prepare(
                "SELECT id, name, status
                 FROM schools
                 WHERE id = :school_id
                   AND province_id = :province_id
                   AND status = 'active'
                 LIMIT 1"
            );
            $schoolCheck->execute([
                'school_id' => $schoolId,
                'province_id' => $provinceId,
            ]);
            $scope = $schoolCheck->fetch(PDO::FETCH_ASSOC);
            if (!$scope) {
                throw new RuntimeException('Trường đã chọn không thuộc tỉnh này hoặc không còn hoạt động.');
            }

            $schoolId = (int)$scope['id'];
            $schoolName = trim((string)$scope['name']);
        } else {
            // Trường khác: tìm trường tương đương trước để tránh tạo trùng school_id.
            $wantedKey = esNormalizeSchoolName($otherSchoolName);
            if ($wantedKey === '') {
                throw new RuntimeException('Tên trường không hợp lệ.');
            }

            $sameProvinceSchools = $pdo->prepare(
                "SELECT id, name, status
                 FROM schools
                 WHERE province_id = :province_id
                 ORDER BY id ASC"
            );
            $sameProvinceSchools->execute(['province_id' => $provinceId]);

            $matchedSchool = null;
            foreach ($sameProvinceSchools->fetchAll(PDO::FETCH_ASSOC) as $candidate) {
                if (esNormalizeSchoolName((string)$candidate['name']) === $wantedKey) {
                    $matchedSchool = $candidate;
                    break;
                }
            }

            if ($matchedSchool) {
                // Ví dụ "TH An Bình" và "Tiểu học An Bình" sẽ dùng cùng school_id.
                $schoolId = (int)$matchedSchool['id'];
                $schoolName = trim((string)$matchedSchool['name']);
                $pendingSchoolApproval = ((string)$matchedSchool['status'] !== 'active');
            } else {
                // Chưa có: tạo một bản ghi chờ duyệt (inactive).
                $createSchool = $pdo->prepare(
                    "INSERT INTO schools (province_id, name, school_code, status)
                     VALUES (:province_id, :name, NULL, 'inactive')"
                );
                $createSchool->execute([
                    'province_id' => $provinceId,
                    'name' => $otherSchoolName,
                ]);
                $schoolId = (int)$pdo->lastInsertId();
                $schoolName = $otherSchoolName;
                $pendingSchoolApproval = true;
            }
        }

        $dupUsername = $pdo->prepare(
            "SELECT id
             FROM users
             WHERE username = :username
             LIMIT 1"
        );
        $dupUsername->execute(['username' => $username]);
        if ($dupUsername->fetchColumn()) {
            throw new RuntimeException('Tên đăng nhập đã được sử dụng. Vui lòng chọn tên khác.');
        }

        if ($email !== '') {
            $dupEmail = $pdo->prepare(
                "SELECT id
                 FROM users
                 WHERE email = :email
                 LIMIT 1"
            );
            $dupEmail->execute(['email' => $email]);
            if ($dupEmail->fetchColumn()) {
                throw new RuntimeException('Email đã được sử dụng cho tài khoản khác.');
            }
        }

        $pdo->beginTransaction();

        $stmt = $pdo->prepare(
            "INSERT INTO users
                (role, username, email, password_hash, full_name, status)
             VALUES
                ('teacher', :username, :email, :password_hash, :full_name, :status)"
        );
        $stmt->execute([
            'username' => $username,
            'email' => $email !== '' ? $email : null,
            'password_hash' => password_hash($password, PASSWORD_DEFAULT),
            'full_name' => $fullName,
            'status' => 'pending',
        ]);

        $userId = (int)$pdo->lastInsertId();

        $profile = $pdo->prepare(
            "INSERT INTO teacher_profiles
                (user_id, province_id, school_id, province, school_name, phone)
             VALUES
                (:user_id, :province_id, :school_id, :province, :school_name, :phone)"
        );
        $profile->execute([
            'user_id' => $userId,
            'province_id' => $provinceId,
            'school_id' => $schoolId,
            'province' => $provinceName,
            'school_name' => $schoolName,
            'phone' => $phone,
        ]);

        $pdo->commit();

        $success = true;
        $_SESSION['teacher_register_csrf'] = bin2hex(random_bytes(32));

        // Clear form fields after success.
        $fullName = $phone = $email = $username = '';
        $provinceId = 0;
        $provinceIdRaw = 0;
        $otherProvinceName = '';
        $schoolId = 0;
        $schoolIdRaw = 0;
        $otherSchoolName = '';
    }
} catch (Throwable $e) {
    if (isset($pdo) && $pdo instanceof PDO && $pdo->inTransaction()) {
        $pdo->rollBack();
    }
    error_log('Teacher register error: ' . $e->getMessage());
    $error = $e instanceof RuntimeException
        ? $e->getMessage()
        : 'Không thể đăng ký tài khoản giáo viên. Vui lòng thử lại.';
}
?>
<!DOCTYPE html>
<html lang="vi">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Đăng ký giáo viên | EnglishSpeak</title>
    <link rel="stylesheet" href="assets/css/login.css">
    <style>
        .auth-card{max-width:560px}
        .form-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
        .form-grid .full{grid-column:1/-1}
        .auth-card select{
            width:100%;min-height:46px;border:1px solid #d8e0ea;border-radius:10px;
            padding:10px 12px;background:#fff;font:inherit;color:#1f2937;
        }
        .auth-card select:focus{outline:none;border-color:#4f8df7;box-shadow:0 0 0 3px rgba(37,99,235,.10)}
        .helper{margin:6px 0 0;color:#738095;font-size:12px;line-height:1.45}
        .auth-links{margin-top:16px;text-align:center;font-size:13px;color:#69778b}
        .auth-links a{font-weight:700}
        .password-wrap{position:relative}
        .password-wrap input{padding-right:48px}
        .password-toggle{
            position:absolute;right:10px;top:50%;transform:translateY(-50%);
            border:0;background:transparent;cursor:pointer;font-size:18px;line-height:1;
            padding:6px;color:#6b7280
        }
        .password-toggle:hover{color:#374151}
        @media(max-width:640px){.form-grid{grid-template-columns:1fr}.form-grid .full{grid-column:auto}}
    </style>
</head>
<body>
<main class="auth-shell">
    <section class="auth-card" aria-labelledby="register-title">
        <a class="brand" href="login.php" aria-label="EnglishSpeak Teacher Portal">
            <span class="brand-mark">ES</span>
            <span><strong>English<span>Speak</span></strong><small>Teacher Portal</small></span>
        </a>

        <div class="auth-heading">
            <p class="eyebrow">Tạo tài khoản</p>
            <h1 id="register-title">Đăng ký giáo viên</h1>
          </div>

        <?php if ($error !== ''): ?>
            <div class="alert" role="alert"><?= htmlspecialchars($error, ENT_QUOTES, 'UTF-8') ?></div>
        <?php endif; ?>

        <?php if ($success): ?>
            <div class="alert success">
                Đăng ký thành công. Tài khoản giáo viên đang chờ Admin duyệt. Sau khi được duyệt, bạn mới có thể đăng nhập.
            </div>
        <?php endif; ?>

        <?php if (!$success): ?>
        <form method="post" novalidate>
            <input type="hidden" name="csrf_token" value="<?= htmlspecialchars((string)$_SESSION['teacher_register_csrf'], ENT_QUOTES, 'UTF-8') ?>">

            <div class="form-grid">
                <div class="full">
                    <label for="full_name">Họ và tên</label>
                    <input id="full_name" name="full_name" type="text"
                           value="<?= htmlspecialchars($fullName, ENT_QUOTES, 'UTF-8') ?>"
                           autocomplete="name" required>
                </div>

                <div>
                    <label for="phone">Số điện thoại</label>
                    <input id="phone" name="phone" type="tel"
                           value="<?= htmlspecialchars($phone, ENT_QUOTES, 'UTF-8') ?>"
                           autocomplete="tel" required>
                </div>

                <div>
                    <label for="email">Email</label>
                    <input id="email" name="email" type="email"
                           value="<?= htmlspecialchars($email, ENT_QUOTES, 'UTF-8') ?>"
                           autocomplete="email">
                </div>

                <div>
                    <label for="province_id">Tỉnh</label>
                    <select id="province_id" name="province_id" required>
                        <option value="">Chọn tỉnh</option>
                        <?php foreach ($provinceOptions as $p): ?>
                            <option value="<?= (int)$p['id'] ?>"
                                <?= $provinceId === (int)$p['id'] ? 'selected' : '' ?>>
                                <?= htmlspecialchars((string)$p['name'], ENT_QUOTES, 'UTF-8') ?>
                            </option>
                        <?php endforeach; ?>
                        <option value="-1" <?= $provinceIdRaw === -1 ? 'selected' : '' ?>>
                            ➕ Tỉnh của tôi không có trong danh sách
                        </option>
                    </select>
                </div>

                <div class="full" id="otherProvinceWrap" style="display:none;">
                    <label for="other_province_name">Tên tỉnh</label>
                    <input id="other_province_name" name="other_province_name" type="text"
                           value="<?= htmlspecialchars($otherProvinceName, ENT_QUOTES, 'UTF-8') ?>"
                           placeholder="Ví dụ: Vĩnh Long">
                    <p class="helper">Nhập theo định dạng như ví dụ để tên tỉnh được thống nhất.</p>
                </div>

                <div>
                    <label for="school_id">Trường</label>
                    <select id="school_id" name="school_id" required>
                        <option value="">Chọn trường</option>
                        <?php foreach ($schoolOptions as $school): ?>
                            <option
                                value="<?= (int)$school['id'] ?>"
                                data-province-id="<?= (int)$school['province_id'] ?>"
                                <?= $schoolId === (int)$school['id'] ? 'selected' : '' ?>
                            >
                                <?= htmlspecialchars((string)$school['name'], ENT_QUOTES, 'UTF-8') ?>
                            </option>
                        <?php endforeach; ?>
                        <option value="-1" data-province-id="*"
                            <?= $schoolIdRaw === -1 ? 'selected' : '' ?>>
                            ➕ Trường của tôi không có trong danh sách
                        </option>
                    </select>
                    <p class="helper">Chọn tỉnh trước. Danh sách chỉ hiển thị một số trường; nếu không thấy, chọn “Trường khác”.</p>
                </div>

                <div class="full" id="otherSchoolWrap" style="display:none;">
                    <label for="other_school_name">Tên trường</label>
                    <input id="other_school_name" name="other_school_name" type="text"
                           value="<?= htmlspecialchars($otherSchoolName, ENT_QUOTES, 'UTF-8') ?>"
                           placeholder="Ví dụ: TH Phước Ngãi">
                    <p class="helper">Hệ thống sẽ kiểm tra tên gần tương đương để hạn chế tạo trùng trường. Trường mới cần Admin duyệt.</p>
                </div>

                <div>
                    <label for="username">Tên đăng nhập</label>
                    <input id="username" name="username" type="text"
                           value="<?= htmlspecialchars($username, ENT_QUOTES, 'UTF-8') ?>"
                           placeholder="giaovien01" autocomplete="username" required>
                </div>

                <div>
                    <label for="password">Mật khẩu</label>
                    <div class="password-wrap">
                        <input id="password" name="password" type="password"
                               autocomplete="new-password" required>
                        <button class="password-toggle" type="button"
                                data-target="password" aria-label="Hiện mật khẩu" title="Hiện mật khẩu">👁</button>
                    </div>
                </div>

                <div class="full">
                    <label for="password_confirm">Nhập lại mật khẩu</label>
                    <div class="password-wrap">
                        <input id="password_confirm" name="password_confirm" type="password"
                               autocomplete="new-password" required>
                        <button class="password-toggle" type="button"
                                data-target="password_confirm" aria-label="Hiện mật khẩu" title="Hiện mật khẩu">👁</button>
                    </div>
                </div>
            </div>

            <button class="submit-button" type="submit">Đăng ký</button>
        <?php endif; ?>

        <?php if (!$success): ?>
        <p class="auth-links">Đã có tài khoản? <a href="login.php">Đăng nhập giáo viên</a></p>
        <?php endif; ?>
    </section>
</main>

<script>
(function () {
    const province = document.getElementById('province_id');
    const school = document.getElementById('school_id');
    const otherProvinceWrap = document.getElementById('otherProvinceWrap');
    const otherProvinceInput = document.getElementById('other_province_name');
    const otherWrap = document.getElementById('otherSchoolWrap');
    const otherInput = document.getElementById('other_school_name');

    function refreshOtherProvince() {
        const isOtherProvince = province.value === '-1';
        otherProvinceWrap.style.display = isOtherProvince ? 'block' : 'none';
        otherProvinceInput.required = isOtherProvince;
        if (!isOtherProvince) otherProvinceInput.value = '';
    }

    function refreshOtherSchool() {
        const isOther = school.value === '-1';
        otherWrap.style.display = isOther ? 'block' : 'none';
        otherInput.required = isOther;
        if (!isOther) otherInput.value = '';
    }

    function refreshSchools() {
        const selectedProvince = province.value;
        const isOtherProvince = selectedProvince === '-1';
        let selectedStillVisible = false;

        Array.from(school.options).forEach((option, index) => {
            if (index === 0) return;

            const optionProvince = option.dataset.provinceId || '';
            if (option.value === '-1') {
                option.hidden = selectedProvince === '';
            } else {
                option.hidden = selectedProvince === '' || isOtherProvince || optionProvince !== selectedProvince;
            }

            if (!option.hidden && option.selected) selectedStillVisible = true;
        });

        if (!selectedStillVisible && school.value !== '') {
            school.value = '';
        }

        if (isOtherProvince) school.value = '-1';
        refreshOtherProvince();
        refreshOtherSchool();
    }

    province.addEventListener('change', refreshSchools);
    school.addEventListener('change', refreshOtherSchool);
    refreshSchools();

    document.querySelectorAll('.password-toggle').forEach(button => {
        button.addEventListener('click', function () {
            const targetId = this.getAttribute('data-target');
            const input = document.getElementById(targetId);
            if (!input) return;

            const showing = input.type === 'text';
            input.type = showing ? 'password' : 'text';
            this.textContent = showing ? '👁' : '🙈';
            this.setAttribute('aria-label', showing ? 'Hiện mật khẩu' : 'Ẩn mật khẩu');
            this.setAttribute('title', showing ? 'Hiện mật khẩu' : 'Ẩn mật khẩu');
        });
    });
})();
</script>
</body>
</html>
