<?php
// messages.php — приватні повідомлення (учитель ↔ учень / адмін / студент)
// PHP 5.6–8.x, без strict_types

session_start();
require_once __DIR__ . '/includes/db_connect.php';

// ---------- Перевірка входу ----------
if (!isset($_SESSION['user_id'])) {
    header('Location: index.php');
    exit();
}

$current_user_id   = (int)($_SESSION['user_id'] ?? 0);
$current_user_role = $_SESSION['role'] ?? 'student';

// ---------- Проста функція екранування ----------
if (!function_exists('h')) {
    function h($s) {
        return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8');
    }
}

// ---------- CSRF-токен ----------
if (empty($_SESSION['csrf_token'])) {
    if (function_exists('random_bytes')) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(16));
    } elseif (function_exists('openssl_random_pseudo_bytes')) {
        $_SESSION['csrf_token'] = bin2hex(openssl_random_pseudo_bytes(16));
    } else {
        $_SESSION['csrf_token'] = sha1(uniqid(mt_rand(), true));
    }
}
$csrf = $_SESSION['csrf_token'];

// ---------- Пошта (PHPMailer) ----------
$config_mail = require __DIR__ . '/includes/config_mail.php';

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;

// ---------- Таблиця вкладень (на всякий створимо, якщо немає) ----------
@$conn->query("
    CREATE TABLE IF NOT EXISTS `private_message_attachments` (
      `id` INT(11) NOT NULL AUTO_INCREMENT,
      `message_id` INT(11) NOT NULL,
      `file_path` VARCHAR(255) NOT NULL,
      `original_name` VARCHAR(255) NOT NULL,
      `file_size` INT(11) NOT NULL,
      `mime_type` VARCHAR(100) NOT NULL,
      `created_at` DATETIME NOT NULL,
      PRIMARY KEY (`id`),
      KEY `idx_msg` (`message_id`)
    )
");

// ---------- Хелпер для відправки листів ----------
function send_private_message_email(array $mailCfg, $toEmail, $toName, $fromName, $subject, $bodyText, array $attachments = array())
{
    if (!$toEmail || strpos($toEmail, '@ej.local') !== false) {
        return;
    }

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

        $mail->setFrom($mailCfg['from_email'], $mailCfg['from_name']);
        $mail->addAddress($toEmail, $toName);

        $scheme      = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
        $host        = $_SERVER['HTTP_HOST'] ?? 'localhost';
        $baseUrl     = $scheme . '://' . $host;
        $messagesUrl = $baseUrl . '/messages.php';

        $mail->CharSet = 'UTF-8';
        $mail->isHTML(false);

        $mail->Subject = 'Нове приватне повідомлення в Електронному журналі';
        $text  = "Ви отримали приватне повідомлення від користувача {$fromName} в Електронному журналі.\n\n";
        $text .= "Тема: {$subject}\n\n";
        $text .= "Текст повідомлення:\n" . $bodyText . "\n\n";
        $text .= "Щоб переглянути повідомлення та відповісти, зайдіть у свій кабінет:\n";
        $text .= $messagesUrl . "\n\n";
        $text .= "Це автоматичне повідомлення Електронного журналу, відповідати на нього не потрібно.";

        $mail->Body = $text;

        // Прикріплення файлів до листа
        if (!empty($attachments)) {
            foreach ($attachments as $a) {
                if (empty($a['file_path'])) continue;
                $fileOnDisk = __DIR__ . '/' . ltrim($a['file_path'], '/');
                if (is_file($fileOnDisk)) {
                    $name = $a['original_name'] ?? basename($fileOnDisk);
                    $mail->addAttachment($fileOnDisk, $name);
                }
            }
        }

        $mail->send();
    } catch (Exception $e) {
        error_log('private_message_email_error: ' . $e->getMessage());
    }
}

// ---------- Хелпери для вкладень ----------
function collect_attachments(array &$errors) {
    $result = array();

    if (!isset($_FILES['attachments'])) {
        return $result;
    }

    $files = $_FILES['attachments'];

    // Перевірка на наявність хоча б одного файлу
    if (is_array($files['name'])) {
        $hasFile = false;
        foreach ($files['name'] as $n) {
            if ($n !== '' && $n !== null) {
                $hasFile = true;
                break;
            }
        }
        if (!$hasFile) return $result;
    } else {
        if ($files['name'] === '' || $files['name'] === null) return $result;
    }

    $maxSize   = 5 * 1024 * 1024; // 5 МБ
    $uploadDir = __DIR__ . '/uploads/messages';
    if (!is_dir($uploadDir)) {
        @mkdir($uploadDir, 0775, true);
    }

    $handleOne = function($name, $tmp, $err, $size, $type) use (&$result, &$errors, $maxSize, $uploadDir) {
        if ($err === UPLOAD_ERR_NO_FILE || $name === '' || $tmp === '') {
            return;
        }

        if ($err !== UPLOAD_ERR_OK) {
            $errors[] = 'Помилка завантаження файлу ' . h($name) . '.';
            return;
        }

        $size = (int)$size;
        if ($size <= 0 || $size > $maxSize) {
            $errors[] = 'Файл ' . h($name) . ' перевищує допустимий розмір 5 МБ.';
            return;
        }

        $ext = strtolower(pathinfo($name, PATHINFO_EXTENSION));
        if (!in_array($ext, array('jpg','jpeg','png','gif','webp'), true)) {
            $errors[] = 'Дозволено лише зображення (JPG, PNG, GIF, WEBP). Файл: ' . h($name) . '.';
            return;
        }

        $rnd = function_exists('openssl_random_pseudo_bytes')
            ? bin2hex(openssl_random_pseudo_bytes(4))
            : bin2hex(pack('N', mt_rand()));

        $newName    = 'msg_' . date('YmdHis') . '_' . $rnd . '.' . $ext;
        $targetPath = $uploadDir . '/' . $newName;

        if (!move_uploaded_file($tmp, $targetPath)) {
            $errors[] = 'Не вдалося зберегти файл ' . h($name) . '.';
            return;
        }

        $result[] = array(
            'file_path'     => 'uploads/messages/' . $newName,
            'original_name' => $name,
            'file_size'     => (int)$size,
            'mime_type'     => $type,
        );
    };

    if (is_array($files['name'])) {
        $cnt = count($files['name']);
        for ($i = 0; $i < $cnt; $i++) {
            $handleOne($files['name'][$i], $files['tmp_name'][$i], $files['error'][$i], $files['size'][$i], $files['type'][$i]);
        }
    } else {
        $handleOne($files['name'], $files['tmp_name'], $files['error'], $files['size'], $files['type']);
    }

    return $result;
}

function save_attachments_for_message(mysqli $conn, $message_id, array $attachments_meta) {
    if (empty($attachments_meta)) return;

    $sql = "INSERT INTO private_message_attachments
              (message_id, file_path, original_name, file_size, mime_type, created_at)
            VALUES (?,?,?,?,?,NOW())";
    if ($stmt = $conn->prepare($sql)) {
        foreach ($attachments_meta as $a) {
            $file_path     = $a['file_path'];
            $original_name = $a['original_name'];
            $file_size     = (int)$a['file_size'];
            $mime_type     = $a['mime_type'];

            $stmt->bind_param(
                'issis',
                $message_id,
                $file_path,
                $original_name,
                $file_size,
                $mime_type
            );
            $stmt->execute();
        }
        $stmt->close();
    }
}

function delete_message_with_attachments(mysqli $conn, $msg_id) {
    $msg_id = (int)$msg_id;

    // Збираємо шляхи файлів
    $files = array();
    $sql   = "SELECT file_path FROM private_message_attachments WHERE message_id = ?";
    if ($stmt = $conn->prepare($sql)) {
        $stmt->bind_param('i', $msg_id);
        $stmt->execute();
        $res = $stmt->get_result();
        while ($row = $res->fetch_assoc()) {
            $files[] = $row['file_path'];
        }
        $stmt->close();
    }

    // Видаляємо файли з диска
    foreach ($files as $path) {
        $full = __DIR__ . '/' . ltrim($path, '/');
        if (is_file($full)) {
            @unlink($full);
        }
    }

    // Чистимо записи про вкладення
    if ($stmt = $conn->prepare("DELETE FROM private_message_attachments WHERE message_id = ?")) {
        $stmt->bind_param('i', $msg_id);
        $stmt->execute();
        $stmt->close();
    }

    // Видаляємо саме повідомлення
    if ($stmt = $conn->prepare("DELETE FROM private_messages WHERE id = ?")) {
        $stmt->bind_param('i', $msg_id);
        $stmt->execute();
        $stmt->close();
    }
}

function maybe_hard_delete_message(mysqli $conn, $msg_id) {
    $msg_id = (int)$msg_id;
    $row    = null;

    $sql = "SELECT is_deleted_sender, is_deleted_recipient
            FROM private_messages
            WHERE id = ? LIMIT 1";
    if ($stmt = $conn->prepare($sql)) {
        $stmt->bind_param('i', $msg_id);
        $stmt->execute();
        $res = $stmt->get_result();
        $row = $res->fetch_assoc();
        $stmt->close();
    }

    if ($row && (int)$row['is_deleted_sender'] === 1 && (int)$row['is_deleted_recipient'] === 1) {
        delete_message_with_attachments($conn, $msg_id);
    }
}

/* ===== helpers: pagination + urls ===== */
function clamp_int($v, $min, $max) {
    $v = (int)$v;
    if ($v < $min) return $min;
    if ($v > $max) return $max;
    return $v;
}
function build_url(array $overrides = array()) {
    $q = $_GET;
    foreach ($overrides as $k => $v) {
        if ($v === null) {
            unset($q[$k]);
        } else {
            $q[$k] = $v;
        }
    }
    $qs = http_build_query($q);
    return 'messages.php' . ($qs ? ('?' . $qs) : '');
}

/* ===== sorting helper: "як у журналі" ===== */
function pm_name_key($s) {
    $s = (string)$s;
    if ($s === '') return '';
    if (function_exists('mb_strtolower')) return mb_strtolower($s, 'UTF-8');
    return strtolower($s);
}
function pm_cmp_names($a, $b) {
    $an = isset($a['name']) ? (string)$a['name'] : '';
    $bn = isset($b['name']) ? (string)$b['name'] : '';

    // Найкраще — Collator (uk_UA) якщо intl доступний
    if (class_exists('Collator')) {
        static $coll = null;
        if ($coll === null) {
            $coll = new Collator('uk_UA');
            if ($coll) {
                $coll->setStrength(Collator::PRIMARY);
            }
        }
        if ($coll) {
            $r = $coll->compare($an, $bn);
            if ($r !== 0) return $r;
        }
    }

    // Fallback
    $ak = pm_name_key($an);
    $bk = pm_name_key($bn);
    if ($ak === $bk) return 0;
    return ($ak < $bk) ? -1 : 1;
}

/* ===== paging params ===== */
$PER_PAGE = 10;
$inbox_page = isset($_GET['p_inbox']) ? (int)$_GET['p_inbox'] : 1;
$sent_page  = isset($_GET['p_sent'])  ? (int)$_GET['p_sent']  : 1;

/* search */
$search = isset($_GET['q']) ? trim((string)$_GET['q']) : '';
if (function_exists('mb_substr')) $search = mb_substr($search, 0, 100, 'UTF-8');
else $search = substr($search, 0, 100);

// ---------- Отримання груп і учнів для вчителя/адміна ----------
$groups            = array();
$students_by_group = array();

// Обрана група у вкладці "Нове повідомлення"
$selected_group_id   = isset($_GET['group_id']) ? (int)$_GET['group_id'] : 0;
$selected_student_ids = array();

if ($current_user_role === 'teacher' || $current_user_role === 'admin') {
    // Список усіх груп (як в admin_students.php)
    $gRes = $conn->query("SELECT id, group_name FROM `groups` ORDER BY group_name ASC");
    if ($gRes) {
        while ($row = $gRes->fetch_assoc()) {
            $groups[(int)$row['id']] = $row['group_name'];
        }
        $gRes->free();
    }


    if ($selected_group_id > 0 && !isset($groups[$selected_group_id])) {
        $selected_group_id = 0;
    }

    if (!empty($groups)) {
        $group_ids    = array_keys($groups);
        $placeholders = implode(',', array_fill(0, count($group_ids), '?'));
        $types        = str_repeat('i', count($group_ids));

        $sql = "SELECT id, full_name, group_id
                FROM users
                WHERE role = 'student'
                  AND group_id IN ($placeholders)";
        if ($stmt = $conn->prepare($sql)) {
            $params = array_merge(array($types), $group_ids);
            $refs   = array();
            foreach ($params as $k => $v) {
                $refs[$k] = &$params[$k];
            }
            call_user_func_array(array($stmt, 'bind_param'), $refs);

            $stmt->execute();
            $res = $stmt->get_result();
            while ($row = $res->fetch_assoc()) {
                $gId = (int)$row['group_id'];
                if (!isset($students_by_group[$gId])) {
                    $students_by_group[$gId] = array();
                }
                $students_by_group[$gId][] = array(
                    'id'   => (int)$row['id'],
                    'name' => $row['full_name'],
                );
            }
            $stmt->close();
        }

        // Сортуємо учнів у кожній групі "як у журналі" (Collator uk_UA)
        foreach ($students_by_group as $gId => $arr) {
            if (count($arr) > 1) {
                usort($arr, 'pm_cmp_names');
                $students_by_group[$gId] = $arr;
            }
        }
    }
}

// ---------- Обробка POST ----------
$errors  = array();
$success = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $do = $_POST['do'] ?? '';

    if (!isset($_POST['csrf']) || $_POST['csrf'] !== $csrf) {
        $errors[] = 'Невірний CSRF-токен. Оновіть сторінку і спробуйте ще раз.';
    } else {
        if ($do === 'send') {
            // Відправка учителем/адміном
            if ($current_user_role !== 'teacher' && $current_user_role !== 'admin') {
                $errors[] = 'У вас немає прав для надсилання таких повідомлень.';
            } else {
                $group_id = isset($_POST['group_id']) ? (int)$_POST['group_id'] : 0;
                if ($group_id > 0) {
                    $selected_group_id = $group_id;
                }

                $student_ids = array();
                if (isset($_POST['student_ids']) && is_array($_POST['student_ids'])) {
                    foreach ($_POST['student_ids'] as $sid) {
                        $sid = (int)$sid;
                        if ($sid > 0) {
                            $student_ids[] = $sid;
                        }
                    }
                }
                $selected_student_ids = $student_ids;

                $subject = trim($_POST['subject'] ?? '');
                $body    = trim($_POST['body'] ?? '');

                if ($group_id <= 0) {
                    $errors[] = 'Оберіть групу.';
                }
                if ($subject === '') {
                    $errors[] = 'Вкажіть тему повідомлення.';
                }
                if ($body === '') {
                    $errors[] = 'Текст повідомлення не може бути порожнім.';
                }

                // Спочатку збираємо вкладення
                $attachments_meta = array();
                if (empty($errors)) {
                    $attachments_meta = collect_attachments($errors);
                }

                if (empty($errors)) {
                    // Формуємо отримувачів
                    $recipients = array();

                    if (!empty($student_ids)) {
                        $placeholders = implode(',', array_fill(0, count($student_ids), '?'));
                        $types        = str_repeat('i', count($student_ids));
                        $sql = "SELECT id, full_name, email
                                FROM users
                                WHERE role = 'student'
                                  AND id IN ($placeholders)";
                        if ($stmt = $conn->prepare($sql)) {
                            $params = array_merge(array($types), $student_ids);
                            $refs   = array();
                            foreach ($params as $k => $v) {
                                $refs[$k] = &$params[$k];
                            }
                            call_user_func_array(array($stmt, 'bind_param'), $refs);
                            $stmt->execute();
                            $res = $stmt->get_result();
                            while ($u = $res->fetch_assoc()) {
                                $recipients[] = $u;
                            }
                            $stmt->close();
                        }
                    } elseif ($group_id > 0) {
                        $sql = "SELECT id, full_name, email
                                FROM users
                                WHERE role = 'student'
                                  AND group_id = ?";
                        if ($stmt = $conn->prepare($sql)) {
                            $stmt->bind_param('i', $group_id);
                            $stmt->execute();
                            $res = $stmt->get_result();
                            while ($u = $res->fetch_assoc()) {
                                $recipients[] = $u;
                            }
                            $stmt->close();
                        }
                    }

                    if (empty($recipients)) {
                        $errors[] = 'Не знайдено жодного отримувача.';
                    } else {
                        $conn->autocommit(false);
                        $ok_all  = true;
                        $now     = date('Y-m-d H:i:s');
                        $fromName = $_SESSION['full_name'] ?? 'Викладач';

                        foreach ($recipients as $r) {
                            $rid   = (int)$r['id'];
                            $fname = $r['full_name'];
                            $fmail = $r['email'];

                            $sql = "INSERT INTO private_messages
                                      (sender_id, recipient_id, subject, body, created_at)
                                    VALUES (?,?,?,?,?)";
                            if ($stmt = $conn->prepare($sql)) {
                                $stmt->bind_param(
                                    'iisss',
                                    $current_user_id,
                                    $rid,
                                    $subject,
                                    $body,
                                    $now
                                );
                                if (!$stmt->execute()) {
                                    $ok_all = false;
                                    $stmt->close();
                                    break;
                                }
                                $msg_id = $stmt->insert_id;
                                $stmt->close();

                                // Зберігаємо інформацію про вкладення для цього повідомлення
                                if (!empty($attachments_meta)) {
                                    save_attachments_for_message($conn, $msg_id, $attachments_meta);
                                }

                                // Надсилаємо лист
                                send_private_message_email(
                                    $config_mail,
                                    $fmail,
                                    $fname,
                                    $fromName,
                                    $subject,
                                    $body,
                                    $attachments_meta
                                );
                            } else {
                                $ok_all = false;
                                break;
                            }
                        }

                        if ($ok_all) {
                            $conn->commit();
                            $success              = 'Повідомлення успішно надіслано.';
                            $selected_student_ids = array();
                        } else {
                            $conn->rollback();
                            $errors[] = 'Помилка при збереженні повідомлення.';
                        }

                        $conn->autocommit(true);
                    }
                }
            }
        } elseif ($do === 'reply') {
            // Відповідь будь-якого користувача
            $to_id   = (int)($_POST['to_id'] ?? 0);
            $subject = trim($_POST['subject'] ?? '');
            $body    = trim($_POST['body'] ?? '');

            if ($to_id <= 0) {
                $errors[] = 'Не вказано адресата.';
            }
            if ($subject === '') {
                $errors[] = 'Вкажіть тему повідомлення.';
            }
            if ($body === '') {
                $errors[] = 'Текст повідомлення не може бути порожнім.';
            }

            // Вкладення
            $attachments_meta = array();
            if (empty($errors)) {
                $attachments_meta = collect_attachments($errors);
            }

            if (empty($errors)) {
                // Перевірка адресата
                $recipient = null;
                $sql = "SELECT id, full_name, email
                        FROM users
                        WHERE id = ? LIMIT 1";
                if ($stmt = $conn->prepare($sql)) {
                    $stmt->bind_param('i', $to_id);
                    $stmt->execute();
                    $res = $stmt->get_result();
                    if ($u = $res->fetch_assoc()) {
                        $recipient = $u;
                    }
                    $stmt->close();
                }

                if (!$recipient) {
                    $errors[] = 'Адресат не знайдений.';
                } else {
                    $now = date('Y-m-d H:i:s');
                    $sql = "INSERT INTO private_messages
                              (sender_id, recipient_id, subject, body, created_at)
                            VALUES (?,?,?,?,?)";
                    if ($stmt = $conn->prepare($sql)) {
                        $stmt->bind_param(
                            'iisss',
                            $current_user_id,
                            $recipient['id'],
                            $subject,
                            $body,
                            $now
                        );
                        if ($stmt->execute()) {
                            $msg_id = $stmt->insert_id;
                            $stmt->close();

                            if (!empty($attachments_meta)) {
                                save_attachments_for_message($conn, $msg_id, $attachments_meta);
                            }

                            $success = 'Відповідь відправлено.';
                            send_private_message_email(
                                $config_mail,
                                $recipient['email'],
                                $recipient['full_name'],
                                $_SESSION['full_name'] ?? 'Користувач',
                                $subject,
                                $body,
                                $attachments_meta
                            );
                        } else {
                            $stmt->close();
                            $errors[] = 'Помилка при збереженні відповіді.';
                        }
                    } else {
                        $errors[] = 'Помилка запиту до бази даних.';
                    }
                }
            }
        } elseif ($do === 'delete') {
            $msg_id = (int)($_POST['msg_id'] ?? 0);
            if ($msg_id > 0) {
                $sql = "SELECT sender_id, recipient_id
                        FROM private_messages
                        WHERE id = ? LIMIT 1";
                $row = null;
                if ($stmt = $conn->prepare($sql)) {
                    $stmt->bind_param('i', $msg_id);
                    $stmt->execute();
                    $res = $stmt->get_result();
                    $row = $res->fetch_assoc();
                    $stmt->close();
                }

                if ($row) {
                    if ((int)$row['sender_id'] === $current_user_id) {
                        if ($stmt = $conn->prepare("UPDATE private_messages SET is_deleted_sender = 1 WHERE id = ? LIMIT 1")) {
                            $stmt->bind_param('i', $msg_id);
                            $stmt->execute();
                            $stmt->close();
                        }
                        $success = 'Повідомлення видалено з надісланих.';
                        maybe_hard_delete_message($conn, $msg_id);
                    } elseif ((int)$row['recipient_id'] === $current_user_id) {
                        if ($stmt = $conn->prepare("UPDATE private_messages SET is_deleted_recipient = 1 WHERE id = ? LIMIT 1")) {
                            $stmt->bind_param('i', $msg_id);
                            $stmt->execute();
                            $stmt->close();
                        }
                        $success = 'Повідомлення видалено з вхідних.';
                        maybe_hard_delete_message($conn, $msg_id);
                    }
                }
            }
        }
    }
}

// ---------- Вкладки ----------
$tab = $_GET['tab'] ?? 'inbox';
if (!in_array($tab, array('inbox','sent','view','compose'), true)) {
    $tab = 'inbox';
}

// ---------- Перегляд конкретного повідомлення ----------
$view_message     = null;
$view_attachments = array();

if ($tab === 'view') {
    $msg_id = (int)($_GET['id'] ?? 0);
    if ($msg_id > 0) {
        $sql = "SELECT pm.*,
                       s.full_name AS sender_name,
                       r.full_name AS recipient_name
                FROM private_messages pm
                JOIN users s ON s.id = pm.sender_id
                JOIN users r ON r.id = pm.recipient_id
                WHERE pm.id = ?
                  AND (pm.sender_id = ? OR pm.recipient_id = ?)
                LIMIT 1";
        if ($stmt = $conn->prepare($sql)) {
            $stmt->bind_param('iii', $msg_id, $current_user_id, $current_user_id);
            $stmt->execute();
            $res = $stmt->get_result();
            if ($row = $res->fetch_assoc()) {
                $view_message = $row;

                // Прочитано
                if ((int)$row['recipient_id'] === $current_user_id && $row['read_at'] === null) {
                    $now  = date('Y-m-d H:i:s');
                    $sql2 = "UPDATE private_messages SET read_at = ? WHERE id = ? LIMIT 1";
                    if ($stmt2 = $conn->prepare($sql2)) {
                        $stmt2->bind_param('si', $now, $msg_id);
                        $stmt2->execute();
                        $stmt2->close();
                    }
                }

                // Вкладення
                $sqlA = "SELECT id, file_path, original_name
                         FROM private_message_attachments
                         WHERE message_id = ?";
                if ($stmtA = $conn->prepare($sqlA)) {
                    $stmtA->bind_param('i', $msg_id);
                    $stmtA->execute();
                    $resA = $stmtA->get_result();
                    while ($a = $resA->fetch_assoc()) {
                        $view_attachments[] = $a;
                    }
                    $stmtA->close();
                }
            }
            $stmt->close();
        }
    }
}

// ---------- Вхідні / надіслані (з пагінацією + пошуком) ----------
$inbox_messages = array();
$sent_messages  = array();

$inbox_total = 0;
$sent_total  = 0;

$inbox_pages = 1;
$sent_pages  = 1;

// Вхідні
if ($tab === 'inbox' || $tab === 'view') {
    $where = "pm.recipient_id = ? AND pm.is_deleted_recipient = 0";
    $types = "i";
    $bind  = array($current_user_id);

    if ($search !== '') {
        $where .= " AND u.full_name LIKE ?";
        $types .= "s";
        $bind[] = '%' . $search . '%';
    }

    // count
    $sqlCount = "SELECT COUNT(*)
                 FROM private_messages pm
                 JOIN users u ON u.id = pm.sender_id
                 WHERE $where";
    if ($stmt = $conn->prepare($sqlCount)) {
        $refs = array();
        $params = array_merge(array($types), $bind);
        foreach ($params as $k => $v) $refs[$k] = &$params[$k];
        call_user_func_array(array($stmt,'bind_param'), $refs);

        $stmt->execute();
        $stmt->bind_result($inbox_total);
        $stmt->fetch();
        $stmt->close();
    }

    $inbox_pages = max(1, (int)ceil($inbox_total / $PER_PAGE));
    $inbox_page  = clamp_int($inbox_page, 1, $inbox_pages);
    $offset      = ($inbox_page - 1) * $PER_PAGE;

    $sql = "SELECT pm.id, pm.subject, pm.created_at, pm.read_at,
                   u.full_name AS sender_name
            FROM private_messages pm
            JOIN users u ON u.id = pm.sender_id
            WHERE $where
            ORDER BY pm.created_at DESC
            LIMIT ? OFFSET ?";

    $types2 = $types . "ii";
    $bind2  = $bind;
    $bind2[] = $PER_PAGE;
    $bind2[] = $offset;

    if ($stmt = $conn->prepare($sql)) {
        $refs = array();
        $params = array_merge(array($types2), $bind2);
        foreach ($params as $k => $v) $refs[$k] = &$params[$k];
        call_user_func_array(array($stmt,'bind_param'), $refs);

        $stmt->execute();
        $res = $stmt->get_result();
        while ($row = $res->fetch_assoc()) {
            $inbox_messages[] = $row;
        }
        $stmt->close();
    }
}

// Надіслані
if ($tab === 'sent' || $tab === 'view') {
    $where = "pm.sender_id = ? AND pm.is_deleted_sender = 0";
    $types = "i";
    $bind  = array($current_user_id);

    // "так само як і вхідні": для надісланих логічно шукати за ПІБ отримувача
    if ($search !== '') {
        $where .= " AND u.full_name LIKE ?";
        $types .= "s";
        $bind[] = '%' . $search . '%';
    }

    // count
    $sqlCount = "SELECT COUNT(*)
                 FROM private_messages pm
                 JOIN users u ON u.id = pm.recipient_id
                 WHERE $where";
    if ($stmt = $conn->prepare($sqlCount)) {
        $refs = array();
        $params = array_merge(array($types), $bind);
        foreach ($params as $k => $v) $refs[$k] = &$params[$k];
        call_user_func_array(array($stmt,'bind_param'), $refs);

        $stmt->execute();
        $stmt->bind_result($sent_total);
        $stmt->fetch();
        $stmt->close();
    }

    $sent_pages = max(1, (int)ceil($sent_total / $PER_PAGE));
    $sent_page  = clamp_int($sent_page, 1, $sent_pages);
    $offset     = ($sent_page - 1) * $PER_PAGE;

    $sql = "SELECT pm.id, pm.subject, pm.created_at, pm.read_at,
                   u.full_name AS recipient_name
            FROM private_messages pm
            JOIN users u ON u.id = pm.recipient_id
            WHERE $where
            ORDER BY pm.created_at DESC
            LIMIT ? OFFSET ?";

    $types2 = $types . "ii";
    $bind2  = $bind;
    $bind2[] = $PER_PAGE;
    $bind2[] = $offset;

    if ($stmt = $conn->prepare($sql)) {
        $refs = array();
        $params = array_merge(array($types2), $bind2);
        foreach ($params as $k => $v) $refs[$k] = &$params[$k];
        call_user_func_array(array($stmt,'bind_param'), $refs);

        $stmt->execute();
        $res = $stmt->get_result();
        while ($row = $res->fetch_assoc()) {
            $sent_messages[] = $row;
        }
        $stmt->close();
    }
}

// ---------- Дані для відповіді ----------
$reply_to_id   = 0;
$reply_subject = '';
if ($view_message) {
    if ((int)$view_message['recipient_id'] === $current_user_id) {
        $reply_to_id = (int)$view_message['sender_id'];
    } else {
        $reply_to_id = (int)$view_message['recipient_id'];
    }
    $reply_subject = 'Re: ' . $view_message['subject'];
}

// ---------- "Назад" у View: зберігаємо вкладку/пошук/сторінку ----------
$fromTab = isset($_GET['from']) ? (string)$_GET['from'] : '';
if (!in_array($fromTab, array('inbox','sent'), true)) $fromTab = 'inbox';

$backLabel = ($fromTab === 'sent') ? '← Назад до Надісланих' : '← Назад до Вхідних';
$backUrl   = build_url(array(
    'tab'  => $fromTab,
    'id'   => null,
    'from' => null
));
?>
<!DOCTYPE html>
<html lang="uk">
<head>
    <meta charset="UTF-8">
    <title>Приватні повідомлення — Електронний журнал</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="assets/css/style.css">
    <link rel="stylesheet" href="assets/css/messages.css">
</head>
<body>

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

<main class="wrap">
    <section class="card">
        <div class="page-head">
            <div>
                <h1 class="title">Приватні повідомлення</h1>
                <div class="subtitle">Вхідні, надіслані та відповіді з вкладеннями (зображення).</div>
            </div>
        </div>

        <?php if (!empty($errors)): ?>
            <div class="alert alert--error">
                <?php foreach ($errors as $e): ?>
                    <div><?= h($e); ?></div>
                <?php endforeach; ?>
            </div>
        <?php endif; ?>

        <?php if ($success): ?>
            <div class="alert alert--ok">
                <?= h($success); ?>
            </div>
        <?php endif; ?>

        <div class="tabs">
            <a class="tab <?= $tab === 'inbox' ? 'tab--active' : ''; ?>" href="<?= h(build_url(array('tab'=>'inbox'))); ?>">Вхідні</a>
            <a class="tab <?= $tab === 'sent' ? 'tab--active' : ''; ?>" href="<?= h(build_url(array('tab'=>'sent'))); ?>">Надіслані</a>
            <?php if ($current_user_role === 'teacher' || $current_user_role === 'admin'): ?>
                <a class="tab <?= $tab === 'compose' ? 'tab--active' : ''; ?>" href="<?= h(build_url(array('tab'=>'compose'))); ?>">Нове повідомлення</a>
            <?php endif; ?>
        </div>

        <?php if ($tab === 'view' && $view_message): ?>
            <div class="stack" style="display:flex; gap:10px; flex-wrap:wrap; align-items:center;">
                <a class="btn btn--ghost" href="<?= h($backUrl); ?>"><?= h($backLabel); ?></a>
            </div>

            <div class="msg-view stack">
                <div class="msg-view__subject"><?= h($view_message['subject']); ?></div>
                <div class="msg-view__meta">
                    Від: <?= h($view_message['sender_name']); ?><br>
                    Кому: <?= h($view_message['recipient_name']); ?><br>
                    Дата: <?= h($view_message['created_at']); ?>
                    <?php if ($view_message['read_at']): ?>
                        <br>Прочитано: <?= h($view_message['read_at']); ?>
                    <?php endif; ?>
                </div>
                <div class="msg-view__body"><?= nl2br(h($view_message['body'])); ?></div>

                <?php if (!empty($view_attachments)): ?>
                    <div style="margin-bottom:12px;">
                        <div class="attachments-title">Вкладені файли:</div>
                        <ul class="attachments-list">
                            <?php foreach ($view_attachments as $a):
                                $fileUrl = '/' . ltrim($a['file_path'], '/');
                                $orig    = $a['original_name'];
                                $isImage = (bool)preg_match('~\.(jpe?g|png|gif|webp)$~i', $a['file_path']);
                                ?>
                                <li>
                                    <a href="<?= h($fileUrl); ?>" target="_blank"><?= h($orig); ?></a>
                                    <?php if ($isImage): ?>
                                        <span class="attachments-thumb">
                                            <img src="<?= h($fileUrl); ?>" alt="<?= h($orig); ?>">
                                        </span>
                                    <?php endif; ?>
                                </li>
                            <?php endforeach; ?>
                        </ul>
                    </div>
                <?php endif; ?>

                <div>
                    <form method="post" class="inline-form" onsubmit="return confirm('Видалити це повідомлення?');">
                        <input type="hidden" name="csrf" value="<?= h($csrf); ?>">
                        <input type="hidden" name="do" value="delete">
                        <input type="hidden" name="msg_id" value="<?= (int)$view_message['id']; ?>">
                        <button type="submit" class="btn btn--danger">Видалити</button>
                    </form>
                </div>
            </div>

            <div class="form stack">
                <form method="post" enctype="multipart/form-data">
                    <input type="hidden" name="csrf" value="<?= h($csrf); ?>">
                    <input type="hidden" name="do" value="reply">
                    <input type="hidden" name="to_id" value="<?= (int)$reply_to_id; ?>">

                    <div class="form__row">
                        <label class="form__label">Тема</label>
                        <input class="form__input" type="text" name="subject" value="<?= h($reply_subject); ?>">
                    </div>

                    <div class="form__row">
                        <label class="form__label">Повідомлення</label>
                        <textarea class="form__textarea" name="body"></textarea>
                    </div>

                    <div class="form__row">
                        <label class="form__label">Вкладені файли (зображення, до 5 МБ)</label>
                        <input type="file" name="attachments[]" accept="image/*" multiple>
                        <div class="muted" style="margin-top:6px;">Можна прикріпити кілька зображень.</div>
                    </div>

                    <button type="submit" class="btn btn--primary">Надіслати відповідь</button>
                </form>
            </div>
        <?php endif; ?>

        <?php if ($tab === 'compose' && ($current_user_role === 'teacher' || $current_user_role === 'admin')): ?>

            <div class="form stack">
                <form method="get">
                    <input type="hidden" name="tab" value="compose">
                    <div class="form__row">
                        <label class="form__label">Група (для розсилки або вибору учнів)</label>
                        <select name="group_id" class="form__select" onchange="this.form.submit()">
                            <option value="0">— Оберіть групу —</option>
                            <?php foreach ($groups as $gid => $gname): ?>
                                <option value="<?= (int)$gid; ?>" <?= $selected_group_id === (int)$gid ? 'selected' : ''; ?>>
                                    <?= h($gname); ?>
                                </option>
                            <?php endforeach; ?>
                        </select>
                    </div>
                </form>
            </div>

            <?php if ($selected_group_id > 0): ?>
                <div class="form stack">
                    <form method="post" enctype="multipart/form-data">
                        <input type="hidden" name="csrf" value="<?= h($csrf); ?>">
                        <input type="hidden" name="do" value="send">
                        <input type="hidden" name="group_id" value="<?= (int)$selected_group_id; ?>">

                        <div class="form__row">
                            <label class="form__label">Конкретні учні (можна декількох, або нікого)</label>
                            <select name="student_ids[]" class="form__select" multiple size="6">
                                <?php
                                if ($selected_group_id > 0 && isset($students_by_group[$selected_group_id])) {
                                    // тут вже відсортовано "як у журналі"
                                    foreach ($students_by_group[$selected_group_id] as $st) {
                                        $sid = (int)$st['id'];
                                        $sel = in_array($sid, $selected_student_ids, true) ? 'selected' : '';
                                        echo '<option value="'.$sid.'" '.$sel.'>'.h($st['name']).'</option>';
                                    }
                                } else {
                                    echo '<option value="0" disabled>У цій групі немає учнів</option>';
                                }
                                ?>
                            </select>
                            <div class="muted" style="margin-top:6px;">
                                Якщо не обрати жодного учня — повідомлення отримають усі учні вибраної групи.
                            </div>
                        </div>

                        <div class="form__row">
                            <label class="form__label">Тема</label>
                            <input class="form__input" type="text" name="subject"
                                   value="<?= isset($_POST['subject']) ? h($_POST['subject']) : ''; ?>">
                        </div>

                        <div class="form__row">
                            <label class="form__label">Текст повідомлення</label>
                            <textarea class="form__textarea" name="body"><?= isset($_POST['body']) ? h($_POST['body']) : ''; ?></textarea>
                        </div>

                        <div class="form__row">
                            <label class="form__label">Вкладені файли (зображення, до 5 МБ)</label>
                            <input type="file" name="attachments[]" accept="image/*" multiple>
                            <div class="muted" style="margin-top:6px;">
                                Можна вибрати кілька зображень. Розмір кожного файлу — до 5 МБ.
                            </div>
                        </div>

                        <button type="submit" class="btn btn--primary">Надіслати</button>
                    </form>
                </div>
            <?php else: ?>
                <div class="msg-view stack">
                    <div class="muted">Спочатку оберіть групу, щоб надіслати повідомлення.</div>
                </div>
            <?php endif; ?>
        <?php endif; ?>

        <?php if ($tab === 'inbox'): ?>
            <div class="searchbar stack">
                <form method="get" class="searchbar__form">
                    <input type="hidden" name="tab" value="inbox">
                    <input type="hidden" name="p_inbox" value="1">
                    <div class="searchbar__row">
                        <input class="searchbar__input" type="text" name="q" placeholder="Пошук за ПІБ відправника…" value="<?= h($search); ?>">
                        <button class="btn btn--primary" type="submit">Знайти</button>
                        <?php if ($search !== ''): ?>
                            <a class="btn btn--ghost" href="<?= h(build_url(array('tab'=>'inbox','q'=>null,'p_inbox'=>1))); ?>">Скинути</a>
                        <?php endif; ?>
                    </div>
                    <div class="searchbar__hint muted">Показує по 10 листів на сторінці.</div>
                </form>
            </div>

            <div class="table-wrap stack">
                <table class="messages-list">
                    <thead>
                    <tr>
                        <th>Від кого</th>
                        <th>Тема</th>
                        <th>Дата</th>
                    </tr>
                    </thead>
                    <tbody>
                    <?php if (empty($inbox_messages)): ?>
                        <tr><td colspan="3" class="muted">Вхідних повідомлень немає<?= $search !== '' ? ' (за вашим пошуком)' : ''; ?>.</td></tr>
                    <?php else: ?>
                        <?php foreach ($inbox_messages as $m): ?>
                            <tr class="<?= $m['read_at'] === null ? 'unread' : ''; ?>">
                                <td><?= h($m['sender_name']); ?></td>
                                <td>
                                    <a class="msg-link" href="<?= h(build_url(array('tab'=>'view','id'=>(int)$m['id'],'from'=>'inbox'))); ?>">
                                        <?= h($m['subject']); ?>
                                    </a>
                                </td>
                                <td class="muted"><?= h($m['created_at']); ?></td>
                            </tr>
                        <?php endforeach; ?>
                    <?php endif; ?>
                    </tbody>
                </table>
            </div>

            <?php if ($inbox_pages > 1): ?>
                <div class="pager stack">
                    <div class="pager__meta muted">
                        Сторінка <?= (int)$inbox_page; ?> з <?= (int)$inbox_pages; ?> • Всього: <?= (int)$inbox_total; ?>
                    </div>
                    <div class="pager__buttons">
                        <a class="btn btn--ghost <?= $inbox_page <= 1 ? 'is-disabled' : ''; ?>" href="<?= $inbox_page <= 1 ? '#' : h(build_url(array('tab'=>'inbox','p_inbox'=>1))); ?>">« Перша</a>
                        <a class="btn btn--ghost <?= $inbox_page <= 1 ? 'is-disabled' : ''; ?>" href="<?= $inbox_page <= 1 ? '#' : h(build_url(array('tab'=>'inbox','p_inbox'=>$inbox_page-1))); ?>">‹ Назад</a>
                        <a class="btn btn--ghost <?= $inbox_page >= $inbox_pages ? 'is-disabled' : ''; ?>" href="<?= $inbox_page >= $inbox_pages ? '#' : h(build_url(array('tab'=>'inbox','p_inbox'=>$inbox_page+1))); ?>">Далі ›</a>
                        <a class="btn btn--ghost <?= $inbox_page >= $inbox_pages ? 'is-disabled' : ''; ?>" href="<?= $inbox_page >= $inbox_pages ? '#' : h(build_url(array('tab'=>'inbox','p_inbox'=>$inbox_pages))); ?>">Остання »</a>
                    </div>
                </div>
            <?php endif; ?>
        <?php endif; ?>

        <?php if ($tab === 'sent'): ?>
            <div class="searchbar stack">
                <form method="get" class="searchbar__form">
                    <input type="hidden" name="tab" value="sent">
                    <input type="hidden" name="p_sent" value="1">
                    <div class="searchbar__row">
                        <input class="searchbar__input" type="text" name="q" placeholder="Пошук за ПІБ отримувача…" value="<?= h($search); ?>">
                        <button class="btn btn--primary" type="submit">Знайти</button>
                        <?php if ($search !== ''): ?>
                            <a class="btn btn--ghost" href="<?= h(build_url(array('tab'=>'sent','q'=>null,'p_sent'=>1))); ?>">Скинути</a>
                        <?php endif; ?>
                    </div>
                    <div class="searchbar__hint muted">Показує по 10 листів на сторінці.</div>
                </form>
            </div>

            <div class="table-wrap stack">
                <table class="messages-list">
                    <thead>
                    <tr>
                        <th>Кому</th>
                        <th>Тема</th>
                        <th>Дата</th>
                    </tr>
                    </thead>
                    <tbody>
                    <?php if (empty($sent_messages)): ?>
                        <tr><td colspan="3" class="muted">Надісланих повідомлень немає<?= $search !== '' ? ' (за вашим пошуком)' : ''; ?>.</td></tr>
                    <?php else: ?>
                        <?php foreach ($sent_messages as $m): ?>
                            <tr>
                                <td><?= h($m['recipient_name']); ?></td>
                                <td>
                                    <a class="msg-link" href="<?= h(build_url(array('tab'=>'view','id'=>(int)$m['id'],'from'=>'sent'))); ?>">
                                        <?= h($m['subject']); ?>
                                    </a>
                                </td>
                                <td class="muted"><?= h($m['created_at']); ?></td>
                            </tr>
                        <?php endforeach; ?>
                    <?php endif; ?>
                    </tbody>
                </table>
            </div>

            <?php if ($sent_pages > 1): ?>
                <div class="pager stack">
                    <div class="pager__meta muted">
                        Сторінка <?= (int)$sent_page; ?> з <?= (int)$sent_pages; ?> • Всього: <?= (int)$sent_total; ?>
                    </div>
                    <div class="pager__buttons">
                        <a class="btn btn--ghost <?= $sent_page <= 1 ? 'is-disabled' : ''; ?>" href="<?= $sent_page <= 1 ? '#' : h(build_url(array('tab'=>'sent','p_sent'=>1))); ?>">« Перша</a>
                        <a class="btn btn--ghost <?= $sent_page <= 1 ? 'is-disabled' : ''; ?>" href="<?= $sent_page <= 1 ? '#' : h(build_url(array('tab'=>'sent','p_sent'=>$sent_page-1))); ?>">‹ Назад</a>
                        <a class="btn btn--ghost <?= $sent_page >= $sent_pages ? 'is-disabled' : ''; ?>" href="<?= $sent_page >= $sent_pages ? '#' : h(build_url(array('tab'=>'sent','p_sent'=>$sent_page+1))); ?>">Далі ›</a>
                        <a class="btn btn--ghost <?= $sent_page >= $sent_pages ? 'is-disabled' : ''; ?>" href="<?= $sent_page >= $sent_pages ? '#' : h(build_url(array('tab'=>'sent','p_sent'=>$sent_pages))); ?>">Остання »</a>
                    </div>
                </div>
            <?php endif; ?>
        <?php endif; ?>
    </section>
</main>

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

</body>
</html>