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

// Доступ: admin або teacher
if (!isset($_SESSION['user_id']) || !in_array($_SESSION['role'] ?? 'user', ['admin','teacher'], true)) {
    header("Location: ../login.php"); exit;
}

// ==== Підключення PhpSpreadsheet (без composer) ====
$psp_paths = [
    __DIR__ . '/../includes/PhpSpreadsheet/vendor/autoload.php',
    __DIR__ . '/../includes/PhpSpreadsheet/autoload.php',
    __DIR__ . '/../includes/PhpSpreadsheet/src/Bootstrap.php',
];
$psp_loaded = false;
foreach ($psp_paths as $p) {
    if (file_exists($p)) {
        require_once $p;
        $psp_loaded = true;
        break;
    }
}
if (!$psp_loaded) {
    die("Не знайдено автозавантаження PhpSpreadsheet. Перевір шлях у /includes/PhpSpreadsheet/");
}

use PhpOffice\PhpSpreadsheet\IOFactory;

// ==== Довідники днів/уроків ====
$DAYS = ['Пн','Вт','Ср','Чт','Пт']; // тільки робочі дні
$COLS = ['A','B','C','D','E'];      // відповідність Пн..Пт
$DEFAULT_SLOTS = [
    1 => '09:00–09:45', 2 => '09:55–10:40', 3 => '10:50–11:35', 4 => '11:55–12:40',
    5 => '12:50–13:35', 6 => '13:45–14:30', 7 => '14:40–15:25', 8 => '15:30–16:15',
];

// ==== Функції утиліти ====

// Завантажити часові слоти групи з БД або дефолт
function loadTimeSlots(mysqli $conn, int $group_id, array $DEFAULT_SLOTS): array {
    $slots = [];
    $sql = "SELECT lesson_number, start_time, end_time FROM lesson_times WHERE group_id = ? ORDER BY lesson_number";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("i", $group_id);
    $stmt->execute();
    $res = $stmt->get_result();
    while ($row = $res->fetch_assoc()) {
        $s = substr($row['start_time'],0,5);
        $e = substr($row['end_time'],0,5);
        $slots[(int)$row['lesson_number']] = "{$s}–{$e}";
    }
    $stmt->close();
    if (empty($slots)) $slots = $DEFAULT_SLOTS;
    return $slots;
}

// Парсинг вмісту клітинки -> [subject, teacher, room]
function parseCell(?string $raw): array {
    $raw = trim((string)$raw);
    if ($raw === '') return [null,null,null];

    // Розбиваємо або по рядках, або по роздільниках
    $lines = preg_split("/\r\n|\r|\n/", $raw);
    $lines = array_values(array_filter(array_map('trim', $lines), fn($v)=>$v!==''));

    if (count($lines) >= 2 && count($lines) <= 3) {
        $subject = $lines[0] ?? null;
        $teacher = $lines[1] ?? null;
        $room    = $lines[2] ?? null;
        return [nz($subject), nz($teacher), nz($room)];
    }

    // Якщо в один рядок — дозволяємо | / ; як роздільники
    $one = $lines ? implode(' ', $lines) : $raw;
    $parts = preg_split("/\s*(\||\/|;|,)\s*/u", $one);
    $parts = array_values(array_filter(array_map('trim', $parts), fn($v)=>$v!==''));
    $subject = $parts[0] ?? null;
    $teacher = $parts[1] ?? null;
    $room    = $parts[2] ?? null;

    return [nz($subject), nz($teacher), nz($room)];
}
function nz($s){ $s=trim((string)$s); return $s===''?null:$s; }

// Завантажити список груп (для селектора)
function loadGroups(mysqli $conn): array {
    $out = [];
    if ($res = $conn->query("SELECT id, name FROM `groups` ORDER BY position, name")) {
        while ($r = $res->fetch_assoc()) $out[] = $r;
    }
    return $out;
}

// Отримати назву групи
function getGroup(mysqli $conn, int $gid): ?array {
    $sql="SELECT id,name FROM `groups` WHERE id=? LIMIT 1";
    $stmt=$conn->prepare($sql);
    $stmt->bind_param("i",$gid);
    $stmt->execute();
    $r=$stmt->get_result()->fetch_assoc();
    $stmt->close();
    return $r ?: null;
}

// Знайти існуючий запис розкладу по (group_id, day_of_week, time_slot)
function findExisting(mysqli $conn, int $group_id, string $day, string $time_slot): ?int {
    $sql="SELECT id FROM schedules WHERE group_id=? AND day_of_week=? AND time_slot=? LIMIT 1";
    $stmt=$conn->prepare($sql);
    $stmt->bind_param("iss",$group_id,$day,$time_slot);
    $stmt->execute();
    $id=($stmt->get_result()->fetch_assoc())['id'] ?? null;
    $stmt->close();
    return $id ? (int)$id : null;
}

// Зберегти одну клітинку
function upsertSchedule(mysqli $conn, int $group_id, string $day, string $time_slot, ?string $subject, ?string $teacher, ?string $room): void {
    // Якщо все порожнє — пропускаємо
    if ($subject===null && $teacher===null && $room===null) return;

    // NULL-и краще явно передавати
    $subject = $subject ?: null;
    $teacher = $teacher ?: null;
    $room    = $room ?: null;

    $existingId = findExisting($conn, $group_id, $day, $time_slot);
    if ($existingId) {
        $sql = "UPDATE schedules SET subject=?, teacher=?, room=?, replacement=NULL, lesson_link=NULL, teacher_comment=NULL WHERE id=?";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("sssi", $subject, $teacher, $room, $existingId);
        $stmt->execute();
        $stmt->close();
    } else {
        $sql = "INSERT INTO schedules (group_id, day_of_week, time_slot, subject, teacher, room, replacement, lesson_link, teacher_comment)
                VALUES (?,?,?,?,?,?,NULL,NULL,NULL)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("isssss", $group_id, $day, $time_slot, $subject, $teacher, $room);
        $stmt->execute();
        $stmt->close();
    }
}

// ==== Крок 1 (завантаження) / Крок 2 (підтвердження) ====
$step = $_POST['step'] ?? 'upload';

// Списки груп для селектора
$groups = loadGroups($conn);

if ($step === 'confirm') {
    // ====== Збереження у БД ======
    $group_id = (int)($_POST['group_id'] ?? 0);
    $clear    = (int)($_POST['clear_week'] ?? 0) === 1;
    $payload  = json_decode($_POST['payload_json'] ?? '[]', true);

    $group = getGroup($conn, $group_id);
    if (!$group) { die("Групу не знайдено."); }

    $timeSlots = loadTimeSlots($conn, $group_id, $DEFAULT_SLOTS);

    if ($clear) {
        // чистимо Пн–Пт
        $in = "'" . implode("','", $DAYS) . "'";
        $conn->query("DELETE FROM schedules WHERE group_id={$group_id} AND day_of_week IN ($in)");
    }

    // Проходимо всі клітинки payload: [ [day, lesson_number, subject, teacher, room], ... ]
    $imported = 0;
    foreach ($payload as $row) {
        [$day, $lessonNumber, $subject, $teacher, $room] = $row;
        $lessonNumber = (int)$lessonNumber;
        if (!in_array($day, $DAYS, true)) continue;
        if ($lessonNumber < 1 || $lessonNumber > 8) continue;

        $time_slot = $timeSlots[$lessonNumber] ?? $DEFAULT_SLOTS[$lessonNumber];
        upsertSchedule($conn, $group_id, $day, $time_slot, nz($subject), nz($teacher), nz($room));
        $imported++;
    }

    // Готово
    header("Location: ./dashboard_schedule.php?group_id={$group_id}&imported={$imported}");
    exit;
}

// ==== Крок 1: показати форму або прев’ю після парсингу ====
$preview = [];
$group_id = (int)($_POST['group_id'] ?? 0);
$clear_week = isset($_POST['clear_week']) ? 1 : 0;
$group = $group_id ? getGroup($conn, $group_id) : null;

if ($step === 'upload' && $_SERVER['REQUEST_METHOD']==='POST' && isset($_FILES['xlsx']) && $group) {
    if (!is_uploaded_file($_FILES['xlsx']['tmp_name'])) {
        $err = "Файл не завантажено.";
    } else {
        try {
            $spreadsheet = IOFactory::load($_FILES['xlsx']['tmp_name']);
            $sheet = $spreadsheet->getActiveSheet();

            // Читаємо 8 рядків × 5 стовпчиків
            for ($r = 1; $r <= 8; $r++) {
                for ($c = 0; $c < 5; $c++) {
                    $col = $COLS[$c];
                    $day = $DAYS[$c];
                    $cell = (string)$sheet->getCell("{$col}{$r}")->getValue();
                    [$subj,$teach,$room] = parseCell($cell);
                    $preview[] = [$day, $r, $subj, $teach, $room];
                }
            }
        } catch (Throwable $e) {
            $err = "Помилка читання .xlsx: " . $e->getMessage();
        }
    }
}

// ==== HTML ====
?>
<!doctype html>
<html lang="uk">
<head>
<meta charset="utf-8">
<title>Імпорт розкладу (тиждень з Excel)</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="bg-light">
<div class="container py-4">
    <div class="d-flex align-items-center justify-content-between mb-3">
        <h3 class="mb-0">Імпорт розкладу (тиждень з .xlsx)</h3>
        <a class="btn btn-outline-secondary" href="./dashboard_schedule.php<?= $group_id?('?group_id='.$group_id):'' ?>">← До розкладу</a>
    </div>

    <?php if (!empty($err)): ?>
        <div class="alert alert-danger"><?= htmlspecialchars($err) ?></div>
    <?php endif; ?>

    <?php if (empty($preview)): ?>
        <!-- КРОК 1: Форма завантаження -->
        <form method="post" enctype="multipart/form-data" class="card shadow-sm p-3 bg-white">
            <input type="hidden" name="step" value="upload">
            <div class="row g-3">
                <div class="col-md-4">
                    <label for="group_id" class="form-label">Група</label>
                    <select id="group_id" name="group_id" class="form-select" required>
                        <option value="">— оберіть групу —</option>
                        <?php foreach ($groups as $g): ?>
                            <option value="<?= (int)$g['id'] ?>" <?= ($g['id']==$group_id?'selected':'') ?>>
                                <?= htmlspecialchars($g['name']) ?>
                            </option>
                        <?php endforeach; ?>
                    </select>
                </div>
                <div class="col-md-5">
                    <label for="xlsx" class="form-label">Файл .xlsx (Пн–Пт у стовпчиках A–E; 1–8 уроки — рядки 1–8)</label>
                    <input type="file" id="xlsx" name="xlsx" class="form-control" accept=".xlsx" required>
                </div>
                <div class="col-md-3 d-flex align-items-end">
                    <div class="form-check">
                        <input class="form-check-input" type="checkbox" id="clear_week" name="clear_week" value="1" <?= $clear_week?'checked':'' ?>>
                        <label class="form-check-label" for="clear_week">Очистити тиждень перед імпортом</label>
                    </div>
                </div>
            </div>
            <div class="mt-3 d-flex gap-2">
                <button type="submit" class="btn btn-primary">Переглянути</button>
                <a href="./dashboard.php" class="btn btn-secondary">Скасувати</a>
            </div>
            <hr>
            <p class="text-muted small mb-0">
                Формат клітинки: <code>Предмет | Викладач | Каб</code> або у 2–3 рядки (1 — предмет, 2 — викладач, 3 — каб).
            </p>
        </form>
    <?php else: ?>
        <!-- КРОК 2: Прев'ю + Підтвердження -->
        <div class="card shadow-sm p-3 bg-white">
            <h5 class="mb-3">Перевірте імпорт для групи: <strong><?= htmlspecialchars($group['name']) ?></strong></h5>
            <div class="table-responsive">
                <table class="table table-bordered align-middle">
                    <thead class="table-light">
                        <tr>
                            <th>День</th>
                            <th>Урок</th>
                            <th>Предмет</th>
                            <th>Викладач</th>
                            <th>Кабінет</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ($preview as [$day,$lesson,$s,$t,$r]): ?>
                        <tr>
                            <td><?= htmlspecialchars($day) ?></td>
                            <td><?= (int)$lesson ?></td>
                            <td><?= htmlspecialchars($s ?? '') ?></td>
                            <td><?= htmlspecialchars($t ?? '') ?></td>
                            <td><?= htmlspecialchars($r ?? '') ?></td>
                        </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
            </div>

            <form method="post" class="mt-3">
                <input type="hidden" name="step" value="confirm">
                <input type="hidden" name="group_id" value="<?= (int)$group_id ?>">
                <input type="hidden" name="clear_week" value="<?= (int)$clear_week ?>">
                <input type="hidden" name="payload_json" value='<?= json_encode($preview, JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT) ?>'>
                <div class="d-flex gap-2">
                    <button type="submit" class="btn btn-success">Підтвердити імпорт</button>
                    <a href="./import_week.php" class="btn btn-secondary">Назад</a>
                </div>
            </form>
        </div>
    <?php endif; ?>
</div>
</body>
</html>
