<?php
session_start();
require_once '../includes/db_config.php';

/** ------------------------------
 *  Налаштування та хелпери
 *  ------------------------------ */

// Де шукати PDF-архіви
$PDF_DIR_CANDIDATES = array_filter([
    realpath($_SERVER['DOCUMENT_ROOT'] . '/arhive'),          // головна папка, де /arhive/<Назва групи>/*.pdf
    realpath($_SERVER['DOCUMENT_ROOT'] . '/admin/pdf_archives'),
    realpath($_SERVER['DOCUMENT_ROOT'] . '/scripts/pdf/archives'),
    realpath($_SERVER['DOCUMENT_ROOT'] . '/pdf_archives'),
]);

function str_starts_with_polyfill($haystack, $needle) {
    return $needle === '' || strncmp($haystack, $needle, strlen($needle)) === 0;
}

// Перевірка, що шлях усередині дозволених коренів
function isAllowedPath($rp, $roots) {
    foreach ($roots as $root) {
        if ($root && (str_starts_with_polyfill($rp, $root . DIRECTORY_SEPARATOR) || $rp === $root)) {
            return true;
        }
    }
    return false;
}

// Витягаємо дату YYYY-MM-DD з імені файлу (або повертаємо null)
function extractDateFromFilename($basename) {
    if (preg_match('/(20\d{2})[-_.]?(0[1-9]|1[0-2])[-_.]?(0[1-9]|[12]\d|3[01])/', $basename, $m)) {
        return sprintf('%04d-%02d-%02d', (int)$m[1], (int)$m[2], (int)$m[3]);
    }
    return null;
}

/**
 * Пошук PDF для групи:
 * 1) шукаємо у <root>/<Назва групи>/*.pdf (ваш основний кейс),
 * 2) якщо порожньо — пробуємо шаблони у корені root.
 *
 * Повертає: date => ['file'=>realpath, 'mtime'=>ts, 'basename'=>..., 'root'=>...]
 */
function findPdfArchivesForGroup($group_id, $roots, $group_name) {
    $byDate = [];

    foreach ($roots as $root) {
        if (!$root || !is_dir($root)) continue;

        // 1) Підпапка з назвою групи
        $groupDir = realpath($root . DIRECTORY_SEPARATOR . $group_name);
        if ($groupDir && is_dir($groupDir)) {
            foreach (glob($groupDir . DIRECTORY_SEPARATOR . '*.pdf') as $fp) {
                if (!is_file($fp)) continue;
                $rp = realpath($fp);
                if (!$rp) continue;

                $basename = basename($rp);
                $ts = @filemtime($rp) ?: 0;
                $dateKey = extractDateFromFilename($basename);
                if (!$dateKey && $ts) $dateKey = date('Y-m-d', $ts);
                if (!$dateKey) continue;

                if (!isset($byDate[$dateKey]) || $byDate[$dateKey]['mtime'] < $ts) {
                    $byDate[$dateKey] = [
                        'file'     => $rp,
                        'mtime'    => $ts,
                        'basename' => $basename,
                        'root'     => $root,
                    ];
                }
            }
        }

        // 2) fallback у корені (необов’язково, але хай буде)
        if (empty($byDate)) {
            $patterns = [
                "group_{$group_id}_*.pdf",
                "schedule_group_{$group_id}_*.pdf",
                "archive_group_{$group_id}_*.pdf",
                "*_group_{$group_id}_*.pdf",
                "*group{$group_id}*.pdf",
                "{$group_id}_*.pdf",
                "{$group_name}*.pdf",
                "*{$group_name}*.pdf",
            ];
            foreach ($patterns as $pat) {
                foreach (glob($root . DIRECTORY_SEPARATOR . $pat) as $fp) {
                    if (!is_file($fp)) continue;
                    $rp = realpath($fp);
                    if (!$rp) continue;

                    $basename = basename($rp);
                    $ts = @filemtime($rp) ?: 0;
                    $dateKey = extractDateFromFilename($basename);
                    if (!$dateKey && $ts) $dateKey = date('Y-m-d', $ts);
                    if (!$dateKey) continue;

                    if (!isset($byDate[$dateKey]) || $byDate[$dateKey]['mtime'] < $ts) {
                        $byDate[$dateKey] = [
                            'file'     => $rp,
                            'mtime'    => $ts,
                            'basename' => $basename,
                            'root'     => $root,
                        ];
                    }
                }
            }
        }
    }

    if (!empty($byDate)) {
        uksort($byDate, function($a, $b){ return strcmp($b, $a); }); // новіші вище
    }
    return $byDate;
}

/** ---------------------------------------
 *  Видача PDF (inline/attachment) і вихід
 *  --------------------------------------- */
if (isset($_GET['action'], $_GET['fp']) && in_array($_GET['action'], ['preview','download'], true)) {
    $fp_b64 = (string)$_GET['fp'];
    $raw = base64_decode($fp_b64, true);
    if ($raw === false || $raw === '') {
        http_response_code(400);
        exit('Невірний параметр файлу.');
    }
    $raw = str_replace("\0", '', $raw);
    $rp  = realpath($raw);
    if (!$rp || !is_file($rp)) {
        http_response_code(404);
        exit('Файл не знайдено.');
    }
    if (!isAllowedPath($rp, $PDF_DIR_CANDIDATES)) {
        http_response_code(403);
        exit('Доступ заборонено.');
    }
    if (strtolower(pathinfo($rp, PATHINFO_EXTENSION)) !== 'pdf') {
        http_response_code(415);
        exit('Очікувався PDF.');
    }

    $fname = basename($rp);
    $size  = (int)filesize($rp);

    header('Content-Type: application/pdf');
    header('Content-Length: ' . $size);
    if ($_GET['action'] === 'download') {
        header('Content-Disposition: attachment; filename="' . rawurlencode($fname) . '"');
    } else {
        header('Content-Disposition: inline; filename="' . rawurlencode($fname) . '"');
    }
    header('X-Content-Type-Options: nosniff');
    readfile($rp);
    exit;
}

/** ------------------------------
 *  Основна логіка сторінки (UI)
 *  ------------------------------ */

// Параметри групи
$group_id = 0;
if (isset($_GET['group_id'])) {
    $group_id = (int)$_GET['group_id'];
} elseif (isset($_GET['id'])) {
    $group_id = (int)$_GET['id'];
}

// Список груп
$groups = [];
$gq = $conn->query("SELECT id, name FROM `groups` ORDER BY position, name");
while ($row = $gq->fetch_assoc()) {
    $groups[] = $row;
}

// Поточна група
$group = null;
if ($group_id > 0) {
    $sql = "SELECT name FROM `groups` WHERE id = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("i", $group_id);
    $stmt->execute();
    $group = $stmt->get_result()->fetch_assoc();
    $stmt->close();
}

// Колекція PDF по групі
$pdfArchives = $group ? findPdfArchivesForGroup($group_id, $PDF_DIR_CANDIDATES, $group['name']) : [];

// Обрана дата
$selected_date = null;
if ($group && !empty($pdfArchives)) {
    if (!empty($_GET['date']) && isset($pdfArchives[$_GET['date']])) {
        $selected_date = $_GET['date'];
    } else {
        $selected_date = array_key_first($pdfArchives);
    }
}

?><!DOCTYPE html>
<html lang="uk">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title><?php
        echo 'Архів розкладу';
        if ($group) echo ' — ' . htmlspecialchars($group['name']);
    ?></title>

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" />
    <link rel="stylesheet" href="../css/schedule-archive.css" />
</head>
<body>
<?php include '../includes/header.php'; ?>

<div class="container-archive container py-3">
    <h1 class="page-title mb-3">
        Архів розкладу
        <?php if ($group): ?>
            <small class="text-muted d-block d-sm-inline">для групи <?php echo htmlspecialchars($group['name']); ?></small>
        <?php endif; ?>
    </h1>

    <form method="GET" class="row g-2 align-items-end mb-4" id="filters">
        <div class="col-12 col-md-6">
            <label for="group_id" class="form-label">Група</label>
            <select id="group_id" name="group_id" class="form-select" onchange="this.form.submit()">
                <option value="0" <?php echo ($group_id <= 0 ? 'selected' : ''); ?>>— оберіть групу —</option>
                <?php foreach ($groups as $g): ?>
                    <option value="<?php echo (int)$g['id']; ?>" <?php echo ((int)$g['id'] === (int)$group_id ? 'selected' : ''); ?>>
                        <?php echo htmlspecialchars($g['name']); ?>
                    </option>
                <?php endforeach; ?>
            </select>
        </div>

        <div class="col-12 col-md-6">
            <label for="date" class="form-label">Дата архіву</label>
            <select id="date" name="date" class="form-select" <?php echo (!$group || empty($pdfArchives)) ? 'disabled' : ''; ?> onchange="this.form.submit()">
                <?php if (!$group): ?>
                    <option>Спочатку оберіть групу</option>
                <?php elseif (empty($pdfArchives)): ?>
                    <option>PDF-архівів поки немає</option>
                <?php else: ?>
                    <?php foreach ($pdfArchives as $date => $info): ?>
                        <option value="<?php echo htmlspecialchars($date); ?>" <?php echo ($selected_date === $date ? 'selected' : ''); ?>>
                            <?php echo htmlspecialchars($date); ?>
                        </option>
                    <?php endforeach; ?>
                <?php endif; ?>
            </select>
        </div>
    </form>

    <?php if (!$group_id): ?>
        <div class="alert alert-info">Оберіть групу, щоб переглянути PDF-архіви.</div>

    <?php elseif (!$group): ?>
        <div class="alert alert-warning">Такої групи не знайдено. Будь ласка, оберіть іншу.</div>

    <?php elseif (empty($pdfArchives)): ?>
        <div class="alert alert-secondary">Для цієї групи не знайдено жодного PDF-архіву у відомих теках.</div>

    <?php else:
        $current = isset($pdfArchives[$selected_date]) ? $pdfArchives[$selected_date] : null;
        if ($current):
            $fp = $current['file'];
            $basename = $current['basename'];
            $fp_b64 = rawurlencode(base64_encode($fp));

            // Формуємо URL-и коректно (без коротких тегів у рядках)
            $previewUrl  = '?group_id=' . $group_id . '&date=' . rawurlencode($selected_date) . '&action=preview&fp=' . $fp_b64;
            $downloadUrl = '?group_id=' . $group_id . '&date=' . rawurlencode($selected_date) . '&action=download&fp=' . $fp_b64;
    ?>
        <div class="card shadow-sm">
            <div class="card-body d-flex flex-column flex-md-row align-items-md-center justify-content-between">
                <div class="mb-3 mb-md-0">
                    <div class="text-muted small">Файл архіву (<?php echo htmlspecialchars($selected_date); ?>)</div>
                    <div class="fw-semibold"><?php echo htmlspecialchars($basename); ?></div>
                </div>
                <div class="d-flex gap-2">
                    <a class="btn btn-outline-primary" href="<?php echo htmlspecialchars($previewUrl); ?>" target="_blank" rel="noopener">Переглянути</a>
                    <a class="btn btn-primary" href="<?php echo htmlspecialchars($downloadUrl); ?>">Завантажити</a>
                </div>
            </div>
            <div class="card-footer text-muted small">
                <span class="me-3">Розташування: <?php echo htmlspecialchars(str_replace($_SERVER['DOCUMENT_ROOT'], '', $current['file'])); ?></span>
                <span>Оновлено: <?php echo $current['mtime'] ? date('Y-m-d H:i', $current['mtime']) : '—'; ?></span>
            </div>
        </div>
    <?php else: ?>
        <div class="alert alert-secondary">На обрану дату файл не знайдено.</div>
    <?php endif; endif; ?>
</div>

<?php include '../includes/footer.php'; ?>
</body>
</html>
