<?php
// register_parent.php — реєстрація батьків (активація через /activate.php?code=...), підтримка кількох дітей
declare(strict_types=1);

/* Сесія та secure-cookie */
$secure = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off');
session_set_cookie_params([
    'lifetime' => 0, 'path' => '/', 'domain' => '',
    'secure' => $secure, 'httponly' => true, 'samesite' => 'Lax',
]);
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;

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

/* Якщо вже увійшов — на головну */
if (!empty($_SESSION['user_id'])) { header('Location: /index.php'); exit; }

/* Дані для селектів: групи та учні по групах */
$groups = [];
$studentsByGroup = [];
if ($res = $conn->query("SELECT id, group_name FROM `groups` ORDER BY group_name ASC")) {
    while ($r = $res->fetch_assoc()) { $groups[] = ['id'=>(int)$r['id'],'group_name'=>$r['group_name']]; $studentsByGroup[(int)$r['id']] = []; }
}
if ($res = $conn->query("SELECT id, full_name, group_id FROM users WHERE role='student' ORDER BY full_name ASC")) {
    while ($r = $res->fetch_assoc()) {
        $gid = (int)$r['group_id'];
        if (!isset($studentsByGroup[$gid])) $studentsByGroup[$gid] = [];
        $studentsByGroup[$gid][] = ['id'=>(int)$r['id'], 'full_name'=>$r['full_name']];
    }
}

/* Стан форми */
$csrf  = csrf_token();
$error = '';
$success = '';
$info_after_success = '';

/* Обробка форми */
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['register_parent'])) {
    if (!hash_equals($_SESSION['csrf_token'] ?? '', (string)($_POST['csrf_token'] ?? ''))) {
        $error = 'Помилка безпеки. Оновіть сторінку і спробуйте ще раз.';
    } else {
        $full_name = trim((string)($_POST['full_name'] ?? ''));
        $email     = strtolower(trim((string)($_POST['email'] ?? '')));
        $password  = (string)($_POST['password'] ?? '');
        $password2 = (string)($_POST['password2'] ?? '');
        $children  = $_POST['children'] ?? [];
        if (!is_array($children)) $children = [];

        if ($full_name === '' || !filter_var($email, FILTER_VALIDATE_EMAIL) || $password === '' || $password2 === '') {
            $error = 'Заповніть усі обов’язкові поля коректно.';
        } elseif ($password !== $password2) {
            $error = 'Паролі не співпадають.';
        } elseif (mb_strlen($password) < 6) {
            $error = 'Пароль має містити щонайменше 6 символів.';
        }

        $normalized = [];
        if (!$error) {
            foreach ($children as $row) {
                $gid = isset($row['group_id']) ? (int)$row['group_id'] : 0;
                $sid = isset($row['student_id']) ? (int)$row['student_id'] : 0;
                if ($gid > 0 && $sid > 0) $normalized[] = ['group_id'=>$gid,'student_id'=>$sid];
            }
            if (!$normalized) $error = 'Додайте щонайменше одну дитину.';
        }

        if (!$error) {
            // Унікальний email
            $q = "SELECT id FROM users WHERE email=? LIMIT 1";
            if ($st = $conn->prepare($q)) {
                $st->bind_param('s', $email);
                $st->execute(); $st->store_result();
                if ($st->num_rows > 0) $error = 'Користувач з таким email вже існує.';
                $st->close();
            } else { $error = 'Тимчасова помилка. Спробуйте пізніше.'; }
        }

        // Верифікуємо кожну дитину: існує, role=student, належить тій групі
        if (!$error) {
            $seen = [];
            foreach ($normalized as $row) {
                $gid = $row['group_id']; $sid = $row['student_id'];
                if (isset($seen[$sid])) { $error = 'Одна й та сама дитина вибрана двічі.'; break; }
                $seen[$sid] = true;

                $q = "SELECT id, role, group_id FROM users WHERE id=? LIMIT 1";
                if ($st = $conn->prepare($q)) {
                    $st->bind_param('i', $sid);
                    $st->execute();
                    $res = $st->get_result();
                    $stu = $res->fetch_assoc() ?: null;
                    $st->close();
                    if (!$stu || $stu['role'] !== 'student' || (int)$stu['group_id'] !== $gid) {
                        $error = 'Перевірте вибір групи та учня — вони не збігаються.';
                        break;
                    }
                } else { $error = 'Тимчасова помилка. Спробуйте пізніше.'; break; }
            }
        }

        if (!$error) {
            $hash   = password_hash($password, PASSWORD_DEFAULT);
            $code32 = make_activation_code();

            $conn->begin_transaction();
            try {
                // Створюємо користувача parent (inactive)
                $ins = "INSERT INTO users (full_name, email, password, role, active, activation_code) VALUES (?, ?, ?, 'parent', 0, ?)";
                if (!($st = $conn->prepare($ins))) throw new RuntimeException('REG_PREPARE');
                $st->bind_param('ssss', $full_name, $email, $hash, $code32);
                if (!$st->execute()) throw new RuntimeException('REG_EXEC');
                $parent_id = (int)$st->insert_id;
                $st->close();

                // Прив’язки батько ↔ учень
                $pl = "INSERT IGNORE INTO parent_links (parent_id, student_id) VALUES (?, ?)";
                if (!($st2 = $conn->prepare($pl))) throw new RuntimeException('LINK_PREPARE');
                foreach ($normalized as $row) {
                    $sid = $row['student_id'];
                    $st2->bind_param('ii', $parent_id, $sid);
                    if (!$st2->execute()) throw new RuntimeException('LINK_EXEC');
                }
                $st2->close();

                $conn->commit();

                // Лист активації (PHPMailer + твій config_mail.php)
                $mail = new PHPMailer(true);
                try {
                    $mail->isSMTP();
                    $mail->Host       = $config['host'];
                    $mail->SMTPAuth   = true;
                    $mail->Username   = $config['username'];
                    $mail->Password   = $config['password'];

                    // PHPMailer очікує 'tls'/'ssl' або константи — залишаємо як у тебе, але якщо в конфізі 'tls'/'ssl' це теж ок
                    $mail->SMTPSecure = $config['encryption'];
                    $mail->Port       = (int)$config['port'];
                    $mail->CharSet    = 'UTF-8';

                    // From: як у твоїх робочих файлах — з username; Reply-To: на домен сайту
                    $mail->setFrom($config['username'], $config['from_name'] ?? 'Електронний журнал');
                    if (!empty($config['from_email']) && $config['from_email'] !== $config['username']) {
                        $mail->addReplyTo($config['from_email'], $config['from_name'] ?? 'Електронний журнал');
                    }

                    $mail->addAddress($email, $full_name);
                    $mail->Subject = "Активація аккаунта — Електронний журнал";

                    $activation_url = site_url("/activate.php?code=" . urlencode($code32));
                    $mail->isHTML(true);
                    $mail->Body = sprintf(
                        "Привіт, %s!<br><br>
                        Для завершення реєстрації перейдіть за посиланням:<br>
                        <a href='%s'>Активувати аккаунт</a><br><br>
                        Якщо ви не реєструвалися — проігноруйте цей лист.",
                        h($full_name), h($activation_url)
                    );
                    $mail->AltBody = "Привіт, {$full_name}!\n\nЗавершіть реєстрацію за посиланням:\n{$activation_url}\n";

                    $sent = $mail->send();
                } catch (Exception $e) {
                    $sent = false;
                    error_log('PHPMailer error (parent): ' . $mail->ErrorInfo);
                }

                $success = 'Реєстрацію виконано!';
                $info_after_success = $sent
                    ? 'Ми надіслали лист з посиланням для активації. Перевірте пошту (включно зі «Спам»). Після активації зможете увійти.'
                    : 'Не вдалося відправити лист зараз. Ви можете <a href="/resend_activation.php?email=' . rawurlencode($email) . '">надіслати ще раз</a> або звернутися до адміністратора.';

            } catch (Throwable $e) {
                @$conn->rollback();
                $error = 'Не вдалося завершити реєстрацію. Спробуйте пізніше або зверніться до адміністратора.';
                error_log('register_parent fail: ' . $e->getMessage());
            }
        }
    }
}

/* Заголовок для хедера */
$header_title = 'Реєстрація (батьки)';
?>
<!doctype html>
<html lang="uk">
<head>
  <meta charset="utf-8">
  <title>Реєстрація для батьків</title>
  <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,viewport-fit=cover">
  <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;
    }

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

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

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

    .note{
      text-align:center;
      margin: 0 0 12px 0;
      color: var(--muted);
      font-weight: 700;
      font-size: 14px;
    }

    .row{display:grid;grid-template-columns:1fr;gap:12px}
    .g2{grid-template-columns:1fr 1fr}

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

    .actions{display:flex;gap:10px;flex-wrap:wrap;align-items:center;justify-content:flex-start}

    .btn{
      display:inline-flex;
      align-items:center;
      justify-content:center;
      padding:12px 16px;
      border:none;
      border-radius:12px;
      background: var(--brand-purple);
      color:#fff;
      font-weight:900;
      cursor:pointer;
      box-shadow: 0 10px 18px rgba(67,39,85,.16);
      transition: background .15s ease, transform .05s ease, box-shadow .15s ease;
      line-height:1;
      user-select:none;
    }
    .btn:hover{background: var(--brand-purple-2); box-shadow: 0 12px 22px rgba(67,39,85,.20); }
    .btn:active{transform:translateY(1px);}

    .btn-ghost{
      background: rgba(163,232,211,.40);
      color: var(--brand-purple);
      border: 1px solid rgba(67,39,85,.14);
      box-shadow: 0 10px 18px rgba(0,0,0,.10);
    }
    .btn-ghost:hover{
      background: rgba(163,232,211,.55);
      box-shadow: 0 12px 22px rgba(0,0,0,.12);
    }

    .btn-danger{
      background: rgba(185,28,28,.10);
      color: #b91c1c;
      border: 1px solid rgba(185,28,28,.20);
      box-shadow:none;
    }
    .btn-danger:hover{background: rgba(185,28,28,.14);}
    .btn-danger:active{transform:translateY(1px);}

    .muted{color:var(--muted);font-size:14px;font-weight:700}

    .error{
      color: var(--danger);
      font-weight: 900;
      margin-bottom: 10px;
      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);
      font-weight: 900;
      margin-bottom: 10px;
      background: rgba(163,232,211,.22);
      border: 1px solid rgba(67,39,85,.14);
      padding: 10px 12px;
      border-radius: 14px;
    }

    .kid{
      border: 1px dashed rgba(67,39,85,.20);
      border-radius: 14px;
      padding: 12px;
      background:
        radial-gradient(520px 220px at 10% 0%, rgba(163,232,211,.35), rgba(255,255,255,0) 65%),
        rgba(250,250,250,.9);
    }
    .kid + .kid{margin-top:10px}

    .kid-head{
      display:flex;
      align-items:center;
      justify-content:space-between;
      gap:10px;
      margin-bottom: 10px;
      flex-wrap:wrap;
    }
    .kid-title{
      font-weight: 900;
      color: var(--brand-purple);
      letter-spacing:.2px;
    }

    .after-success p a{color: var(--brand-purple-2); font-weight: 900; text-decoration: underline;}

    @media(min-width:720px){ .row.g2{grid-template-columns:1fr 1fr} }
    @media(max-width:600px){
      .rp-wrap{padding:12px}
      .rp-card{padding:16px;border-radius:14px}
      .actions{justify-content:stretch}
      .btn{width:100%}
      .kid-head{align-items:flex-start}
    }
  </style>
</head>
<body>

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

  <main class="rp-wrap">
    <section class="rp-card" aria-label="Реєстрація для батьків">
      <h1>Реєстрація для батьків</h1>
      <p class="note">Додайте одну або кілька дітей, після чого підтвердіть реєстрацію через лист на пошті.</p>

      <?php if ($error): ?><div class="error"><?=h($error)?></div><?php endif; ?>
      <?php if ($success): ?>
        <div class="success"><?=h($success)?></div>
        <div class="after-success"><p><?= $info_after_success ?></p></div>
      <?php endif; ?>

      <?php if (!$success): ?>
      <form method="post" action="" autocomplete="on" novalidate>
        <input type="hidden" name="csrf_token" value="<?=h($csrf)?>">

        <!-- Дані батька -->
        <div class="row">
          <div class="row g2">
            <div>
              <label for="full_name">ПІБ батька/матері</label>
              <input type="text" id="full_name" name="full_name" required>
            </div>
            <div>
              <label for="email">Email (логін)</label>
              <input type="email" id="email" name="email" inputmode="email" autocomplete="username" required>
            </div>
          </div>

          <div class="row g2">
            <div>
              <label for="password">Пароль</label>
              <input type="password" id="password" name="password" autocomplete="new-password" required>
            </div>
            <div>
              <label for="password2">Пароль ще раз</label>
              <input type="password" id="password2" name="password2" autocomplete="new-password" required>
            </div>
          </div>
        </div>

        <!-- Діти -->
        <div id="kids-list" style="margin-top:14px;"></div>

        <div class="actions" style="margin-top:12px">
          <button type="button" class="btn btn-ghost" id="btn-add-kid">+ В мене є ще одна дитина</button>
        </div>

        <div style="margin-top:14px">
          <button type="submit" class="btn" name="register_parent">Зареєструватися</button>
          <div class="muted" style="margin-top:8px">Після відправки ми надішлемо лист з активацією на вказану електронну адресу.</div>
        </div>
      </form>
      <?php endif; ?>
    </section>
  </main>

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

  <script>
    const GROUPS = <?= json_encode($groups, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?>;
    const STUDENTS_BY_GROUP = <?= json_encode($studentsByGroup, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?>;

    const kidsList = document.getElementById('kids-list');
    const btnAddKid = document.getElementById('btn-add-kid');
    let kidIndex = 0;

    function escapeHtml(s){return (''+s).replace(/[&<>"']/g,m=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[m]));}
    function fillStudents(selectEl, groupId){
      while(selectEl.firstChild) selectEl.removeChild(selectEl.firstChild);
      if(!groupId || !STUDENTS_BY_GROUP[groupId] || STUDENTS_BY_GROUP[groupId].length===0){
        selectEl.disabled = true;
        const opt = document.createElement('option'); opt.value=''; opt.textContent='Немає учнів у цій групі';
        selectEl.appendChild(opt); return;
      }
      selectEl.disabled = false;
      const first = document.createElement('option'); first.value=''; first.textContent='— оберіть учня —'; selectEl.appendChild(first);
      STUDENTS_BY_GROUP[groupId].forEach(s=>{
        const opt = document.createElement('option'); opt.value=s.id; opt.textContent=s.full_name; selectEl.appendChild(opt);
      });
    }
    function createKidRow(idx){
      const wrap = document.createElement('div'); wrap.className='kid'; wrap.dataset.index=idx;
      wrap.innerHTML = `
        <div class="kid-head">
          <div class="kid-title">Дитина #${idx+1}</div>
          <button type="button" class="btn btn-danger btn-remove" aria-label="Видалити">Видалити</button>
        </div>
        <div class="row g2">
          <div>
            <label for="group_${idx}">Група</label>
            <select id="group_${idx}" name="children[${idx}][group_id]" required>
              <option value="">— оберіть групу —</option>
              ${GROUPS.map(g=>`<option value="${g.id}">${escapeHtml(g.group_name)}</option>`).join('')}
            </select>
          </div>
          <div>
            <label for="student_${idx}">Учень</label>
            <select id="student_${idx}" name="children[${idx}][student_id]" required disabled>
              <option value="">Спочатку оберіть групу</option>
            </select>
          </div>
        </div>`;
      const selGroup = wrap.querySelector(`#group_${idx}`);
      const selStudent = wrap.querySelector(`#student_${idx}`);
      wrap.querySelector('.btn-remove').addEventListener('click',()=>{
        if(document.querySelectorAll('.kid').length>1){ wrap.remove(); renumberKids(); }
      });
      selGroup.addEventListener('change',()=>{ fillStudents(selStudent, parseInt(selGroup.value||'0',10)); });
      return wrap;
    }
    function renumberKids(){
      const items = Array.from(document.querySelectorAll('.kid'));
      items.forEach((wrap,i)=>{
        wrap.dataset.index=i;
        wrap.querySelector('.kid-title').textContent='Дитина #'+(i+1);
        const selGroup = wrap.querySelector('select[name^="children["][name$="[group_id]"]');
        const selStudent = wrap.querySelector('select[name^="children["][name$="[student_id]"]');
        wrap.querySelector(`label[for^="group_"]`).setAttribute('for',`group_${i}`);
        wrap.querySelector(`label[for^="student_"]`).setAttribute('for',`student_${i}`);
        selGroup.name=`children[${i}][group_id]`; selGroup.id=`group_${i}`;
        selStudent.name=`children[${i}][student_id]`; selStudent.id=`student_${i}`;
      });
      kidIndex = items.length;
    }
    function addKidRow(){ kidsList.appendChild(createKidRow(kidIndex++)); }
    addKidRow(); btnAddKid.addEventListener('click', addKidRow);
  </script>
</body>
</html>
