========================================================
SIMKURING V2.0 - MASTER CONTEXT BLUEPRINT
========================================================

Berikut adalah seluruh struktur kode aplikasi Simkuring V2.0.
Aplikasi ini menggunakan PHP Native, PDO MySQL, Bootstrap 5, dan terintegrasi Bot Telegram.

--------------------------------------------------------
FILE: header.php
--------------------------------------------------------
<?php
// Pastikan sesi hanya dimulai jika belum ada sesi yang aktif
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// Cek apakah pengguna sudah melewati login.php
if (!isset($_SESSION['login_simkuring'])) {
    header("Location: login.php");
    exit;
}

// Menyimpan role aktif untuk digunakan di halaman lain (misal: membatasi fitur)
$role_aktif = $_SESSION['role_simkuring'];

// Panggil konfigurasi identitas visual
require_once 'config_app.php'; 
?>
<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><?= htmlspecialchars($APP_NAME) ?> - <?= htmlspecialchars($SCHOOL_NAME) ?></title>
    
    <?php if(!empty($FAVICON_FILE)): ?>
        <link rel="icon" type="image/png" href="<?= $FAVICON_FILE ?>">
    <?php elseif(!empty($LOGO_FILE)): ?>
        <link rel="icon" type="image/png" href="<?= $LOGO_FILE ?>">
    <?php endif; ?>
    
    <meta name="theme-color" content="<?= $THEME_COLOR ?>">
    
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <style>
        body {
            background-color: #f4f6f9;
            overflow-x: hidden;
        }
        #wrapper {
            display: flex;
            width: 100%;
            align-items: stretch;
        }
        #sidebar {
            min-width: 250px;
            max-width: 250px;
            background: #212529;
            color: #fff;
            transition: all 0.3s;
            min-height: 100vh;
        }
        #sidebar.active {
            margin-left: -250px;
        }
        #sidebar .sidebar-header {
            padding: 20px;
            background: #1a1e21;
        }
        #sidebar ul.components {
            padding: 20px 0;
        }
        #sidebar ul p {
            color: #fff;
            padding: 10px;
        }
        #sidebar ul li a {
            padding: 15px 20px;
            font-size: 1.1em;
            display: block;
            color: #adb5bd;
            text-decoration: none;
            transition: 0.2s;
        }
        /* Sorotan Menu Aktif Dinamis Mengikuti Warna Tema Pengaturan */
        #sidebar ul li a:hover, #sidebar ul li.active > a {
            color: #fff;
            background: <?= $THEME_COLOR ?>; 
        }
        #sidebar ul li a i {
            margin-right: 10px;
            width: 20px;
            text-align: center;
        }
        #content {
            width: 100%;
            padding: 20px;
            min-height: 100vh;
            transition: all 0.3s;
        }
        /* Responsif untuk layar kecil (Ponsel) */
        @media (max-width: 768px) {
            #sidebar {
                margin-left: -250px;
            }
            #sidebar.active {
                margin-left: 0;
            }
        }
    </style>
</head>
<body>
    <div id="wrapper">

--------------------------------------------------------
FILE: manajemen_akun.php
--------------------------------------------------------
<?php
// 1. MULAI SESI & KONEKSI
if (session_status() === PHP_SESSION_NONE) { session_start(); }
require_once 'koneksi.php';

// 2. BLOKIR AKSES (HANYA ADMIN YANG BOLEH KELOLA AKUN)
if (!isset($_SESSION['role_simkuring']) || $_SESSION['role_simkuring'] !== 'Admin') {
    header("Location: dashboard.php");
    exit;
}

$id_user_login = isset($_SESSION['id_user_simkuring']) ? $_SESSION['id_user_simkuring'] : 1; 

// --- AUTO-DEPLOYMENT: Penyesuaian Tabel master_users ---
try {
    // Pastikan tabel master_users ada
    $pdo->query("CREATE TABLE IF NOT EXISTS master_users (
        id_user INT AUTO_INCREMENT PRIMARY KEY,
        username VARCHAR(50) UNIQUE,
        password VARCHAR(255),
        role ENUM('Admin', 'Guru', 'Kepala Jurusan') NOT NULL DEFAULT 'Admin',
        id_guru INT NULL
    )");

    // Tambahkan kolom nama_lengkap jika belum ada untuk mendukung form ini
    $cekKolom = $pdo->query("SHOW COLUMNS FROM master_users LIKE 'nama_lengkap'")->rowCount();
    if ($cekKolom == 0) {
        $pdo->query("ALTER TABLE master_users ADD COLUMN nama_lengkap VARCHAR(100) NULL AFTER id_user");
    }
    
    // Sesuaikan ENUM role agar Kepala Jurusan bisa masuk
    $pdo->query("ALTER TABLE master_users MODIFY COLUMN role ENUM('Admin', 'Guru', 'Kepala Jurusan') NOT NULL DEFAULT 'Admin'");

    // Buat akun Super Admin default jika tabel masih kosong
    if ($pdo->query("SELECT COUNT(*) FROM master_users")->fetchColumn() == 0) {
        $default_pass = password_hash('admin123', PASSWORD_DEFAULT);
        $pdo->query("INSERT INTO master_users (nama_lengkap, username, password, role) VALUES ('Administrator Utama', 'admin', '$default_pass', 'Admin')");
    }
} catch (\Throwable $e) {
    die("<div class='alert alert-danger'>Gagal inisialisasi tabel: " . $e->getMessage() . "</div>");
}

$pesan = '';

// --- PROSES CRUD AKUN ---

// 1. Tambah Akun
if (isset($_POST['tambah_akun'])) {
    $nama = trim($_POST['nama_lengkap']);
    $user = trim($_POST['username']);
    $pass = $_POST['password'];
    $role = $_POST['role'];

    // Cek apakah username sudah dipakai
    $stmtCek = $pdo->prepare("SELECT id_user FROM master_users WHERE username = ?");
    $stmtCek->execute([$user]);
    
    if ($stmtCek->rowCount() > 0) {
        $pesan = "<div class='alert alert-danger shadow-sm'><i class='fas fa-exclamation-circle me-2'></i> Gagal: Username <b>$user</b> sudah digunakan orang lain.</div>";
    } else {
        $hash_pass = password_hash($pass, PASSWORD_DEFAULT);
        $stmt = $pdo->prepare("INSERT INTO master_users (nama_lengkap, username, password, role) VALUES (?, ?, ?, ?)");
        if ($stmt->execute([$nama, $user, $hash_pass, $role])) {
            $pesan = "<div class='alert alert-success shadow-sm'><i class='fas fa-check-circle me-2'></i> Akun <b>$nama</b> berhasil ditambahkan!</div>";
        }
    }
}

// 2. Edit Akun
if (isset($_POST['edit_akun'])) {
    $id_user_form = $_POST['id_user'];
    $nama = trim($_POST['nama_lengkap']);
    $user = trim($_POST['username']);
    $role = $_POST['role'];
    $pass_baru = $_POST['password_baru'];

    // Cek duplikasi username (kecuali username miliknya sendiri)
    $stmtCek = $pdo->prepare("SELECT id_user FROM master_users WHERE username = ? AND id_user != ?");
    $stmtCek->execute([$user, $id_user_form]);

    if ($stmtCek->rowCount() > 0) {
        $pesan = "<div class='alert alert-danger shadow-sm'><i class='fas fa-exclamation-circle me-2'></i> Gagal: Username <b>$user</b> sudah terpakai.</div>";
    } else {
        if (!empty($pass_baru)) {
            // Update beserta Password
            $hash_pass = password_hash($pass_baru, PASSWORD_DEFAULT);
            $stmt = $pdo->prepare("UPDATE master_users SET nama_lengkap = ?, username = ?, role = ?, password = ? WHERE id_user = ?");
            $stmt->execute([$nama, $user, $role, $hash_pass, $id_user_form]);
        } else {
            // Update tanpa mengubah Password
            $stmt = $pdo->prepare("UPDATE master_users SET nama_lengkap = ?, username = ?, role = ? WHERE id_user = ?");
            $stmt->execute([$nama, $user, $role, $id_user_form]);
        }
        $pesan = "<div class='alert alert-success shadow-sm'><i class='fas fa-check-circle me-2'></i> Pembaruan data akun <b>$nama</b> berhasil disimpan!</div>";
    }
}

// 3. Hapus Akun
if (isset($_GET['hapus'])) {
    $id_hapus = $_GET['hapus'];
    if ($id_hapus == $id_user_login) {
        $pesan = "<div class='alert alert-danger shadow-sm'><i class='fas fa-shield-alt me-2'></i> Keamanan Sistem: Anda tidak diizinkan menghapus akun yang sedang Anda gunakan saat ini.</div>";
    } else {
        $stmt = $pdo->prepare("DELETE FROM master_users WHERE id_user = ?");
        if ($stmt->execute([$id_hapus])) {
            header("Location: manajemen_akun.php?status=terhapus");
            exit;
        }
    }
}

if (isset($_GET['status']) && $_GET['status'] == 'terhapus') {
    $pesan = "<div class='alert alert-success shadow-sm'><i class='fas fa-trash-alt me-2'></i> Akun berhasil dihapus permanen dari sistem.</div>";
}

// --- AMBIL DATA AKUN ---
$data_akun = $pdo->query("SELECT * FROM master_users WHERE role IN ('Admin', 'Kepala Jurusan') ORDER BY role ASC, nama_lengkap ASC")->fetchAll();

include 'header.php';
include 'sidebar.php';
?>

<style>
    .card-clean { background: #fff; border: none; border-radius: 12px; box-shadow: 0 4px 12px rgba(0,0,0,0.05); }
    .table-clean thead th { background-color: #f8f9fa; color: #495057; font-weight: 700; border-bottom: 2px solid #dee2e6; padding: 12px; }
    .table-clean tbody td { vertical-align: middle; padding: 12px; border-bottom: 1px solid #f1f3f5; color: #343a40; }
    .avatar-circle { width: 45px; height: 45px; background: #e3f2fd; color: #0d6efd; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: bold; font-size: 1.2rem; }
</style>

<div class="container-fluid p-4 bg-light min-vh-100">
    <div class="d-flex justify-content-between align-items-center mb-4">
        <div>
            <h2 class="fw-bold mb-1"><i class="fas fa-users-cog text-warning me-2"></i> Manajemen Akun Sistem</h2>
            <p class="text-muted mb-0">Kelola hak akses untuk Staf Kurikulum dan Kepala Jurusan.</p>
        </div>
        <button class="btn btn-primary shadow-sm fw-bold px-4" data-bs-toggle="modal" data-bs-target="#modalTambah">
            <i class="fas fa-plus-circle me-2"></i> Tambah Akun Baru
        </button>
    </div>

    <?= $pesan ?>

    <div class="card card-clean">
        <div class="card-body p-0">
            <div class="table-responsive">
                <table class="table table-clean mb-0 table-hover">
                    <thead>
                        <tr>
                            <th width="5%" class="text-center">No</th>
                            <th width="35%">Nama Lengkap</th>
                            <th width="20%">Username Login</th>
                            <th width="20%">Hak Akses (Role)</th>
                            <th width="20%" class="text-center">Aksi Administrator</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php if (empty($data_akun)): ?>
                            <tr><td colspan="5" class="text-center py-5 text-muted">Tidak ada data akun.</td></tr>
                        <?php else: ?>
                            <?php $no = 1; foreach ($data_akun as $row): 
                                $inisial = strtoupper(substr($row['nama_lengkap'], 0, 1));
                                $is_me = ($row['id_user'] == $id_user_login);
                            ?>
                            <tr>
                                <td class="text-center text-muted"><?= $no++ ?></td>
                                <td>
                                    <div class="d-flex align-items-center">
                                        <div class="avatar-circle me-3 shadow-sm"><?= $inisial ?></div>
                                        <div>
                                            <div class="fw-bold text-dark"><?= htmlspecialchars($row['nama_lengkap']) ?></div>
                                            <?php if($is_me): ?><span class="badge bg-success mt-1" style="font-size: 0.6rem;">SEDANG DIGUNAKAN</span><?php endif; ?>
                                        </div>
                                    </div>
                                </td>
                                <td>
                                    <code class="text-dark bg-light px-2 py-1 rounded fw-bold border"><i class="fas fa-keyboard text-muted me-1"></i> <?= htmlspecialchars($row['username']) ?></code>
                                </td>
                                <td>
                                    <?php if($row['role'] == 'Admin'): ?>
                                        <span class="badge bg-danger"><i class="fas fa-user-shield me-1"></i> Super Admin</span>
                                    <?php else: ?>
                                        <span class="badge bg-info text-dark"><i class="fas fa-user-tie me-1"></i> Kepala Jurusan</span>
                                    <?php endif; ?>
                                </td>
                                <td class="text-center">
                                    <button class="btn btn-sm btn-outline-warning fw-bold me-1" data-bs-toggle="modal" data-bs-target="#modalEdit<?= $row['id_user'] ?>"><i class="fas fa-edit"></i> Edit</button>
                                    
                                    <?php if(!$is_me): ?>
                                        <a href="manajemen_akun.php?hapus=<?= $row['id_user'] ?>" class="btn btn-sm btn-outline-danger fw-bold" onclick="return confirm('Apakah Anda yakin ingin menghapus akun <?= htmlspecialchars($row['nama_lengkap']) ?> secara permanen?');"><i class="fas fa-trash-alt"></i> Hapus</a>
                                    <?php else: ?>
                                        <button class="btn btn-sm btn-outline-secondary fw-bold" disabled title="Tidak bisa menghapus akun sendiri"><i class="fas fa-lock"></i> Kunci</button>
                                    <?php endif; ?>
                                </td>
                            </tr>

                            <div class="modal fade" id="modalEdit<?= $row['id_user'] ?>" tabindex="-1">
                                <div class="modal-dialog">
                                    <div class="modal-content border-0 shadow-lg">
                                        <div class="modal-header bg-warning">
                                            <h5 class="modal-title fw-bold text-dark"><i class="fas fa-user-edit me-2"></i> Edit Akun Pengguna</h5>
                                            <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
                                        </div>
                                        <form action="manajemen_akun.php" method="POST">
                                            <div class="modal-body bg-light">
                                                <input type="hidden" name="id_user" value="<?= $row['id_user'] ?>">
                                                
                                                <div class="mb-3">
                                                    <label class="form-label fw-bold text-secondary">Nama Lengkap</label>
                                                    <input type="text" class="form-control" name="nama_lengkap" value="<?= htmlspecialchars($row['nama_lengkap']) ?>" required>
                                                </div>
                                                <div class="mb-3">
                                                    <label class="form-label fw-bold text-secondary">Username Login</label>
                                                    <input type="text" class="form-control" name="username" value="<?= htmlspecialchars($row['username']) ?>" required>
                                                </div>
                                                <div class="mb-3">
                                                    <label class="form-label fw-bold text-secondary">Hak Akses (Role)</label>
                                                    <select class="form-select" name="role" required>
                                                        <option value="Admin" <?= $row['role'] == 'Admin' ? 'selected' : '' ?>>Super Admin (Akses Penuh)</option>
                                                        <option value="Kepala Jurusan" <?= $row['role'] == 'Kepala Jurusan' ? 'selected' : '' ?>>Kepala Jurusan (Hanya Laporan)</option>
                                                    </select>
                                                </div>
                                                <div class="mb-2">
                                                    <label class="form-label fw-bold text-danger">Reset Kata Sandi</label>
                                                    <input type="password" class="form-control border-danger" name="password_baru" placeholder="Ketik sandi baru di sini...">
                                                    <div class="form-text text-muted small"><i class="fas fa-info-circle"></i> Biarkan kosong jika tidak ingin mengubah kata sandi saat ini.</div>
                                                </div>
                                            </div>
                                            <div class="modal-footer bg-light">
                                                <button type="button" class="btn btn-secondary fw-bold" data-bs-dismiss="modal">Batal</button>
                                                <button type="submit" name="edit_akun" class="btn btn-warning fw-bold">Simpan Perubahan</button>
                                            </div>
                                        </form>
                                    </div>
                                </div>
                            </div>

                            <?php endforeach; ?>
                        <?php endif; ?>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</div>

<div class="modal fade" id="modalTambah" tabindex="-1">
    <div class="modal-dialog">
        <div class="modal-content border-0 shadow-lg">
            <div class="modal-header bg-primary text-white">
                <h5 class="modal-title fw-bold"><i class="fas fa-user-plus me-2"></i> Tambah Akun Baru</h5>
                <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
            </div>
            <form action="manajemen_akun.php" method="POST">
                <div class="modal-body bg-light">
                    <div class="mb-3">
                        <label class="form-label fw-bold text-secondary">Nama Lengkap</label>
                        <input type="text" class="form-control" name="nama_lengkap" placeholder="Masukkan nama staf/guru..." required>
                    </div>
                    <div class="mb-3">
                        <label class="form-label fw-bold text-secondary">Username Login</label>
                        <input type="text" class="form-control" name="username" placeholder="Contoh: kaprog_tkr" required>
                    </div>
                    <div class="mb-3">
                        <label class="form-label fw-bold text-secondary">Kata Sandi Awal</label>
                        <input type="password" class="form-control" name="password" placeholder="Minimal 6 karakter" required minlength="6">
                    </div>
                    <div class="mb-2">
                        <label class="form-label fw-bold text-secondary">Hak Akses (Role)</label>
                        <select class="form-select" name="role" required>
                            <option value="Admin">Super Admin (Akses Penuh)</option>
                            <option value="Kepala Jurusan" selected>Kepala Jurusan (Hanya Laporan)</option>
                        </select>
                        <div class="form-text text-muted small mt-2">
                            <b>Catatan Hak Akses:</b><br>
                            - <b>Admin:</b> Dapat menyusun jadwal AI, mengelola master data, dan memantau TV.<br>
                            - <b>Kepala Jurusan:</b> Hanya dapat melihat Rekap Laporan Kehadiran guru.
                        </div>
                    </div>
                </div>
                <div class="modal-footer bg-light">
                    <button type="button" class="btn btn-secondary fw-bold" data-bs-dismiss="modal">Batal</button>
                    <button type="submit" name="tambah_akun" class="btn btn-primary fw-bold shadow-sm"><i class="fas fa-save me-2"></i> Buat Akun</button>
                </div>
            </form>
        </div>
    </div>
</div>

<?php include 'footer.php'; ?>

--------------------------------------------------------
FILE: absen_kamera.php
--------------------------------------------------------
<?php
date_default_timezone_set('Asia/Jakarta');
require_once 'koneksi.php';

$id_jadwal = isset($_GET['jdwl']) ? (int)$_GET['jdwl'] : 0;
$token_masuk = isset($_GET['token']) ? $_GET['token'] : '';
$tanggal_hari_ini = date('Y-m-d');
$is_tes = (isset($_GET['tes']) && $_GET['tes'] == '1') ? 1 : 0;

// AUTO DEPLOY & OPTIMASI INDEX DATABASE
try {
    $cekKolomTes = $pdo->query("SHOW COLUMNS FROM jurnal_kehadiran LIKE 'is_tes'")->rowCount();
    if ($cekKolomTes == 0) { $pdo->query("ALTER TABLE jurnal_kehadiran ADD COLUMN is_tes TINYINT(1) DEFAULT 0 AFTER status"); }
    
    $cekKolomJurnal = $pdo->query("SHOW COLUMNS FROM jurnal_kehadiran LIKE 'jurnal_materi'")->rowCount();
    if ($cekKolomJurnal == 0) { $pdo->query("ALTER TABLE jurnal_kehadiran ADD COLUMN jurnal_materi TEXT NULL AFTER foto_path"); }

    $cekIdx1 = $pdo->query("SHOW INDEX FROM jurnal_kehadiran WHERE Key_name = 'idx_absen_harian'")->rowCount();
    if ($cekIdx1 == 0) { $pdo->query("ALTER TABLE jurnal_kehadiran ADD INDEX idx_absen_harian (tanggal, id_guru, id_jadwal, is_tes, status)"); }

    $cekIdx2 = $pdo->query("SHOW INDEX FROM jadwal_pelajaran WHERE Key_name = 'idx_jadwal_hari'")->rowCount();
    if ($cekIdx2 == 0) { $pdo->query("ALTER TABLE jadwal_pelajaran ADD INDEX idx_jadwal_hari (hari, jp_mulai, jp_selesai)"); }
} catch (\Throwable $e) {}

// --- VALIDASI TOKEN & AMBIL IDENTITAS GURU ---
$izin_akses = false;
$guru_aktif = null;

if ($id_jadwal == 0 && $is_tes == 1) {
    // KONDISI KHUSUS UJI COBA
    $sql_all_guru = "SELECT id_guru, nama_guru, telegram_chat_id FROM master_guru WHERE telegram_chat_id IS NOT NULL";
    $stmtAll = $pdo->query($sql_all_guru);
    $semua_guru = $stmtAll->fetchAll();

    foreach ($semua_guru as $g) {
        $token_asli = md5('0' . $g['telegram_chat_id'] . date('Ymd'));
        if ($token_masuk === $token_asli) {
            $izin_akses = true;
            $guru_aktif = [
                'id_guru' => $g['id_guru'], 'nama_guru' => $g['nama_guru'], 'telegram_chat_id' => $g['telegram_chat_id'],
                'nama_mapel' => 'Tes Sistem Penjadwalan', 'nama_kelas' => 'Seluruh Kelas',
                'batas_masuk' => '00:00:00', 'batas_keluar' => '23:59:59'
            ];
            break;
        }
    }
} else {
    // KONDISI NORMAL JADWAL ASLI DENGAN LOGIKA "JADWAL SELANJUTNYA"
    $sql = "SELECT j.id_jadwal, g.id_guru, g.nama_guru, g.telegram_chat_id, b.nama_mapel, k.nama_kelas,
                   j.hari, j.jp_mulai,
                   w1.jam_mulai as batas_masuk, w2.jam_selesai as batas_keluar_asli
            FROM jadwal_pelajaran j 
            JOIN beban_mengajar b ON j.id_beban = b.id_beban 
            JOIN master_kelas k ON b.id_kelas = k.id_kelas 
            JOIN beban_mengajar_guru bg ON b.id_beban = bg.id_beban 
            JOIN master_guru g ON bg.id_guru = g.id_guru 
            LEFT JOIN master_waktu_jp w1 ON j.jp_mulai = w1.urutan_jp
            LEFT JOIN master_waktu_jp w2 ON j.jp_selesai = w2.urutan_jp
            WHERE j.id_jadwal = ?";
    $stmt = $pdo->prepare($sql); 
    $stmt->execute([$id_jadwal]);
    $data_jadwal = $stmt->fetchAll();

    foreach ($data_jadwal as $dj) {
        $token_asli = md5($dj['id_jadwal'] . $dj['telegram_chat_id'] . date('Ymd'));
        if ($token_masuk === $token_asli) { 
            $izin_akses = true; 
            
            // LOGIKA DINAMIS: Cari jam mulai dari "Jadwal Selanjutnya" untuk guru ini di hari yang sama
            $sql_next = "SELECT w.jam_mulai 
                         FROM jadwal_pelajaran jn
                         JOIN beban_mengajar_guru bgn ON jn.id_beban = bgn.id_beban
                         JOIN master_waktu_jp w ON jn.jp_mulai = w.urutan_jp
                         WHERE bgn.id_guru = ? AND jn.hari = ? AND jn.jp_mulai > ?
                         ORDER BY jn.jp_mulai ASC LIMIT 1";
            $stmtNext = $pdo->prepare($sql_next);
            $stmtNext->execute([$dj['id_guru'], $dj['hari'], $dj['jp_mulai']]);
            $next_schedule = $stmtNext->fetch();
            
            if ($next_schedule) {
                // Jika ada kelas lain setelah ini, matikan link tepat saat kelas tersebut dimulai
                $dj['batas_keluar'] = $next_schedule['jam_mulai'];
            } else {
                // Jika ini adalah kelas terakhirnya hari ini, beri kesempatan hingga tengah malam
                $dj['batas_keluar'] = '23:59:59';
            }
            
            $guru_aktif = $dj; 
            break; 
        }
    }
}

// 1. BLOKIR JIKA TOKEN SALAH / KEDALUWARSA
if (!$izin_akses) {
    die("<!DOCTYPE html><html><head><meta name='viewport' content='width=device-width, initial-scale=1'><title>Akses Ditolak</title><link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'></head><body class='bg-light d-flex align-items-center justify-content-center vh-100'><div class='text-center'><h1 class='text-danger fw-bold'>❌ Akses Ditolak</h1><p class='text-muted'>Tautan ini tidak valid atau telah kedaluwarsa.</p></div></body></html>");
}

// 2. BLOKIR TIME WINDOW (JENDELA WAKTU MENGAJAR) BERDASARKAN JADWAL SELANJUTNYA
if ($is_tes == 0) {
    $waktu_sekarang = date('H:i:s');
    $batas_masuk = !empty($guru_aktif['batas_masuk']) ? $guru_aktif['batas_masuk'] : '00:00:00';
    $batas_tutup_kamera = !empty($guru_aktif['batas_keluar']) ? $guru_aktif['batas_keluar'] : '23:59:59';
    
    // Buka tautan 30 menit sebelum jadwal asli kelas dimulai
    $batas_buka_kamera = date('H:i:s', strtotime($batas_masuk) - (30 * 60));

    if ($waktu_sekarang > $batas_tutup_kamera) {
        $pesan_alasan = ($batas_tutup_kamera == '23:59:59') 
            ? "Batas waktu pengisian kehadiran untuk kelas ini telah berakhir secara harian." 
            : "Tautan ini telah dinonaktifkan karena <b>Jadwal Kelas Anda Selanjutnya</b> telah dimulai pada pukul <b>".substr($batas_tutup_kamera, 0, 5)." WIB</b>.";

        die("<!DOCTYPE html><html><head><meta name='viewport' content='width=device-width, initial-scale=1'><title>Sesi Berakhir</title><link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'><link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css'></head><body class='bg-light d-flex align-items-center justify-content-center vh-100'><div class='text-center p-4'><div class='text-danger mb-3'><i class='fas fa-clock fa-4x opacity-75'></i></div><h3 class='fw-bold text-dark'>Sesi Telah Berakhir</h3><p class='text-muted'>{$pesan_alasan}<br>Anda tidak dapat lagi mengirim laporan untuk kelas yang sudah lalu.</p></div></body></html>");
    }

    if ($waktu_sekarang < $batas_buka_kamera) {
        die("<!DOCTYPE html><html><head><meta name='viewport' content='width=device-width, initial-scale=1'><title>Belum Dimulai</title><link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'><link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css'></head><body class='bg-light d-flex align-items-center justify-content-center vh-100'><div class='text-center p-4'><div class='text-warning mb-3'><i class='fas fa-hourglass-half fa-4x opacity-75'></i></div><h3 class='fw-bold text-dark'>Kelas Belum Dimulai</h3><p class='text-muted'>Anda menekan tautan terlalu awal.<br>Kamera kehadiran untuk kelas ini baru akan terbuka pada pukul <b>".substr($batas_buka_kamera, 0, 5)." WIB</b>.</p></div></body></html>");
    }
}

// 3. BLOKIR ABSEN GANDA
if ($is_tes == 0) {
    $stmtCekAbsen = $pdo->prepare("SELECT id_kehadiran FROM jurnal_kehadiran WHERE id_jadwal = ? AND id_guru = ? AND tanggal = ? AND is_tes = 0");
    $stmtCekAbsen->execute([$id_jadwal, $guru_aktif['id_guru'], $tanggal_hari_ini]);
    if ($stmtCekAbsen->rowCount() > 0) {
        die("<!DOCTYPE html><html><head><meta name='viewport' content='width=device-width, initial-scale=1'><title>Sudah Absen</title><link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'><link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css'></head><body class='bg-light d-flex align-items-center justify-content-center vh-100'><div class='text-center p-4'><div class='text-success mb-3'><i class='fas fa-check-circle fa-4x'></i></div><h3 class='fw-bold text-dark'>Selesai!</h3><p class='text-muted'>Anda sudah melakukan presensi untuk sesi ini.</p></div></body></html>");
    }
}

// =========================================================
// PROSES UPLOAD DENGAN KOMPRESI (GD)
// =========================================================
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['foto_kamera'])) {
    $lat = $_POST['latitude']; 
    $lng = $_POST['longitude'];
    $jurnal_materi = trim($_POST['jurnal_materi']);
    
    $file_tmp = $_FILES['foto_kamera']['tmp_name'];
    $file_info = getimagesize($file_tmp);
    
    $nama_file_baru = date('Ymd') . '_' . $guru_aktif['id_guru'] . '_' . $id_jadwal . '_' . time() . '.jpg';
    $path_simpan = 'uploads/kehadiran/' . $nama_file_baru;
    $sukses_upload = false;

    if ($file_info) {
        $mime = $file_info['mime'];
        $image = null;
        if ($mime == 'image/jpeg' || $mime == 'image/jpg') { $image = imagecreatefromjpeg($file_tmp); } 
        elseif ($mime == 'image/png') { $image = imagecreatefrompng($file_tmp); } 
        elseif ($mime == 'image/webp') { $image = imagecreatefromwebp($file_tmp); }

        if ($image !== null) {
            $imgWidth = imagesx($image); $imgHeight = imagesy($image);
            $newWidth = 800; $newHeight = floor($imgHeight * ($newWidth / $imgWidth));
            if ($imgWidth <= $newWidth) { $newWidth = $imgWidth; $newHeight = $imgHeight; }

            $newImage = imagecreatetruecolor($newWidth, $newHeight);
            if ($mime == 'image/png') {
                $white = imagecolorallocate($newImage, 255, 255, 255);
                imagefill($newImage, 0, 0, $white);
            }
            imagecopyresampled($newImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $imgWidth, $imgHeight);
            if (imagejpeg($newImage, $path_simpan, 65)) { $sukses_upload = true; }
            
            imagedestroy($image); imagedestroy($newImage);
        }
    }

    if (!$sukses_upload) {
        if (move_uploaded_file($file_tmp, $path_simpan)) { $sukses_upload = true; }
    }

    if ($sukses_upload) {
        $stmtInsert = $pdo->prepare("INSERT INTO jurnal_kehadiran (id_jadwal, id_guru, tanggal, waktu_absen, status, is_tes, foto_path, jurnal_materi, latitude, longitude) VALUES (?, ?, ?, ?, 'Hadir', ?, ?, ?, ?, ?)");
        $stmtInsert->execute([$id_jadwal, $guru_aktif['id_guru'], $tanggal_hari_ini, date('H:i:s'), $is_tes, $nama_file_baru, $jurnal_materi, $lat, $lng]);
        $berhasil = true;
    } else { 
        $error_upload = "Sistem gagal memproses dan menyimpan foto ke server."; 
    }
}
?>

<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>Kamera & Jurnal KBM - Simkuring</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <style>
        body { background-color: #f0f2f5; font-family: sans-serif; }
        .camera-box { background: #e9ecef; height: 320px; display: flex; align-items: center; justify-content: center; border-radius: 10px; border: 2px dashed #0d6efd; position: relative; overflow: hidden; cursor: pointer; transition: 0.3s; }
        #preview_img { width: 100%; height: 100%; object-fit: cover; display: none; }
        input[type="file"] { display: none; }
        .jurnal-input { border: 2px solid #ced4da; border-radius: 10px; resize: none; background: #fff; font-size: 0.95rem; }
        .jurnal-input:focus { border-color: #0d6efd; box-shadow: none; }
        .bot-commands { background-color: #e3f2fd; border-radius: 10px; border: 1px solid #b6effb; }
    </style>
</head>
<body>
<div class="container py-4">
    <?php if (isset($berhasil)): ?>
        <div class="text-center mt-4 pt-4">
            <div class="bg-success text-white rounded-circle d-inline-flex align-items-center justify-content-center mb-3 shadow-lg" style="width: 90px; height: 90px;">
                <i class="fas fa-check fa-3x"></i>
            </div>
            <h2 class="fw-bold text-dark">Data Terekam!</h2>
            <p class="text-muted fs-6 mt-2">Terima kasih, Bapak/Ibu <b><?= htmlspecialchars($guru_aktif['nama_guru']) ?></b>.<br>Kehadiran, Bukti Foto, dan Jurnal Materi Anda telah berhasil disinkronisasi.</p>
            
            <?php if($is_tes): ?>
                <div class="alert alert-warning mt-3 fw-bold shadow-sm">
                    <i class="fas fa-flask me-2"></i> Mode Uji Coba. Anda bebas mengirim ulang melalui tombol di Telegram.
                </div>
            <?php endif; ?>

            <div class="bot-commands p-3 text-start shadow-sm mt-4">
                <h6 class="fw-bold text-primary mb-2"><i class="fas fa-robot me-2"></i>Asisten Bot Telegram</h6>
                <p class="small text-muted mb-2">Anda dapat mengetik perintah berikut di ruang chat bot Telegram Simkuring:</p>
                <ul class="small text-dark mb-0 ps-3">
                    <li class="mb-1"><code class="text-primary fw-bold">/jadwalhariini</code> - Cek jadwal mengajar Anda hari ini.</li>
                    <li class="mb-1"><code class="text-primary fw-bold">/jadwalbesok</code> - Cek persiapan jadwal untuk besok.</li>
                    <li class="mb-1"><code class="text-primary fw-bold">/rekapbulanini</code> - Lihat rekapitulasi kehadiran Anda.</li>
                    <li class="mb-1"><code class="text-primary fw-bold">/guruterajin</code> - Lihat guru paling rajin bulan ini.</li>
                    <li class="mb-1"><code class="text-primary fw-bold">/peringkatguru</code> - Lihat klasemen tingkat kedisiplinan guru.</li>
                </ul>
            </div>
            
            <p class="text-muted small mt-4 fw-bold">
                <i class="fas fa-info-circle me-1"></i> Silakan tekan tombol <b>'X' (Tutup)</b> atau <b>'Selesai'</b> di sudut layar untuk kembali ke Telegram.
            </p>
        </div>
    <?php else: ?>
        <div class="card border-0 shadow-lg" style="border-radius: 15px; overflow:hidden;">
            <div class="card-header <?= $is_tes ? 'bg-danger' : 'bg-primary' ?> text-white text-center py-3 border-0">
                <h5 class="mb-0 fw-bold"><i class="fas fa-camera-retro me-2"></i> Laporan KBM <?= $is_tes ? '(UJI COBA BEBAS)' : '' ?></h5>
            </div>
            <div class="card-body p-4">
                <div class="text-center mb-4">
                    <h6 class="fw-bold text-dark mb-1"><?= htmlspecialchars($guru_aktif['nama_guru']) ?></h6>
                    <span class="badge <?= $is_tes ? 'bg-danger' : 'bg-primary' ?> fs-6 mb-2"><?= htmlspecialchars($guru_aktif['nama_kelas']) ?></span>
                    <p class="text-muted small fw-bold mb-0"><?= htmlspecialchars($guru_aktif['nama_mapel']) ?></p>
                </div>
                
                <?php if(isset($error_upload)): ?>
                    <div class="alert alert-danger small py-2 fw-bold text-center"><i class="fas fa-exclamation-triangle"></i> <?= $error_upload ?></div>
                <?php endif; ?>
                
                <form id="formAbsen" method="POST" enctype="multipart/form-data">
                    <input type="hidden" name="latitude" id="lat" value="">
                    <input type="hidden" name="longitude" id="lng" value="">
                    
                    <div class="mb-3">
                        <label class="form-label fw-bold text-secondary small"><i class="fas fa-pen-alt me-1"></i> Jurnal / Ringkasan Materi Hari Ini</label>
                        <textarea class="form-control jurnal-input p-3" name="jurnal_materi" rows="3" placeholder="Contoh: Menjelaskan struktur HTML dasar dan mempraktekkan pembuatan tabel." required></textarea>
                    </div>

                    <label class="camera-box w-100 mb-3 shadow-sm" for="kamera_input" id="box_kamera">
                        <div class="text-center text-primary" id="instruksi_kamera">
                            <i class="fas fa-camera fa-4x mb-3"></i>
                            <h6 class="fw-bold mb-0">Ketuk untuk Ambil Foto Kelas</h6>
                        </div>
                        <img id="preview_img" src="#" alt="Preview Kamera">
                    </label>
                    <input type="file" id="kamera_input" name="foto_kamera" accept="image/*" capture="environment" required>
                    
                    <div id="lokasi_status" class="alert alert-warning small py-2 text-center d-none fw-bold shadow-sm"></div>
                    
                    <button type="submit" id="btnSubmit" class="btn btn-primary w-100 py-3 fw-bold fs-5 shadow mt-2" disabled>
                        <i class="fas fa-paper-plane me-2"></i> Kirim Laporan
                    </button>
                </form>
            </div>
        </div>
    <?php endif; ?>
</div>

<script>
    const inputKamera = document.getElementById('kamera_input');
    const previewImg = document.getElementById('preview_img');
    const instruksiKamera = document.getElementById('instruksi_kamera');
    const btnSubmit = document.getElementById('btnSubmit');
    const lokasiStatus = document.getElementById('lokasi_status');
    const latInput = document.getElementById('lat');
    const lngInput = document.getElementById('lng');
    const formAbsen = document.getElementById('formAbsen');

    let lokasiDitemukan = false; let fotoDiambil = false;

    inputKamera.addEventListener('change', function(e) {
        if (e.target.files && e.target.files[0]) {
            const reader = new FileReader();
            reader.onload = function(e) {
                previewImg.src = e.target.result; 
                previewImg.style.display = 'block'; 
                instruksiKamera.style.display = 'none'; 
                fotoDiambil = true; cekStatusKesiapan();
            }
            reader.readAsDataURL(e.target.files[0]);
        }
    });

    function getLocation() {
        lokasiStatus.classList.remove('d-none'); 
        lokasiStatus.className = "alert alert-warning small py-2 text-center text-dark"; 
        lokasiStatus.innerHTML = "<i class='fas fa-satellite-dish fa-spin me-1'></i> Membaca titik satelit GPS...";
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(
                function(position) { latInput.value = position.coords.latitude; lngInput.value = position.coords.longitude; lokasiDitemukan = true; lokasiStatus.className = "alert alert-success small py-2 text-center fw-bold shadow-sm"; lokasiStatus.innerHTML = "<i class='fas fa-map-marker-alt me-1'></i> Sinyal Lokasi Akurat Didapatkan."; cekStatusKesiapan(); },
                function(error) { lokasiStatus.className = "alert alert-danger small py-2 text-center fw-bold shadow-sm"; lokasiStatus.innerHTML = "<i class='fas fa-exclamation-triangle me-1'></i> Sinyal GPS lemah / Ditolak."; },
                { enableHighAccuracy: true, timeout: 15000, maximumAge: 0 }
            );
        } else { lokasiStatus.className = "alert alert-danger small py-2 text-center"; lokasiStatus.innerHTML = "Browser tidak mendukung fitur lokasi."; }
    }

    function cekStatusKesiapan() { if (fotoDiambil && lokasiDitemukan) { btnSubmit.disabled = false; } else { btnSubmit.disabled = true; } }
    
    document.addEventListener("DOMContentLoaded", getLocation);

    if (formAbsen) {
        formAbsen.addEventListener('submit', function() {
            btnSubmit.disabled = true;
            btnSubmit.innerHTML = '<i class="fas fa-spinner fa-spin me-2"></i> Memproses & Mengompresi Foto...';
        });
    }
</script>
</body>
</html>

--------------------------------------------------------
FILE: config_app.php
--------------------------------------------------------
<?php
require_once 'koneksi.php';

// =========================================================
// AUTO DEPLOY: TABEL PENGATURAN SISTEM
// =========================================================
try {
    $pdo->query("CREATE TABLE IF NOT EXISTS master_settings (
        setting_key VARCHAR(50) PRIMARY KEY,
        setting_value TEXT NULL
    )");

    $cek = $pdo->query("SELECT COUNT(*) FROM master_settings")->fetchColumn();
    if ($cek == 0) {
        $defaults = [
            'app_name' => 'Simkuring',
            'school_name' => 'SMKN 1 Sukalarang',
            'footer_text' => 'Simkuring v2.0 Enterprise Edition',
            'theme_color' => '#0d6efd',
            'logo_file' => '', 
            'bg_login' => '',
            'favicon_file' => '' // Tambahan Default Favicon
        ];
        $stmt = $pdo->prepare("INSERT INTO master_settings (setting_key, setting_value) VALUES (?, ?)");
        foreach ($defaults as $key => $val) { $stmt->execute([$key, $val]); }
    }
} catch (\Throwable $e) {}

// AMBIL SEMUA PENGATURAN DAN JADIKAN VARIABEL GLOBAL
$settings_query = $pdo->query("SELECT * FROM master_settings")->fetchAll(PDO::FETCH_KEY_PAIR);

$APP_NAME = $settings_query['app_name'] ?? 'Simkuring';
$SCHOOL_NAME = $settings_query['school_name'] ?? 'SMKN 1 Sukalarang';
$FOOTER_TEXT = $settings_query['footer_text'] ?? 'Simkuring v2.0 Enterprise';
$THEME_COLOR = $settings_query['theme_color'] ?? '#0d6efd';

// Path untuk gambar
$LOGO_FILE = !empty($settings_query['logo_file']) ? 'assets/' . $settings_query['logo_file'] : null;
$FAVICON_FILE = !empty($settings_query['favicon_file']) ? 'assets/' . $settings_query['favicon_file'] : null;
$BG_LOGIN = !empty($settings_query['bg_login']) ? 'assets/' . $settings_query['bg_login'] : null;
?>

--------------------------------------------------------
FILE: dashboard.php
--------------------------------------------------------
<?php
// require_once 'koneksi.php'; // Aktifkan ini nanti untuk query data riil
include 'header.php';
include 'sidebar.php';
?>

<div class="container-fluid">
    <div class="row mb-4">
        <div class="col-12">
            <h2 class="fw-bold">Dashboard Overview</h2>
            <p class="text-muted">Selamat datang di Panel Admin Penjadwalan Simkuring.</p>
        </div>
    </div>

    <div class="row g-4 mb-4">
        <div class="col-12 col-md-6 col-xl-3">
            <div class="card bg-primary text-white shadow-sm h-100 border-0">
                <div class="card-body d-flex align-items-center justify-content-between">
                    <div>
                        <h6 class="card-title text-uppercase text-white-50">Total Guru</h6>
                        <h2 class="mb-0 fw-bold">45</h2> </div>
                    <i class="fas fa-chalkboard-teacher fa-3x opacity-50"></i>
                </div>
            </div>
        </div>
        
        <div class="col-12 col-md-6 col-xl-3">
            <div class="card bg-success text-white shadow-sm h-100 border-0">
                <div class="card-body d-flex align-items-center justify-content-between">
                    <div>
                        <h6 class="card-title text-uppercase text-white-50">Ruangan Aktif</h6>
                        <h2 class="mb-0 fw-bold">24</h2>
                    </div>
                    <i class="fas fa-door-open fa-3x opacity-50"></i>
                </div>
            </div>
        </div>

        <div class="col-12 col-md-6 col-xl-3">
            <div class="card bg-warning text-dark shadow-sm h-100 border-0">
                <div class="card-body d-flex align-items-center justify-content-between">
                    <div>
                        <h6 class="card-title text-uppercase text-dark-50">Total Kelas</h6>
                        <h2 class="mb-0 fw-bold">36</h2>
                    </div>
                    <i class="fas fa-users fa-3x opacity-50"></i>
                </div>
            </div>
        </div>

        <div class="col-12 col-md-6 col-xl-3">
            <div class="card bg-danger text-white shadow-sm h-100 border-0">
                <div class="card-body d-flex align-items-center justify-content-between">
                    <div>
                        <h6 class="card-title text-uppercase text-white-50">Status Penjadwalan</h6>
                        <h3 class="mb-0 fw-bold">Selesai</h3>
                    </div>
                    <i class="fas fa-calendar-check fa-3x opacity-50"></i>
                </div>
            </div>
        </div>
    </div>

    <div class="row">
        <div class="col-12">
            <div class="card shadow-sm border-0">
                <div class="card-header bg-white fw-bold py-3">
                    <i class="fas fa-info-circle text-primary me-2"></i> Informasi Sistem
                </div>
                <div class="card-body">
                    <p>Sistem penjadwalan saat ini berada pada <strong>Tahap 1 (Pengujian Algoritma Greedy)</strong>. Pastikan master data telah terisi dengan benar sebelum melakukan proses <em>Generate Jadwal</em>.</p>
                </div>
            </div>
        </div>
    </div>
</div>

<?php include 'footer.php'; ?>

--------------------------------------------------------
FILE: koneksi.php
--------------------------------------------------------
<?php
$host = 'localhost';
$db   = 'n3gl4_simkuring'; // Ubah ini
$user = 'n3gl4_simkuring';    // Ubah ini
$pass = 'Ads081808000512';    // Ubah ini
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
    throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
?>

--------------------------------------------------------
FILE: sidebar.php
--------------------------------------------------------
<?php
$current_page = basename($_SERVER['PHP_SELF']);
$role = $_SESSION['role_simkuring']; 

require_once 'config_app.php'; // Memanggil identitas visual

// Daftar Deteksi Menu Aktif
$is_master_data = in_array($current_page, ['data_guru.php', 'data_ruangan.php', 'data_kelas.php', 'data_waktu.php', 'manajemen_akun.php', 'data_piket.php']);
$is_output_jadwal = in_array($current_page, ['index.php', 'jadwal_kelas.php', 'jadwal_guru.php']);
$is_alat_sistem = in_array($current_page, ['test_bot.php', 'pengaturan_sistem.php']);
$is_laporan = in_array($current_page, ['kehadiran_guru.php', 'laporan_kehadiran.php']);
?>

<nav id="sidebar" style="background-color: #212529;">
    <div class="sidebar-header text-center py-4" style="background-color: #1a1d20; border-bottom: 2px solid <?= $THEME_COLOR ?>;">
        
        <?php if(!empty($LOGO_FILE)): ?>
            <img src="<?= $LOGO_FILE ?>" alt="Logo" class="mb-2 shadow-sm" style="max-width: 85%; height: auto; max-height: 65px; object-fit: contain; background: rgba(255,255,255,0.05); padding: 5px; border-radius: 8px;">
        <?php else: ?>
            <div class="text-white rounded-circle d-inline-flex align-items-center justify-content-center mb-2 shadow-sm" style="width: 60px; height: 60px; background-color: <?= $THEME_COLOR ?>;">
                <i class="fas fa-calendar-alt fs-3"></i>
            </div>
        <?php endif; ?>
        
        <h5 class="mb-0 fw-bold mt-2" style="color: <?= $THEME_COLOR ?>;"><?= htmlspecialchars($APP_NAME) ?></h5>
        
        <small class="text-light text-opacity-75 d-block mt-1 fw-bold" style="letter-spacing: 0.5px;"><?= htmlspecialchars($SCHOOL_NAME) ?></small>
        
        <span class="badge bg-<?= $role == 'Admin' ? 'danger' : 'success' ?> mt-3 shadow-sm px-3 py-2"><i class="fas <?= $role == 'Admin' ? 'fa-user-shield' : 'fa-chalkboard-teacher' ?>"></i> <?= $role ?></span>
    </div>

    <ul class="list-unstyled components">
        <li class="<?= ($current_page == 'dashboard.php') ? 'active' : '' ?>">
            <a href="dashboard.php"><i class="fas fa-tachometer-alt"></i> Dashboard</a>
        </li>
        
        <?php if ($role == 'Admin'): ?>
            <li class="<?= $is_master_data ? 'active' : '' ?>">
                <a href="#masterDataMenu" data-bs-toggle="collapse" aria-expanded="<?= $is_master_data ? 'true' : 'false' ?>" class="dropdown-toggle">
                    <i class="fas fa-database"></i> Master Data
                </a>
                <ul class="collapse list-unstyled <?= $is_master_data ? 'show' : '' ?>" id="masterDataMenu">
                    <li class="<?= ($current_page == 'data_guru.php') ? 'bg-dark' : '' ?>"><a href="data_guru.php" class="<?= ($current_page == 'data_guru.php') ? 'text-white fw-bold' : '' ?>"><i class="fas fa-chalkboard-teacher"></i> Data Guru</a></li>
                    <li class="<?= ($current_page == 'data_ruangan.php') ? 'bg-dark' : '' ?>"><a href="data_ruangan.php" class="<?= ($current_page == 'data_ruangan.php') ? 'text-white fw-bold' : '' ?>"><i class="fas fa-door-open"></i> Data Ruangan</a></li>
                    <li class="<?= ($current_page == 'data_kelas.php') ? 'bg-dark' : '' ?>"><a href="data_kelas.php" class="<?= ($current_page == 'data_kelas.php') ? 'text-white fw-bold' : '' ?>"><i class="fas fa-users"></i> Data Kelas</a></li>
                    <li class="<?= ($current_page == 'data_waktu.php') ? 'bg-dark' : '' ?>"><a href="data_waktu.php" class="<?= ($current_page == 'data_waktu.php') ? 'text-white fw-bold' : '' ?>"><i class="fas fa-clock"></i> Sesi Waktu JP</a></li>
                    <li class="<?= ($current_page == 'data_piket.php') ? 'bg-dark' : '' ?>"><a href="data_piket.php" class="<?= ($current_page == 'data_piket.php') ? 'text-white fw-bold' : '' ?>"><i class="fas fa-user-shield"></i> Jadwal Guru Piket</a></li>
                    <li class="<?= ($current_page == 'manajemen_akun.php') ? 'bg-dark' : '' ?>"><a href="manajemen_akun.php" class="text-warning"><i class="fas fa-key"></i> Manajemen Akun</a></li>
                </ul>
            </li>
        <?php endif; ?>
        
        <?php if ($role == 'Guru'): ?>
            <li class="<?= ($current_page == 'profil_guru.php') ? 'active' : '' ?>">
                <a href="profil_guru.php"><i class="fas fa-user-edit"></i> Profil & Sandi Saya</a>
            </li>
        <?php endif; ?>
        
        <li class="<?= ($current_page == 'beban_mengajar.php') ? 'active' : '' ?>">
            <a href="beban_mengajar.php"><i class="fas fa-book"></i> <?= $role == 'Admin' ? 'Beban Mengajar' : 'Tugas Mengajar Saya' ?></a>
        </li>
        
        <li class="<?= $is_output_jadwal ? 'active' : '' ?>">
            <a href="#jadwalMenu" data-bs-toggle="collapse" aria-expanded="<?= $is_output_jadwal ? 'true' : 'false' ?>" class="dropdown-toggle">
                <i class="fas fa-calendar-check"></i> Output Jadwal
            </a>
            <ul class="collapse list-unstyled <?= $is_output_jadwal ? 'show' : '' ?>" id="jadwalMenu">
                <?php if ($role == 'Admin'): ?>
                    <li class="<?= ($current_page == 'index.php') ? 'bg-dark' : '' ?>"><a href="index.php" class="<?= ($current_page == 'index.php') ? 'text-white fw-bold' : '' ?>"><i class="fas fa-list"></i> Matriks Global AI</a></li>
                <?php endif; ?>
                <li class="<?= ($current_page == 'jadwal_kelas.php') ? 'bg-dark' : '' ?>"><a href="jadwal_kelas.php" class="<?= ($current_page == 'jadwal_kelas.php') ? 'text-white fw-bold' : '' ?>"><i class="fas fa-th"></i> Jadwal per Kelas</a></li>
                <li class="<?= ($current_page == 'jadwal_guru.php') ? 'bg-dark' : '' ?>"><a href="jadwal_guru.php" class="<?= ($current_page == 'jadwal_guru.php') ? 'text-white fw-bold' : '' ?>"><i class="fas fa-user-tie"></i> <?= $role == 'Admin' ? 'Jadwal per Guru' : 'Jadwal Saya' ?></a></li>
            </ul>
        </li>

        <li class="<?= $is_laporan ? 'active' : '' ?>">
            <a href="#laporanMenu" data-bs-toggle="collapse" aria-expanded="<?= $is_laporan ? 'true' : 'false' ?>" class="dropdown-toggle">
                <i class="fas fa-clipboard-list"></i> Laporan Kehadiran
            </a>
            <ul class="collapse list-unstyled <?= $is_laporan ? 'show' : '' ?>" id="laporanMenu">
                <?php if ($role == 'Admin' || $role == 'Kepala Jurusan'): ?>
                    <li class="<?= ($current_page == 'laporan_kehadiran.php') ? 'bg-dark' : '' ?>"><a href="laporan_kehadiran.php" class="<?= ($current_page == 'laporan_kehadiran.php') ? 'text-white fw-bold' : '' ?>"><i class="fas fa-file-signature"></i> Rekap Seluruh Guru</a></li>
                <?php endif; ?>
                
                <?php if ($role == 'Guru'): ?>
                    <li class="<?= ($current_page == 'kehadiran_guru.php') ? 'bg-dark' : '' ?>"><a href="kehadiran_guru.php" class="<?= ($current_page == 'kehadiran_guru.php') ? 'text-white fw-bold' : '' ?>"><i class="fas fa-user-check"></i> Riwayat Absen Saya</a></li>
                <?php endif; ?>
            </ul>
        </li>

        <?php if ($role == 'Admin'): ?>
            <li class="<?= $is_alat_sistem ? 'active' : '' ?>">
                <a href="#alatMenu" data-bs-toggle="collapse" aria-expanded="<?= $is_alat_sistem ? 'true' : 'false' ?>" class="dropdown-toggle">
                    <i class="fas fa-tools"></i> Alat & Ekosistem
                </a>
                <ul class="collapse list-unstyled <?= $is_alat_sistem ? 'show' : '' ?>" id="alatMenu">
                    <li class="<?= ($current_page == 'test_bot.php') ? 'bg-dark' : '' ?>"><a href="test_bot.php" class="<?= ($current_page == 'test_bot.php') ? 'text-white fw-bold' : '' ?>"><i class="fas fa-flask"></i> Uji Coba Bot Telegram</a></li>
                    <li><a href="display_tv.php" target="_blank" class="text-info fw-bold"><i class="fas fa-tv"></i> Buka Layar Smart TV <i class="fas fa-external-link-alt ms-1" style="font-size: 0.7rem;"></i></a></li>
                    <li class="<?= ($current_page == 'pengaturan_sistem.php') ? 'bg-dark' : '' ?>">
                        <a href="pengaturan_sistem.php" class="<?= ($current_page == 'pengaturan_sistem.php') ? 'text-white fw-bold' : '' ?>">
                            <i class="fas fa-cogs"></i> Pengaturan Sistem
                        </a>
                    </li>
                </ul>
            </li>
        <?php endif; ?>

        <li>
            <a href="https://simkuring.smkn1sukalarang.sch.id/info.html" target="_blank" style="color: <?= $THEME_COLOR ?>;" class="fw-bold">
                <i class="fas fa-info-circle"></i> Tentang Simkuring <i class="fas fa-external-link-alt ms-1" style="font-size: 0.7rem;"></i>
            </a>
        </li>
    </ul>

    <ul class="list-unstyled components mt-4 border-top border-secondary pt-3 border-opacity-25">
        <li>
            <a href="logout.php" class="text-danger fw-bold" onclick="return confirm('Anda yakin ingin keluar dari sistem?');">
                <i class="fas fa-sign-out-alt"></i> Keluar Sistem
            </a>
        </li>
    </ul>
</nav>

<div id="content">
    <nav class="navbar navbar-expand-lg navbar-light bg-white rounded shadow-sm mb-4 d-print-none border-bottom border-4" style="border-color: <?= $THEME_COLOR ?> !important;">
        <div class="container-fluid">
            <button type="button" id="sidebarCollapse" class="btn text-white fw-bold shadow-sm" style="background-color: <?= $THEME_COLOR ?>; border-color: <?= $THEME_COLOR ?>;"><i class="fas fa-bars"></i></button>
            <div class="d-flex align-items-center ms-auto">
                <span class="navbar-text fw-bold me-2 text-secondary d-none d-sm-inline">
                    Hai, <?= isset($_SESSION['nama_user']) ? htmlspecialchars($_SESSION['nama_user']) : 'User' ?>
                </span>
                <i class="fas fa-user-circle fs-3" style="color: <?= $THEME_COLOR ?>;"></i>
            </div>
        </div>
    </nav>

--------------------------------------------------------
FILE: login.php
--------------------------------------------------------
<?php
session_start();
require_once 'koneksi.php';
require_once 'config_app.php'; // Menarik Identitas Visual (Logo, Favicon, Warna)

// --- AUTO-DEPLOYMENT: Buat Tabel User jika belum ada ---
try {
    $pdo->query("CREATE TABLE IF NOT EXISTS master_users (
        id_user INT AUTO_INCREMENT PRIMARY KEY,
        username VARCHAR(50) UNIQUE,
        password VARCHAR(255),
        role ENUM('Admin', 'Guru'),
        id_guru INT NULL
    )");
    
    $cek_admin = $pdo->query("SELECT COUNT(*) FROM master_users")->fetchColumn();
    if ($cek_admin == 0) {
        $pass_hash = password_hash('admin123', PASSWORD_DEFAULT);
        $pdo->query("INSERT INTO master_users (username, password, role) VALUES ('admin', '$pass_hash', 'Admin')");
    }
} catch (Exception $e) {}

if (isset($_SESSION['login_simkuring'])) {
    header("Location: dashboard.php");
    exit;
}

$error = '';

if (isset($_POST['login'])) {
    $username = trim($_POST['username']);
    $password = $_POST['password'];

    $stmt = $pdo->prepare("SELECT * FROM master_users WHERE username = ?");
    $stmt->execute([$username]);
    $user = $stmt->fetch();

    if ($user && password_verify($password, $user['password'])) {
        $_SESSION['login_simkuring'] = true;
        $_SESSION['role_simkuring'] = $user['role'];
        $_SESSION['id_guru_simkuring'] = $user['id_guru'];
        
        if ($user['role'] == 'Guru') {
            $stmtNama = $pdo->prepare("SELECT nama_guru FROM master_guru WHERE id_guru = ?");
            $stmtNama->execute([$user['id_guru']]);
            $_SESSION['nama_user'] = $stmtNama->fetchColumn();
        } else {
            $_SESSION['nama_user'] = 'Administrator';
        }
        
        header("Location: dashboard.php");
        exit;
    } else {
        $error = 'Username atau Password salah!';
    }
}

// LOGIKA LATAR BELAKANG HALAMAN (Kosmetik)
$bg_style = "background: linear-gradient(135deg, #fdfbfb 0%, #ebedee 100%);";
if (!empty($BG_LOGIN)) {
    $bg_style = "background: url('$BG_LOGIN') no-repeat center center fixed; background-size: cover;";
}
?>
<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login - <?= htmlspecialchars($APP_NAME) ?></title>
    
    <?php if(!empty($FAVICON_FILE)): ?>
        <link rel="icon" type="image/png" href="<?= $FAVICON_FILE ?>">
    <?php elseif(!empty($LOGO_FILE)): ?>
        <link rel="icon" type="image/png" href="<?= $LOGO_FILE ?>">
    <?php endif; ?>
    
    <meta name="theme-color" content="<?= $THEME_COLOR ?>">
    
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <style>
        body { 
            <?= $bg_style ?> 
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; 
            position: relative; 
            min-height: 100vh; 
            display: flex; 
            align-items: center; 
            justify-content: center; 
            margin: 0;
        }
        
        /* Overlay Gelap Transparan di atas Foto Background */
        <?php if(!empty($BG_LOGIN)): ?>
        body::before { 
            content: ''; 
            position: absolute; 
            top: 0; left: 0; 
            width: 100%; height: 100%; 
            background: rgba(0, 0, 0, 0.4); /* Tingkat kegelapan overlay */
            z-index: 1; 
        }
        <?php endif; ?>

        /* DESAIN GLASSMORPHISM (Efek Kaca Transparan & Blur) */
        .login-card { 
            z-index: 2; 
            width: 100%; 
            max-width: 420px; 
            border-radius: 20px; 
            overflow: hidden; 
            
            /* Warna putih transparan */
            background: rgba(255, 255, 255, 0.35); 
            
            /* Efek Blur Background (Kaca Es) */
            backdrop-filter: blur(15px); 
            -webkit-backdrop-filter: blur(15px); 
            
            /* Garis tipis menyerupai pantulan kaca */
            border: 1px solid rgba(255, 255, 255, 0.6); 
            box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.2); 
        }

        .brand-logo-container { 
            width: 100px; 
            height: 100px; 
            margin: 0 auto; 
            display: flex; 
            align-items: center; 
            justify-content: center; 
            border-radius: 50%; 
            
            /* Lingkaran Logo Transparan */
            background: rgba(255, 255, 255, 0.5); 
            border: 1px solid rgba(255, 255, 255, 0.8);
            box-shadow: 0 5px 15px rgba(0,0,0,0.1); 
            padding: 15px; 
            margin-bottom: 20px; 
            margin-top: -15px; 
        }
        .brand-logo-container img { 
            max-width: 100%; 
            max-height: 100%; 
            object-fit: contain; 
        }

        /* Kolom Input Transparan */
        .input-group-text {
            background: rgba(255, 255, 255, 0.5) !important;
            border: 1px solid rgba(255, 255, 255, 0.6) !important;
            border-right: none !important;
            color: #495057 !important;
        }
        .form-control {
            background: rgba(255, 255, 255, 0.5) !important;
            border: 1px solid rgba(255, 255, 255, 0.6) !important;
            border-left: none !important;
            color: #212529 !important;
            font-weight: 600;
        }
        .form-control::placeholder {
            color: rgba(33, 37, 41, 0.6) !important;
            font-weight: normal;
        }
        .form-control:focus {
            background: rgba(255, 255, 255, 0.7) !important;
            box-shadow: 0 0 0 0.25rem rgba(255, 255, 255, 0.3) !important;
            border-color: rgba(255, 255, 255, 0.8) !important;
        }

        .btn-theme { 
            background-color: <?= $THEME_COLOR ?>; 
            border-color: <?= $THEME_COLOR ?>; 
            color: white; 
            transition: 0.3s; 
            border-radius: 10px;
        }
        .btn-theme:hover { 
            filter: brightness(0.85); 
            color: white; 
            transform: translateY(-2px);
            box-shadow: 0 5px 15px rgba(0,0,0,0.2);
        }

        .text-dark-custom { color: #212529 !important; }
    </style>
</head>
<body>

<div class="container p-3">
    <div class="card mx-auto login-card">
        <div class="card-body p-5">
            <div class="text-center mb-4">
                <div class="brand-logo-container">
                    <?php if (!empty($LOGO_FILE)): ?>
                        <img src="<?= $LOGO_FILE ?>" alt="Logo Sekolah">
                    <?php else: ?>
                        <i class="fas fa-school fs-2" style="color: <?= $THEME_COLOR ?>;"></i>
                    <?php endif; ?>
                </div>
                <h4 class="fw-bold mb-0" style="color: <?= $THEME_COLOR ?>; text-shadow: 0px 1px 2px rgba(255,255,255,0.5);"><?= htmlspecialchars($APP_NAME) ?></h4>
                <p class="text-dark-custom small fw-bold mt-1"><?= htmlspecialchars($SCHOOL_NAME) ?></p>
            </div>

            <?php if ($error): ?>
                <div class="alert alert-danger text-center small p-2 fw-bold" style="background: rgba(220, 53, 69, 0.8); color: white; border: none;"><i class="fas fa-exclamation-circle"></i> <?= $error ?></div>
            <?php endif; ?>

            <form action="login.php" method="POST">
                <div class="mb-3">
                    <label class="form-label text-dark-custom small fw-bold">Username</label>
                    <div class="input-group shadow-sm" style="border-radius: 8px; overflow: hidden;">
                        <span class="input-group-text"><i class="fas fa-user"></i></span>
                        <input type="text" name="username" class="form-control" placeholder="Masukkan username" required>
                    </div>
                </div>
                <div class="mb-4">
                    <label class="form-label text-dark-custom small fw-bold">Password</label>
                    <div class="input-group shadow-sm" style="border-radius: 8px; overflow: hidden;">
                        <span class="input-group-text"><i class="fas fa-lock"></i></span>
                        <input type="password" name="password" class="form-control" placeholder="Masukkan sandi" required>
                    </div>
                </div>
                <button type="submit" name="login" class="btn btn-theme w-100 fw-bold py-2 fs-5 shadow-sm mt-2">
                    <i class="fas fa-sign-in-alt me-2"></i> MASUK SISTEM
                </button>
            </form>
        
            <div class="text-center mt-4 pt-3 border-top" style="border-color: rgba(0,0,0,0.1) !important;">
                <small class="text-dark-custom fw-bold" style="font-size: 0.7rem;"><?= htmlspecialchars($FOOTER_TEXT) ?> &copy; <?= date('Y') ?><br>
                     <a href="https://simkuring.smkn1sukalarang.sch.id/info.html" target="_blank" style="color: <?= $THEME_COLOR ?>;" class="fw-bold text-decoration-none mt-2 d-inline-block">
                <i class="fas fa-info-circle me-1"></i> Tentang Simkuring <i class="fas fa-external-link-alt ms-1" style="font-size: 0.65rem;"></i>
            </a></small>
            </div>
        </div>
    </div>
</div>

</body>
</html>

--------------------------------------------------------
FILE: form_izin.php
--------------------------------------------------------
<?php
date_default_timezone_set('Asia/Jakarta');
require_once 'koneksi.php';

// Buat folder untuk menampung file tugas jika belum ada
if (!file_exists('uploads/tugas')) { mkdir('uploads/tugas', 0755, true); }

$id_jadwal = isset($_GET['jdwl']) ? (int)$_GET['jdwl'] : 0;
$token_masuk = isset($_GET['token']) ? $_GET['token'] : '';
$tanggal_hari_ini = date('Y-m-d');

// Deteksi otomatis jika ini adalah Mode Uji Coba dari Admin (jdwl = 0 atau parameter tes = 1)
$is_tes = (isset($_GET['tes']) && $_GET['tes'] == '1') || $id_jadwal == 0 ? 1 : 0;

$izin_akses = false;
$guru_aktif = null;

$hari_indonesia = ['Monday'=>'Senin', 'Tuesday'=>'Selasa', 'Wednesday'=>'Rabu', 'Thursday'=>'Kamis', 'Friday'=>'Jumat', 'Saturday'=>'Sabtu', 'Sunday'=>'Minggu'];
$hari_ini_indo = $hari_indonesia[date('l')];

// --- VALIDASI TOKEN & AMBIL IDENTITAS GURU ---
if ($is_tes == 1) {
    // 1. KONDISI KHUSUS UJI COBA (Bypass Jadwal Asli)
    $sql_all_guru = "SELECT id_guru, nama_guru, telegram_chat_id FROM master_guru WHERE telegram_chat_id IS NOT NULL";
    $stmtAll = $pdo->query($sql_all_guru);
    $semua_guru = $stmtAll->fetchAll();

    foreach ($semua_guru as $g) {
        $token_asli = md5($id_jadwal . $g['telegram_chat_id'] . date('Ymd'));
        if ($token_masuk === $token_asli) {
            $izin_akses = true;
            $guru_aktif = [
                'id_guru' => $g['id_guru'], 
                'nama_guru' => $g['nama_guru'], 
                'telegram_chat_id' => $g['telegram_chat_id'],
                'nama_mapel' => 'Tes Smart Routing Piket', 
                'nama_kelas' => 'Mode Simulasi (Admin)',
                'hari' => $hari_ini_indo, 
                'jp_mulai' => 1, 
                'batas_masuk' => date('H:i:s') // Set jam sekarang agar pasti ketemu jadwal piket
            ];
            break;
        }
    }
} else {
    // 2. KONDISI NORMAL JADWAL ASLI
    $sql = "SELECT j.id_jadwal, g.id_guru, g.nama_guru, g.telegram_chat_id, b.nama_mapel, k.nama_kelas, j.hari, j.jp_mulai, w1.jam_mulai as batas_masuk
            FROM jadwal_pelajaran j 
            JOIN beban_mengajar b ON j.id_beban = b.id_beban 
            JOIN master_kelas k ON b.id_kelas = k.id_kelas 
            JOIN beban_mengajar_guru bg ON b.id_beban = bg.id_beban 
            JOIN master_guru g ON bg.id_guru = g.id_guru 
            LEFT JOIN master_waktu_jp w1 ON j.jp_mulai = w1.urutan_jp
            WHERE j.id_jadwal = ?";
    $stmt = $pdo->prepare($sql); 
    $stmt->execute([$id_jadwal]);
    $data_jadwal = $stmt->fetchAll();

    foreach ($data_jadwal as $dj) {
        $token_asli = md5($dj['id_jadwal'] . $dj['telegram_chat_id'] . date('Ymd'));
        if ($token_masuk === $token_asli) { $izin_akses = true; $guru_aktif = $dj; break; }
    }
}

// BLOKIR JIKA TOKEN SALAH / KEDALUWARSA
if (!$izin_akses) {
    die("<!DOCTYPE html><html><head><meta name='viewport' content='width=device-width, initial-scale=1'><title>Akses Ditolak</title><link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'></head><body class='bg-light d-flex align-items-center justify-content-center vh-100'><div class='text-center'><h1 class='text-danger fw-bold'>❌ Akses Ditolak</h1><p class='text-muted'>Tautan ini tidak valid atau telah kedaluwarsa.</p></div></body></html>");
}

// BLOKIR JIKA SUDAH MELAPORKAN KEHADIRAN (DIABAIKAN JIKA MODE TES)
if ($is_tes == 0) {
    $stmtCekAbsen = $pdo->prepare("SELECT id_kehadiran FROM jurnal_kehadiran WHERE id_jadwal = ? AND id_guru = ? AND tanggal = ? AND is_tes = 0");
    $stmtCekAbsen->execute([$id_jadwal, $guru_aktif['id_guru'], $tanggal_hari_ini]);
    if ($stmtCekAbsen->rowCount() > 0) {
        die("<!DOCTYPE html><html><head><meta name='viewport' content='width=device-width, initial-scale=1'><title>Sudah Lapor</title><link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'><link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css'></head><body class='bg-light d-flex align-items-center justify-content-center vh-100'><div class='text-center p-4'><div class='text-success mb-3'><i class='fas fa-check-circle fa-4x'></i></div><h3 class='fw-bold text-dark'>Telah Diproses</h3><p class='text-muted'>Anda sudah melaporkan status untuk sesi jadwal ini.</p></div></body></html>");
    }
}

// =========================================================
// PROSES UPLOAD TUGAS & SMART ROUTING KE GURU PIKET
// =========================================================
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['alasan_izin'])) {
    $alasan_izin = trim($_POST['alasan_izin']);
    $instruksi_tugas = trim($_POST['instruksi_tugas']);
    $keterangan_full = "[$alasan_izin] " . $instruksi_tugas;
    
    if ($is_tes == 1) { $keterangan_full = "[MODE TES] " . $keterangan_full; }
    
    $nama_file_baru = null; $sukses_upload = true;

    if (isset($_FILES['file_tugas']) && $_FILES['file_tugas']['error'] == 0) {
        $file_tmp = $_FILES['file_tugas']['tmp_name'];
        $file_name = $_FILES['file_tugas']['name'];
        $file_size = $_FILES['file_tugas']['size'];
        $file_ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
        $allowed_ext = ['pdf', 'doc', 'docx', 'jpg', 'jpeg', 'png'];
        
        if (in_array($file_ext, $allowed_ext)) {
            if ($file_size <= 5242880) { // Maks 5MB
                $prefix = $is_tes ? 'TESTUGAS_' : 'TUGAS_';
                $nama_file_baru = $prefix . date('YmdHi') . '_' . $guru_aktif['id_guru'] . '_' . $id_jadwal . '.' . $file_ext;
                $path_simpan = 'uploads/tugas/' . $nama_file_baru;
                if (!move_uploaded_file($file_tmp, $path_simpan)) { $sukses_upload = false; $error_msg = "Gagal menyimpan file tugas."; }
            } else { $sukses_upload = false; $error_msg = "Ukuran file terlalu besar. Maksimal 5MB."; }
        } else { $sukses_upload = false; $error_msg = "Format file tidak diizinkan."; }
    }

    if ($sukses_upload) {
        // 1. Simpan Izin ke Database
        $stmtInsert = $pdo->prepare("INSERT INTO jurnal_kehadiran (id_jadwal, id_guru, tanggal, waktu_absen, status, is_tes, keterangan_izin, file_tugas) VALUES (?, ?, ?, ?, 'Tidak Hadir', ?, ?, ?)");
        $stmtInsert->execute([$id_jadwal, $guru_aktif['id_guru'], $tanggal_hari_ini, date('H:i:s'), $is_tes, $keterangan_full, $nama_file_baru]);
        
        // =============================================================
        // 2. MESIN SMART ROUTING TELEGRAM (FORWARD KE GURU PIKET)
        // =============================================================
        $botToken = "8899680546:AAGLczYc6FG-smYvDYL5yp3AUzNwhf-tOXM";
        $apiUrlTg = "https://api.telegram.org/bot" . $botToken;
        
        $jam_mulai_kelas = $guru_aktif['batas_masuk'];
        $hari_kelas = $guru_aktif['hari'];
        
        // Cari Guru Piket yang jam jaganya bersinggungan dengan jam mulai kelas
        $sql_piket = "SELECT g.telegram_chat_id, g.nama_guru 
                      FROM jadwal_piket p 
                      JOIN master_guru g ON p.id_guru = g.id_guru 
                      WHERE p.hari = ? AND p.jam_mulai <= ? AND p.jam_selesai >= ? 
                      ORDER BY p.jam_mulai ASC LIMIT 1";
        $stmtPiket = $pdo->prepare($sql_piket);
        $stmtPiket->execute([$hari_kelas, $jam_mulai_kelas, $jam_mulai_kelas]);
        $guru_piket = $stmtPiket->fetch();
        
        $nama_piket_bertugas = "Belum Ada (Menunggu Penugasan Manual)";
        if ($guru_piket && !empty($guru_piket['telegram_chat_id'])) {
            $nama_piket_bertugas = $guru_piket['nama_guru'];
            
            $header_pesan = $is_tes ? "🧪 <b>[UJI COBA] TUGAS PIKET</b> 🧪\n\n" : "🚨 <b>INFO KELAS KOSONG & TUGAS PIKET</b> 🚨\n\n";
            $pesanPiket = $header_pesan;
            $pesanPiket .= "Bapak/Ibu <b>" . htmlspecialchars($guru_piket['nama_guru']) . "</b>, Anda bertugas sebagai Guru Piket saat ini.\n\n";
            $pesanPiket .= "Terdapat kelas kosong dengan detail:\n";
            $pesanPiket .= "👨‍🏫 <b>Guru:</b> " . htmlspecialchars($guru_aktif['nama_guru']) . " ($alasan_izin)\n";
            $pesanPiket .= "👥 <b>Kelas:</b> " . htmlspecialchars($guru_aktif['nama_kelas']) . "\n";
            $pesanPiket .= "📚 <b>Mapel:</b> " . htmlspecialchars($guru_aktif['nama_mapel']) . "\n";
            $pesanPiket .= "⏰ <b>Waktu Mulai:</b> " . substr($jam_mulai_kelas, 0, 5) . " WIB\n\n";
            $pesanPiket .= "📝 <b>Instruksi dari Guru:</b>\n<i>\"" . htmlspecialchars($instruksi_tugas) . "\"</i>\n";
            
            $replyMarkupTg = null;
            if ($nama_file_baru) {
                $linkDownload = "https://simkuring.smkn1sukalarang.sch.id/uploads/tugas/" . $nama_file_baru;
                $pesanPiket .= "\n📎 <b>Terdapat File Modul/Tugas</b>, silakan unduh melalui tombol di bawah.";
                $replyMarkupTg = json_encode([
                    'inline_keyboard' => [[ ['text' => '📥 Unduh File Tugas Kelas', 'url' => $linkDownload] ]]
                ]);
            }
            
            $dataTg = ['chat_id' => $guru_piket['telegram_chat_id'], 'text' => $pesanPiket, 'parse_mode' => 'HTML'];
            if ($replyMarkupTg) { $dataTg['reply_markup'] = $replyMarkupTg; }
            
            @file_get_contents($apiUrlTg . "/sendMessage?" . http_build_query($dataTg));
        }
        
        $berhasil = true;
    }
}
?>

<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>Formulir Izin & Penugasan - Simkuring</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <style>
        body { background-color: #f4f6f9; font-family: sans-serif; }
        .input-group-text { background-color: #fff; }
        .file-upload-wrapper { position: relative; width: 100%; border: 2px dashed #adb5bd; border-radius: 10px; padding: 20px; text-align: center; background: #fff; cursor: pointer; transition: 0.3s; }
        .file-upload-wrapper:hover { border-color: #0d6efd; background: #f8f9fa; }
        .file-upload-wrapper input[type="file"] { position: absolute; left: 0; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; }
        .jurnal-input { border-radius: 10px; resize: none; background: #fff; font-size: 0.95rem; }
    </style>
</head>
<body>
<div class="container py-4">
    <?php if (isset($berhasil)): ?>
        <div class="text-center mt-5 pt-4">
            <div class="bg-success text-white rounded-circle d-inline-flex align-items-center justify-content-center mb-3 shadow-lg" style="width: 90px; height: 90px;">
                <i class="fas fa-paper-plane fa-3x"></i>
            </div>
            <h2 class="fw-bold text-dark">Tugas Terkirim!</h2>
            <p class="text-muted fs-6 mt-2">Terima kasih, Bapak/Ibu <b><?= htmlspecialchars($guru_aktif['nama_guru']) ?></b>.<br>Tugas mandiri dan keterangan izin Anda telah direkam.</p>
            
            <?php if($is_tes): ?>
                <div class="alert alert-warning mt-3 fw-bold shadow-sm">
                    <i class="fas fa-flask me-2"></i> Mode Uji Coba. Anda bebas mengirim form ini berkali-kali.
                </div>
            <?php endif; ?>

            <div class="alert alert-info mt-4 text-start shadow-sm border-0">
                <h6 class="fw-bold mb-2"><i class="fas fa-robot me-2"></i>Status Smart Routing</h6>
                <p class="small mb-2">Sistem telah memindai jadwal piket pada jam kelas Anda. Instruksi dan file Anda otomatis diteruskan ke:</p>
                <div class="bg-white p-2 rounded border fw-bold text-primary"><i class="fas fa-user-shield me-2"></i> Bapak/Ibu <?= htmlspecialchars($nama_piket_bertugas) ?></div>
            </div>
            
            <p class="text-muted small mt-4 fw-bold">
                Semoga urusan Bapak/Ibu dilancarkan.<br>Silakan tutup halaman ini (X) untuk kembali ke Telegram.
            </p>
        </div>
    <?php else: ?>
        <div class="card border-0 shadow-lg" style="border-radius: 15px; overflow:hidden;">
            <div class="card-header <?= $is_tes ? 'bg-danger' : 'bg-warning text-dark' ?> text-center py-3 border-0">
                <h5 class="mb-0 fw-bold <?= $is_tes ? 'text-white' : '' ?>"><i class="fas fa-clipboard-list me-2"></i> Penugasan Mandiri <?= $is_tes ? '(UJI COBA)' : '' ?></h5>
            </div>
            <div class="card-body p-4">
                <div class="text-center mb-4 pb-2 border-bottom">
                    <h6 class="fw-bold text-dark mb-1"><?= htmlspecialchars($guru_aktif['nama_guru']) ?></h6>
                    <span class="badge bg-dark fs-6 mb-2"><?= htmlspecialchars($guru_aktif['nama_kelas']) ?></span>
                    <p class="text-muted small fw-bold mb-0"><?= htmlspecialchars($guru_aktif['nama_mapel']) ?></p>
                </div>
                
                <?php if(isset($error_msg)): ?>
                    <div class="alert alert-danger small py-2 fw-bold text-center"><i class="fas fa-exclamation-triangle"></i> <?= $error_msg ?></div>
                <?php endif; ?>
                
                <form id="formTugas" method="POST" enctype="multipart/form-data">
                    <div class="mb-3">
                        <label class="form-label fw-bold text-secondary small"><i class="fas fa-info-circle me-1"></i> Status Berhalangan</label>
                        <select name="alasan_izin" class="form-select border-warning shadow-sm" required>
                            <option value="">-- Pilih Alasan --</option>
                            <option value="Sakit">Sakit</option>
                            <option value="Dinas Luar">Tugas Dinas Luar / Rapat</option>
                            <option value="Izin Penting">Izin Keperluan Mendesak</option>
                        </select>
                    </div>

                    <div class="mb-3">
                        <label class="form-label fw-bold text-secondary small"><i class="fas fa-pen-alt me-1"></i> Instruksi untuk Guru Piket</label>
                        <textarea class="form-control jurnal-input p-3 shadow-sm" name="instruksi_tugas" rows="4" placeholder="Ketik pesan untuk guru piket... Contoh: Tolong awasi anak-anak mengerjakan soal di PDF terlampir. Dikumpulkan di meja saya." required></textarea>
                    </div>

                    <div class="mb-4">
                        <label class="form-label fw-bold text-secondary small"><i class="fas fa-paperclip me-1"></i> Lampirkan File Modul / Soal (Opsional)</label>
                        <div class="file-upload-wrapper shadow-sm" id="uploadArea">
                            <i class="fas fa-cloud-upload-alt fa-3x text-secondary mb-2" id="uploadIcon"></i>
                            <h6 class="fw-bold mb-1" id="uploadText">Ketuk untuk Memilih File</h6>
                            <p class="text-muted small mb-0">Format: PDF, Word, atau Foto. Maks 5MB.</p>
                            <input type="file" id="inputFile" name="file_tugas" accept=".pdf,.doc,.docx,.jpg,.jpeg,.png">
                        </div>
                    </div>
                    
                    <button type="submit" id="btnSubmit" class="btn <?= $is_tes ? 'btn-danger text-white' : 'btn-warning text-dark' ?> w-100 py-3 fw-bold fs-5 shadow-sm mt-2">
                        <i class="fas fa-share-square me-2"></i> Teruskan ke Guru Piket
                    </button>
                </form>
            </div>
        </div>
    <?php endif; ?>
</div>

<script>
    const inputFile = document.getElementById('inputFile');
    const uploadText = document.getElementById('uploadText');
    const uploadIcon = document.getElementById('uploadIcon');
    const formTugas = document.getElementById('formTugas');
    const btnSubmit = document.getElementById('btnSubmit');

    inputFile.addEventListener('change', function(e) {
        if (e.target.files && e.target.files.length > 0) {
            const fileName = e.target.files[0].name;
            const fileSize = (e.target.files[0].size / 1024 / 1024).toFixed(2);
            uploadText.innerHTML = '<span class="text-primary">' + fileName + '</span>';
            uploadText.nextElementSibling.innerHTML = 'Ukuran: ' + fileSize + ' MB';
            uploadIcon.className = 'fas fa-file-check fa-3x text-success mb-2';
            document.getElementById('uploadArea').style.borderColor = '#198754';
        }
    });

    if (formTugas) {
        formTugas.addEventListener('submit', function() {
            btnSubmit.disabled = true;
            btnSubmit.innerHTML = '<i class="fas fa-spinner fa-spin me-2"></i> Mengunggah Tugas...';
        });
    }
</script>
</body>
</html>

--------------------------------------------------------
FILE: laporan_kehadiran.php
--------------------------------------------------------
<?php
if (session_status() === PHP_SESSION_NONE) { session_start(); }
date_default_timezone_set('Asia/Jakarta');
require_once 'koneksi.php';

if (!isset($_SESSION['role_simkuring']) || !in_array($_SESSION['role_simkuring'], ['Admin', 'Kepala Jurusan'])) {
    header("Location: dashboard.php"); exit;
}

// ==========================================
// 1. FILTER DAN VARIABEL TANGGAL
// ==========================================
$start_date = isset($_GET['start_date']) ? $_GET['start_date'] : date('Y-m-d', strtotime('monday this week'));
$end_date   = isset($_GET['end_date']) ? $_GET['end_date'] : date('Y-m-d', strtotime('friday this week'));
$filter_guru = isset($_GET['id_guru']) ? $_GET['id_guru'] : 'all';
$filter_kelas = isset($_GET['id_kelas']) ? $_GET['id_kelas'] : 'all';

$hari_indonesia = ['Monday'=>'Senin', 'Tuesday'=>'Selasa', 'Wednesday'=>'Rabu', 'Thursday'=>'Kamis', 'Friday'=>'Jumat', 'Saturday'=>'Sabtu', 'Sunday'=>'Minggu'];
$total_sesi_terjadwal = 0;
$period = new DatePeriod(new DateTime($start_date), new DateInterval('P1D'), (new DateTime($end_date))->modify('+1 day'));

foreach ($period as $dt) {
    $nama_hari = $hari_indonesia[$dt->format('l')];
    $sql_jadwal = "SELECT COUNT(j.id_jadwal) FROM jadwal_pelajaran j 
                   JOIN beban_mengajar b ON j.id_beban = b.id_beban
                   JOIN beban_mengajar_guru bg ON b.id_beban = bg.id_beban
                   WHERE j.hari = '$nama_hari'";
    
    if ($filter_guru != 'all') $sql_jadwal .= " AND bg.id_guru = " . (int)$filter_guru;
    if ($filter_kelas != 'all') $sql_jadwal .= " AND b.id_kelas = " . (int)$filter_kelas;
    
    $total_sesi_terjadwal += $pdo->query($sql_jadwal)->fetchColumn();
}

// Menghitung Sesi Hadir
$sql_hadir = "SELECT COUNT(h.id_kehadiran) FROM jurnal_kehadiran h
              JOIN jadwal_pelajaran j ON h.id_jadwal = j.id_jadwal
              JOIN beban_mengajar b ON j.id_beban = b.id_beban
              WHERE h.tanggal BETWEEN ? AND ? AND h.is_tes = 0 AND h.status = 'Hadir'";
$params_hadir = [$start_date, $end_date];
if ($filter_guru != 'all') { $sql_hadir .= " AND h.id_guru = ?"; $params_hadir[] = $filter_guru; }
if ($filter_kelas != 'all') { $sql_hadir .= " AND b.id_kelas = ?"; $params_hadir[] = $filter_kelas; }

$stmtHadir = $pdo->prepare($sql_hadir); $stmtHadir->execute($params_hadir);
$total_sesi_hadir = $stmtHadir->fetchColumn();

// Menghitung Sesi Izin
$sql_izin = str_replace("status = 'Hadir'", "status = 'Tidak Hadir'", $sql_hadir);
$stmtIzin = $pdo->prepare($sql_izin); $stmtIzin->execute($params_hadir);
$total_sesi_izin = $stmtIzin->fetchColumn();

$total_alpha = $total_sesi_terjadwal - ($total_sesi_hadir + $total_sesi_izin);
if ($total_alpha < 0) $total_alpha = 0;

$persen_hadir = ($total_sesi_terjadwal > 0) ? round(($total_sesi_hadir / $total_sesi_terjadwal) * 100, 1) : 0;
$persen_izin  = ($total_sesi_terjadwal > 0) ? round(($total_sesi_izin / $total_sesi_terjadwal) * 100, 1) : 0;
$persen_alpha = ($total_sesi_terjadwal > 0) ? round(($total_alpha / $total_sesi_terjadwal) * 100, 1) : 0;

// ==========================================
// 2. QUERY PENARIKAN DATA LAPORAN (Menyertakan Jurnal & Keterangan Izin)
// ==========================================
$sql_tabel = "SELECT h.*, g.nama_guru, b.nama_mapel, k.nama_kelas, j.jp_mulai, j.jp_selesai, j.hari
              FROM jurnal_kehadiran h
              JOIN master_guru g ON h.id_guru = g.id_guru
              JOIN jadwal_pelajaran j ON h.id_jadwal = j.id_jadwal
              JOIN beban_mengajar b ON j.id_beban = b.id_beban
              JOIN master_kelas k ON b.id_kelas = k.id_kelas
              WHERE h.tanggal BETWEEN ? AND ? AND h.is_tes = 0";

$params_tabel = [$start_date, $end_date];
if ($filter_guru != 'all') { $sql_tabel .= " AND h.id_guru = ?"; $params_tabel[] = $filter_guru; }
if ($filter_kelas != 'all') { $sql_tabel .= " AND b.id_kelas = ?"; $params_tabel[] = $filter_kelas; }

$sql_tabel .= " ORDER BY h.tanggal DESC, h.waktu_absen DESC";
$stmtTabel = $pdo->prepare($sql_tabel);
$stmtTabel->execute($params_tabel);
$data_laporan = $stmtTabel->fetchAll();

$list_guru = $pdo->query("SELECT id_guru, nama_guru FROM master_guru ORDER BY nama_guru ASC")->fetchAll();
$list_kelas = $pdo->query("SELECT id_kelas, nama_kelas FROM master_kelas ORDER BY nama_kelas ASC")->fetchAll();

include 'header.php';
include 'sidebar.php';
?>

<style>
    .card-clean { background: #fff; border: none; border-radius: 12px; box-shadow: 0 4px 12px rgba(0,0,0,0.05); margin-bottom: 20px; }
    .form-control-clean { background-color: #f8f9fa; border: 1px solid #ced4da; border-radius: 8px; font-weight: 500; }
    .stat-card { border-radius: 12px; padding: 20px; color: white; display: flex; flex-direction: column; justify-content: center; position: relative; overflow: hidden; height: 120px; }
    .stat-card i { position: absolute; right: -15px; bottom: -20px; font-size: 6rem; opacity: 0.15; }
    .stat-num { font-size: 2.5rem; font-weight: 900; line-height: 1; z-index: 2; }
    .stat-label { font-size: 0.85rem; font-weight: 700; text-transform: uppercase; z-index: 2; margin-top: 8px; letter-spacing: 0.5px; opacity: 0.9; }
    .table-clean thead th { background-color: #f8f9fa; color: #495057; font-weight: 700; border-bottom: 2px solid #dee2e6; padding: 12px; text-align: center; vertical-align: middle; text-transform: uppercase; font-size: 0.85rem; }
    .table-clean tbody td { vertical-align: middle; padding: 10px 12px; border-bottom: 1px solid #f1f3f5; color: #343a40; font-size: 0.9rem; }
    .photo-thumb { width: 55px; height: 55px; object-fit: cover; border-radius: 8px; border: 2px solid #e9ecef; cursor: pointer; transition: transform 0.2s; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }
    .photo-thumb:hover { transform: scale(1.3); border-color: #0d6efd; z-index: 10; position: relative; }
    .btn-gps { font-size: 0.75rem; font-weight: bold; padding: 4px 10px; border-radius: 6px; text-decoration: none; display: inline-block; }
    @keyframes blink { 0% {opacity: 1;} 50% {opacity: 0.3;} 100% {opacity: 1;} }
</style>

<div class="container-fluid p-4 bg-light min-vh-100">
    <div class="d-flex justify-content-between align-items-center mb-4">
        <div>
            <h2 class="fw-bold mb-1"><i class="fas fa-clipboard-list text-primary me-2"></i> Rekapitulasi Mengajar</h2>
            <p class="text-muted mb-0">Analisis presensi berbasis Sesi dan Laporan Jurnal / Keterangan Izin Guru.</p>
        </div>
        <button class="btn btn-dark shadow-sm fw-bold px-4" onclick="window.print()"><i class="fas fa-print me-2"></i> Cetak Laporan</button>
    </div>

    <div class="card card-clean d-print-none border-top border-primary border-4">
        <div class="card-body p-4">
            <form method="GET" action="laporan_kehadiran.php">
                <div class="row g-3">
                    <div class="col-md-2">
                        <label class="small fw-bold text-muted mb-1">Dari Tanggal</label>
                        <input type="date" class="form-control form-control-clean" name="start_date" value="<?= $start_date ?>" required>
                    </div>
                    <div class="col-md-2">
                        <label class="small fw-bold text-muted mb-1">Sampai Tanggal</label>
                        <input type="date" class="form-control form-control-clean" name="end_date" value="<?= $end_date ?>" required>
                    </div>
                    <div class="col-md-3">
                        <label class="small fw-bold text-muted mb-1">Filter Guru</label>
                        <select name="id_guru" class="form-select form-control-clean">
                            <option value="all">Semua Guru</option>
                            <?php foreach ($list_guru as $g): ?>
                                <option value="<?= $g['id_guru'] ?>" <?= ($filter_guru == $g['id_guru']) ? 'selected' : '' ?>><?= htmlspecialchars($g['nama_guru']) ?></option>
                            <?php endforeach; ?>
                        </select>
                    </div>
                    <div class="col-md-3">
                        <label class="small fw-bold text-muted mb-1">Filter Kelas / Jurusan</label>
                        <select name="id_kelas" class="form-select form-control-clean">
                            <option value="all">Semua Kelas</option>
                            <?php foreach ($list_kelas as $k): ?>
                                <option value="<?= $k['id_kelas'] ?>" <?= ($filter_kelas == $k['id_kelas']) ? 'selected' : '' ?>><?= htmlspecialchars($k['nama_kelas']) ?></option>
                            <?php endforeach; ?>
                        </select>
                    </div>
                    <div class="col-md-2 d-flex align-items-end">
                        <button type="submit" class="btn btn-primary w-100 fw-bold shadow-sm py-2"><i class="fas fa-search me-1"></i> Terapkan</button>
                    </div>
                </div>
            </form>
        </div>
    </div>

    <div class="row g-3 mb-4">
        <div class="col-md-3">
            <div class="stat-card bg-secondary shadow-sm">
                <i class="fas fa-calendar-check"></i>
                <div class="stat-num"><?= $total_sesi_terjadwal ?></div>
                <div class="stat-label">Total Sesi Terjadwal</div>
            </div>
        </div>
        <div class="col-md-3">
            <div class="stat-card bg-success shadow-sm">
                <i class="fas fa-chalkboard-teacher"></i>
                <div class="stat-num"><?= $persen_hadir ?>%</div>
                <div class="stat-label">Kehadiran (<?= $total_sesi_hadir ?> Sesi)</div>
            </div>
        </div>
        <div class="col-md-3">
            <div class="stat-card bg-info text-dark shadow-sm">
                <i class="fas fa-envelope-open-text"></i>
                <div class="stat-num"><?= $persen_izin ?>%</div>
                <div class="stat-label">Izin / Sakit (<?= $total_sesi_izin ?> Sesi)</div>
            </div>
        </div>
        <div class="col-md-3">
            <div class="stat-card bg-danger shadow-sm">
                <i class="fas fa-times-circle"></i>
                <div class="stat-num"><?= $persen_alpha ?>%</div>
                <div class="stat-label">Alpha / Kosong (<?= $total_alpha ?> Sesi)</div>
            </div>
        </div>
    </div>

    <div class="card card-clean border-0 shadow-sm">
        <div class="card-body p-0">
            <div class="table-responsive">
                <table class="table table-clean mb-0 table-hover">
                    <thead>
                        <tr>
                            <th width="4%">No</th>
                            <th width="10%">Hari, Tanggal</th>
                            <th width="18%">Nama Guru</th>
                            <th width="15%">Mapel & Kelas</th>
                            <th width="12%">Waktu & Lokasi (GPS)</th>
                            <th width="8%">Foto</th>
                            <th width="33%">Status Kehadiran & Laporan / Instruksi Tugas</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php if (empty($data_laporan)): ?>
                            <tr><td colspan="7" class="text-center py-5 text-muted fw-bold">Tidak ada data kehadiran pada kriteria ini.</td></tr>
                        <?php else: ?>
                            <?php $no = 1; foreach ($data_laporan as $row): 
                                $tgl = date('d/m/Y', strtotime($row['tanggal']));
                                $hari = htmlspecialchars($row['hari']);
                                
                                $is_hadir = ($row['status'] == 'Hadir');
                                
                                $lat = $row['latitude']; $lon = $row['longitude'];
                                $lokasi_html = '<span class="text-muted small">-</span>';
                                
                                if ($is_hadir && !empty($lat) && !empty($lon) && $lat != 'NULL') {
                                    $url_maps = "https://maps.google.com/maps?q={$lat},{$lon}";
                                    $is_fake = ($lat == '0.00000000' || $lat == '0' || $lat == '');
                                    $lat_s = substr($lat, 0, 7); $lon_s = substr($lon, 0, 8);
                                    
                                    if ($is_fake) {
                                        $lokasi_html = "<a href='$url_maps' target='_blank' class='btn btn-outline-danger btn-gps mt-1 w-100'><i class='fas fa-radiation-alt'></i> LOKASI INVALID</a>";
                                    } else {
                                        $lokasi_html = "<a href='$url_maps' target='_blank' class='btn btn-outline-success btn-gps mt-1 w-100'><i class='fas fa-map-marker-alt me-1'></i>$lat_s, $lon_s</a>";
                                    }
                                }
                            ?>
                            <tr>
                                <td class="text-center text-muted"><?= $no++ ?></td>
                                <td><div class="fw-bold text-dark"><?= $tgl ?></div><small class="text-muted"><?= $hari ?></small></td>
                                <td><span class="fw-bold text-primary"><?= htmlspecialchars($row['nama_guru']) ?></span></td>
                                <td>
                                    <div class="fw-bold text-dark mb-1"><?= htmlspecialchars($row['nama_mapel']) ?></div>
                                    <span class="badge bg-light text-dark border"><i class="fas fa-users text-secondary me-1"></i> <?= htmlspecialchars($row['nama_kelas']) ?></span>
                                </td>
                                <td class="text-center">
                                    <?php if ($is_hadir): ?>
                                        <div class="fw-bold text-success mb-1"><?= substr($row['waktu_absen'], 0, 5) ?> WIB</div>
                                        <?= $lokasi_html ?>
                                    <?php else: ?>
                                        <span class="text-muted">-</span>
                                    <?php endif; ?>
                                </td>
                                <td class="text-center">
                                    <?php if($is_hadir && !empty($row['foto_path'])): ?>
                                        <img src="uploads/kehadiran/<?= $row['foto_path'] ?>" class="photo-thumb" data-bs-toggle="modal" data-bs-target="#imageModal" data-src="uploads/kehadiran/<?= $row['foto_path'] ?>" alt="Bukti">
                                    <?php else: ?>
                                        <div class="text-muted"><i class="fas fa-minus"></i></div>
                                    <?php endif; ?>
                                </td>
                                <td>
                                    <?php if ($is_hadir): ?>
                                        <span class="badge bg-success mb-1 py-1 px-2"><i class="fas fa-check-circle me-1"></i> Hadir</span>
                                        <div class="text-muted text-start fst-italic" style="font-size: 0.8rem; line-height: 1.3;">
                                            <strong>Jurnal:</strong> <?= htmlspecialchars($row['jurnal_materi'] ?: '-') ?>
                                        </div>
                                    <?php else: ?>
                                        <span class="badge bg-danger mb-1 py-1 px-2"><i class="fas fa-exclamation-circle me-1"></i> Izin / Tidak Hadir</span>
                                        <div class="text-danger text-start fw-bold" style="font-size: 0.8rem; line-height: 1.3; border-left: 3px solid #dc3545; padding-left: 8px;">
                                            <?= htmlspecialchars($row['keterangan_izin'] ?: 'Tanpa Keterangan / Alpha') ?>
                                        </div>
                                    <?php endif; ?>
                                </td>
                            </tr>
                            <?php endforeach; ?>
                        <?php endif; ?>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</div>

<div class="modal fade" id="imageModal" tabindex="-1">
    <div class="modal-dialog modal-dialog-centered">
        <div class="modal-content bg-transparent border-0">
            <div class="modal-body p-0 text-center position-relative">
                <button type="button" class="btn-close btn-close-white position-absolute top-0 end-0 m-3 p-2 bg-dark rounded-circle shadow" data-bs-dismiss="modal"></button>
                <img src="" id="modalImage" class="img-fluid rounded shadow-lg border border-4 border-white" style="max-height: 85vh; width: 100%; object-fit: contain;">
            </div>
        </div>
    </div>
</div>

<script>
    document.addEventListener("DOMContentLoaded", function() {
        var imageModal = document.getElementById('imageModal');
        if(imageModal){
            imageModal.addEventListener('show.bs.modal', function (event) {
                var button = event.relatedTarget;
                var photoUrl = button.getAttribute('data-src');
                var modalImg = document.getElementById('modalImage');
                modalImg.src = photoUrl;
            });
        }
    });
</script>

<?php include 'footer.php'; ?>

--------------------------------------------------------
FILE: profil_guru.php
--------------------------------------------------------
<?php
if (session_status() === PHP_SESSION_NONE) { session_start(); }
require_once 'koneksi.php';

// Halaman khusus Guru
if (!isset($_SESSION['role_simkuring']) || $_SESSION['role_simkuring'] !== 'Guru') {
    header("Location: dashboard.php"); exit;
}

$id_guru = $_SESSION['id_guru_simkuring'];
$pesan = '';
$pesan_telegram = '';

// =========================================================
// AUTO DEPLOY: PERSIAPAN DATABASE & FOLDER FOTO
// =========================================================
try {
    if (!file_exists('uploads/profil')) { mkdir('uploads/profil', 0755, true); }
    $cekKolomFoto = $pdo->query("SHOW COLUMNS FROM master_guru LIKE 'foto_profil'")->rowCount();
    if ($cekKolomFoto == 0) { $pdo->query("ALTER TABLE master_guru ADD COLUMN foto_profil VARCHAR(255) NULL AFTER nama_guru"); }
} catch (\Throwable $e) {}

// AMBIL DATA GURU SEBELUM PROSES UPDATE (Untuk perbandingan nomor HP lama dan baru)
$stmtUser = $pdo->prepare("SELECT * FROM master_guru WHERE id_guru = ?");
$stmtUser->execute([$id_guru]);
$user = $stmtUser->fetch();

// =========================================================
// PROSES PEMBARUAN PROFIL, NO HP, & SANDI
// =========================================================
if (isset($_POST['update_profil'])) {
    $nama_guru = trim($_POST['nama_guru']);
    $no_telepon_input = trim($_POST['no_telepon']);
    $sandi_baru = $_POST['sandi_baru'];
    $konfirmasi = $_POST['konfirmasi_sandi'];
    
    $sukses = true;
    
    // 1. UPDATE NAMA GURU
    if (!empty($nama_guru)) {
        $stmtNama = $pdo->prepare("UPDATE master_guru SET nama_guru = ? WHERE id_guru = ?");
        $stmtNama->execute([$nama_guru, $id_guru]);
        $_SESSION['nama_user'] = $nama_guru; 
    }

    // 2. LOGIKA KEAMANAN UPDATE NOMOR HP & TELEGRAM
    if (!empty($no_telepon_input)) {
        // Bersihkan format nomor HP (Hanya ambil angka, ubah awalan 62 jadi 0)
        $no_bersih = preg_replace('/[^0-9]/', '', $no_telepon_input);
        if (substr($no_bersih, 0, 2) == '62') { $no_bersih = '0' . substr($no_bersih, 2); }

        // Jika nomor HP berbeda dengan yang ada di database sekarang
        if ($no_bersih !== $user['no_telepon']) {
            // Cek apakah nomor ini sudah diklaim oleh guru lain
            $cekDuplikat = $pdo->prepare("SELECT id_guru FROM master_guru WHERE no_telepon = ? AND id_guru != ?");
            $cekDuplikat->execute([$no_bersih, $id_guru]);
            
            if ($cekDuplikat->rowCount() > 0) {
                $sukses = false;
                $pesan = "<div class='alert alert-danger shadow-sm'><i class='fas fa-exclamation-triangle me-2'></i> Gagal: Nomor HP <b>$no_bersih</b> sudah terdaftar pada akun guru lain. Hubungi Admin jika ini adalah kesalahan.</div>";
            } else {
                // UPDATE NOMOR HP DAN RESET TELEGRAM CHAT ID
                // Ini mencegah pesan nyasar ke akun Telegram lama jika guru ganti akun
                $stmtHP = $pdo->prepare("UPDATE master_guru SET no_telepon = ?, telegram_chat_id = NULL WHERE id_guru = ?");
                $stmtHP->execute([$no_bersih, $id_guru]);
                
                $pesan_telegram = "
                <div class='alert alert-warning shadow-sm border-warning border-2 border-start-0 border-end-0 border-top-0 mt-3'>
                    <h6 class='fw-bold text-dark mb-1'><i class='fas fa-exclamation-circle text-warning me-2'></i> Perhatian: Integrasi Telegram Terputus!</h6>
                    <p class='small text-dark mb-0'>Karena Anda telah mengubah Nomor HP, koneksi keamanan Bot Telegram Anda otomatis kami putuskan untuk mencegah kebocoran data. <b>Anda wajib melakukan registrasi ulang:</b><br>
                    1. Buka Bot Simkuring di aplikasi Telegram Anda.<br>
                    2. Ketik perintah <b>/start</b><br>
                    3. Klik tombol <b>'Bagikan Nomor HP'</b> untuk menghubungkan kembali.</p>
                </div>";
            }
        }
    }

    // 3. UPDATE FOTO PROFIL
    if (isset($_FILES['foto_profil']) && $_FILES['foto_profil']['error'] == 0 && $sukses) {
        $ext = strtolower(pathinfo($_FILES['foto_profil']['name'], PATHINFO_EXTENSION));
        if (in_array($ext, ['jpg', 'jpeg', 'png'])) {
            $nama_foto_baru = 'profil_' . $id_guru . '_' . time() . '.' . $ext;
            $path_simpan = 'uploads/profil/' . $nama_foto_baru;
            
            if (move_uploaded_file($_FILES['foto_profil']['tmp_name'], $path_simpan)) {
                if ($user['foto_profil'] && file_exists('uploads/profil/' . $user['foto_profil'])) {
                    unlink('uploads/profil/' . $user['foto_profil']);
                }
                $pdo->prepare("UPDATE master_guru SET foto_profil = ? WHERE id_guru = ?")->execute([$nama_foto_baru, $id_guru]);
            }
        } else {
            $sukses = false;
            $pesan = "<div class='alert alert-danger shadow-sm'><i class='fas fa-exclamation-triangle me-2'></i> Gagal: Format foto harus berupa JPG atau PNG.</div>";
        }
    }

    // 4. UPDATE KATA SANDI
    if (!empty($sandi_baru) && $sukses) {
        if ($sandi_baru !== $konfirmasi) {
            $sukses = false;
            $pesan = "<div class='alert alert-danger shadow-sm'><i class='fas fa-times-circle me-2'></i> Gagal: Konfirmasi sandi baru tidak cocok.</div>";
        } else {
            try {
                $hash_sandi = password_hash($sandi_baru, PASSWORD_DEFAULT);
                $stmtSandi = $pdo->prepare("UPDATE master_users SET password = ? WHERE id_guru = ?");
                $stmtSandi->execute([$hash_sandi, $id_guru]);
            } catch (PDOException $e) {
                $sukses = false;
                $pesan = "<div class='alert alert-danger shadow-sm'>Terjadi kesalahan sistem: " . $e->getMessage() . "</div>";
            }
        }
    }

    if ($sukses && empty($pesan)) {
        $pesan = "<div class='alert alert-success shadow-sm'><i class='fas fa-check-circle me-2'></i> Data Profil Anda berhasil diperbarui!</div>";
    }
}

// Ambil ulang data terbaru setelah proses simpan
$stmtUser->execute([$id_guru]);
$user = $stmtUser->fetch();

include 'header.php';
include 'sidebar.php';
?>
<div class="container-fluid p-4">
    <div class="row justify-content-center">
        <div class="col-lg-8">
            <h2 class="fw-bold mb-4"><i class="fas fa-user-edit text-primary me-2"></i> Profil & Pengaturan Akun</h2>
            <?= $pesan ?>
            <?= $pesan_telegram ?>
            
            <div class="card border-0 shadow-sm rounded-4">
                <div class="card-body p-5">
                    
                    <!-- HEADER PROFIL -->
                    <div class="d-flex align-items-center mb-4 pb-4 border-bottom">
                        <?php if(!empty($user['foto_profil'])): ?>
                            <img src="uploads/profil/<?= htmlspecialchars($user['foto_profil']) ?>" alt="Foto Profil" class="rounded-circle me-4 shadow" style="width: 85px; height: 85px; object-fit: cover; border: 3px solid #0d6efd;">
                        <?php else: ?>
                            <div class="bg-primary text-white rounded-circle d-flex align-items-center justify-content-center me-4 shadow" style="width: 85px; height: 85px; font-size: 2.5rem; border: 3px solid #e9ecef;">
                                <i class="fas fa-user-tie"></i>
                            </div>
                        <?php endif; ?>
                        
                        <div>
                            <h4 class="fw-bold mb-1"><?= htmlspecialchars($user['nama_guru'] ?? 'Nama Tidak Ditemukan') ?></h4>
                            <div class="text-muted"><i class="fas fa-id-card me-2"></i> NIP: <?= htmlspecialchars($user['nip'] ?? '-') ?></div>
                            <div class="mt-2">
                                <?php if(!empty($user['telegram_chat_id'])): ?>
                                    <span class="badge bg-success bg-opacity-10 text-success border border-success"><i class="fab fa-telegram me-1"></i> Bot Telegram Terhubung Aktif</span>
                                <?php else: ?>
                                    <span class="badge bg-danger bg-opacity-10 text-danger border border-danger"><i class="fas fa-unlink me-1"></i> Telegram Belum Terhubung</span>
                                    <div class="small text-muted mt-1 fw-bold"><i class="fas fa-info-circle"></i> Buka Telegram, cari Bot Simkuring, ketik <b>/start</b></div>
                                <?php endif; ?>
                            </div>
                        </div>
                    </div>

                    <form method="POST" enctype="multipart/form-data">
                        
                        <!-- BAGIAN INFORMASI PRIBADI -->
                        <h5 class="fw-bold mb-3 text-secondary"><i class="fas fa-id-badge me-2"></i> Informasi Dasar</h5>
                        
                        <div class="row mb-3">
                            <div class="col-md-7">
                                <label class="form-label fw-bold small text-muted">Nama Lengkap (Beserta Gelar)</label>
                                <input type="text" name="nama_guru" class="form-control bg-light fw-bold text-dark" value="<?= htmlspecialchars($user['nama_guru'] ?? '') ?>" required>
                            </div>
                            <div class="col-md-5 mt-3 mt-md-0">
                                <label class="form-label fw-bold small text-muted">Nomor WhatsApp / Telegram</label>
                                <input type="text" name="no_telepon" class="form-control bg-light" value="<?= htmlspecialchars($user['no_telepon'] ?? '') ?>" placeholder="08xxxxxxxxxx" required>
                            </div>
                        </div>
                        
                        <div class="mb-4">
                            <label class="form-label fw-bold small text-muted">Ubah Foto Profil</label>
                            <input type="file" name="foto_profil" class="form-control bg-light" accept=".jpg, .jpeg, .png">
                            <div class="form-text text-muted small"><i class="fas fa-info-circle"></i> Abaikan jika tidak ingin mengubah foto. Format yang diizinkan: JPG / PNG.</div>
                        </div>

                        <hr class="my-5 border-secondary opacity-25">

                        <!-- BAGIAN KEAMANAN / SANDI -->
                        <h5 class="fw-bold mb-3 text-secondary"><i class="fas fa-lock me-2"></i> Keamanan Login Web</h5>
                        <div class="alert alert-light border small text-muted mb-3">
                            Biarkan kolom di bawah ini kosong jika Anda <b>tidak ingin</b> mengubah kata sandi Web Simkuring yang Anda gunakan saat ini.
                        </div>
                        
                        <div class="row">
                            <div class="col-md-6 mb-3">
                                <label class="form-label fw-bold small text-muted">Kata Sandi Baru</label>
                                <input type="password" name="sandi_baru" class="form-control bg-light" minlength="6" placeholder="Ketik kata sandi baru...">
                            </div>
                            <div class="col-md-6 mb-4">
                                <label class="form-label fw-bold small text-muted">Konfirmasi Kata Sandi Baru</label>
                                <input type="password" name="konfirmasi_sandi" class="form-control bg-light" minlength="6" placeholder="Ketik ulang kata sandi baru...">
                            </div>
                        </div>
                        
                        <button type="submit" name="update_profil" class="btn btn-primary btn-lg w-100 fw-bold shadow-sm mt-2">
                            <i class="fas fa-save me-2"></i> Simpan Semua Pembaruan
                        </button>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
<?php include 'footer.php'; ?>

--------------------------------------------------------
FILE: display_tv.php
--------------------------------------------------------
<?php
date_default_timezone_set('Asia/Jakarta');
require_once 'koneksi.php';

// ==========================================
// 1. LOGIKA TANGGAL & FILTER (HISTORY MODE)
// ==========================================
$actual_today = date('Y-m-d');
$selected_date = isset($_GET['date']) ? $_GET['date'] : $actual_today;

if (!preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $selected_date)) {
    $selected_date = $actual_today;
}

$is_history_mode = ($selected_date < $actual_today);
$tanggal_hari_ini = $selected_date; 

$hari_inggris = date('l', strtotime($selected_date));
$hari_indonesia = ['Monday'=>'Senin', 'Tuesday'=>'Selasa', 'Wednesday'=>'Rabu', 'Thursday'=>'Kamis', 'Friday'=>'Jumat', 'Saturday'=>'Sabtu', 'Sunday'=>'Minggu'];
$hari_ini = $hari_indonesia[$hari_inggris];
$waktu_sekarang = date('H:i');

$filter_jurusan = isset($_GET['jurusan_id']) ? $_GET['jurusan_id'] : 'all';
$filter_kelas = isset($_GET['class_id']) ? $_GET['class_id'] : 'all';

$q_jurusan = $pdo->query("SELECT * FROM master_jurusan ORDER BY nama_jurusan ASC")->fetchAll();
$q_kelas = $pdo->query("SELECT * FROM master_kelas ORDER BY nama_kelas ASC")->fetchAll();

try {
    $cekKolom = $pdo->query("SHOW COLUMNS FROM jurnal_kehadiran LIKE 'is_tes'")->rowCount();
    if ($cekKolom == 0) { $pdo->query("ALTER TABLE jurnal_kehadiran ADD COLUMN is_tes TINYINT(1) DEFAULT 0 AFTER status"); }
} catch (\Throwable $e) {}

$stmtWaktu = $pdo->query("SELECT * FROM master_waktu_jp ORDER BY urutan_jp ASC");
$waktu_jp = $stmtWaktu->fetchAll();

$jp_sekarang = 0;
if (!$is_history_mode) {
    foreach ($waktu_jp as $w) {
        if ($waktu_sekarang >= $w['jam_mulai'] && $waktu_sekarang <= $w['jam_selesai']) {
            $jp_sekarang = $w['urutan_jp'];
            break;
        }
    }
}

// ==========================================
// 2. PENGAMBILAN DATA STATISTIK KPI
// ==========================================
$stat_total_kelas = $pdo->query("SELECT COUNT(*) FROM master_kelas")->fetchColumn();

$sql_guru_hari_ini = "SELECT COUNT(DISTINCT bg.id_guru) FROM jadwal_pelajaran j JOIN beban_mengajar_guru bg ON j.id_beban = bg.id_beban WHERE j.hari = ?";
$stmtGHI = $pdo->prepare($sql_guru_hari_ini); $stmtGHI->execute([$hari_ini]);
$stat_guru_hari_ini = $stmtGHI->fetchColumn();

$sql_hadir_hari_ini = "SELECT COUNT(DISTINCT id_guru) FROM jurnal_kehadiran WHERE tanggal = ? AND status = 'Hadir' AND is_tes = 0";
$stmtHHI = $pdo->prepare($sql_hadir_hari_ini); $stmtHHI->execute([$tanggal_hari_ini]);
$stat_hadir_hari_ini = $stmtHHI->fetchColumn();

$persentase_kehadiran = ($stat_guru_hari_ini > 0) ? round(($stat_hadir_hari_ini / $stat_guru_hari_ini) * 100) : 0;

$sql_izin = "SELECT COUNT(DISTINCT id_guru) FROM jurnal_kehadiran WHERE tanggal = ? AND status = 'Tidak Hadir' AND is_tes = 0";
$stmtIzin = $pdo->prepare($sql_izin); $stmtIzin->execute([$tanggal_hari_ini]);
$stat_izin_hari_ini = $stmtIzin->fetchColumn();

$stat_kelas_jam_ini = 0; $stat_guru_jam_ini = 0;
if ($jp_sekarang > 0) {
    $sql_live_jadwal = "SELECT id_jadwal FROM jadwal_pelajaran WHERE hari = ? AND ? BETWEEN jp_mulai AND jp_selesai";
    $stmtLiveJadwal = $pdo->prepare($sql_live_jadwal); $stmtLiveJadwal->execute([$hari_ini, $jp_sekarang]);
    $jadwal_live = $stmtLiveJadwal->fetchAll(PDO::FETCH_COLUMN);
    $stat_kelas_jam_ini = count($jadwal_live);

    if ($stat_kelas_jam_ini > 0) {
        $inQuery = implode(',', array_fill(0, count($jadwal_live), '?'));
        $sql_live_hadir = "SELECT COUNT(DISTINCT id_guru) FROM jurnal_kehadiran WHERE tanggal = ? AND status = 'Hadir' AND is_tes = 0 AND id_jadwal IN ($inQuery)";
        $paramsLive = array_merge([$tanggal_hari_ini], $jadwal_live);
        $stmtLiveHadir = $pdo->prepare($sql_live_hadir); $stmtLiveHadir->execute($paramsLive);
        $stat_guru_jam_ini = $stmtLiveHadir->fetchColumn();
    }
}

// ==========================================
// 3. DATA TIMELINE FEED (SCROLL HORIZONTAL)
// ==========================================
// PERUBAHAN: Menghapus filter status='Hadir' agar Izin juga masuk ke layar
$sql_feed = "SELECT h.waktu_absen, h.foto_path, h.is_tes, h.jurnal_materi, h.status, h.keterangan_izin, g.nama_guru, 
             COALESCE(b.nama_mapel, 'Tes Sistem') as nama_mapel, 
             COALESCE(k.nama_kelas, 'Semua Kelas') as nama_kelas,
             COALESCE(mj.nama_jurusan, 'Umum') as nama_jurusan
             FROM jurnal_kehadiran h 
             JOIN master_guru g ON h.id_guru = g.id_guru 
             LEFT JOIN jadwal_pelajaran j ON h.id_jadwal = j.id_jadwal 
             LEFT JOIN beban_mengajar b ON j.id_beban = b.id_beban 
             LEFT JOIN master_kelas k ON b.id_kelas = k.id_kelas
             LEFT JOIN master_jurusan mj ON k.id_jurusan = mj.id_jurusan
             WHERE h.tanggal = ? ";

$params_feed = [$tanggal_hari_ini];

if ($filter_jurusan !== 'all') {
    $sql_feed .= " AND k.id_jurusan = ? ";
    $params_feed[] = $filter_jurusan;
}
if ($filter_kelas !== 'all') {
    $sql_feed .= " AND k.id_kelas = ? ";
    $params_feed[] = $filter_kelas;
}

$sql_feed .= " ORDER BY h.waktu_absen DESC LIMIT 50";
$stmtFeed = $pdo->prepare($sql_feed);
$stmtFeed->execute($params_feed);
$data_feed = $stmtFeed->fetchAll();

// ==========================================
// 4. DATA MATRIX EPG
// ==========================================
$sql_ruang = "SELECT DISTINCT r.id_ruangan, r.nama_ruangan FROM jadwal_pelajaran j JOIN beban_mengajar b ON j.id_beban = b.id_beban JOIN master_ruangan r ON b.id_ruangan = r.id_ruangan WHERE j.hari = ? ORDER BY r.nama_ruangan ASC";
$stmtRuang = $pdo->prepare($sql_ruang); $stmtRuang->execute([$hari_ini]);
$ruangan_aktif = $stmtRuang->fetchAll();

$sql_matrix = "SELECT j.id_jadwal, j.jp_mulai, j.jp_selesai, b.nama_mapel, b.jumlah_jp, k.nama_kelas, r.id_ruangan, g.nama_guru, h.status, h.foto_path, h.waktu_absen
               FROM jadwal_pelajaran j JOIN beban_mengajar b ON j.id_beban = b.id_beban JOIN master_kelas k ON b.id_kelas = k.id_kelas JOIN master_ruangan r ON b.id_ruangan = r.id_ruangan JOIN beban_mengajar_guru bg ON j.id_beban = bg.id_beban JOIN master_guru g ON bg.id_guru = g.id_guru
               LEFT JOIN jurnal_kehadiran h ON j.id_jadwal = h.id_jadwal AND h.tanggal = ? AND h.id_guru = g.id_guru AND h.is_tes = 0
               WHERE j.hari = ?";
$stmtMatrix = $pdo->prepare($sql_matrix); $stmtMatrix->execute([$tanggal_hari_ini, $hari_ini]);
$jadwal_mentah = $stmtMatrix->fetchAll();

$jadwal_matriks = [];
foreach ($jadwal_mentah as $jdwl) { $jadwal_matriks[$jdwl['id_ruangan']][$jdwl['jp_mulai']] = $jdwl; }
?>

<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Live TV Monitoring - Simkuring</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <style>
        body { background-color: #f4f6f9; color: #333; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; overflow-x: hidden; margin: 0; }
        
        .header-tv { background: #212529; border-bottom: 3px solid #ffc107; padding: 12px 20px; display: flex; justify-content: space-between; align-items: center; }
        .clock-time { font-size: 1.4rem; font-weight: bold; color: #ffc107; background: #000; padding: 5px 15px; border-radius: 10px; }
        .btn-history { font-size: 0.85rem; padding: 5px 12px; transition: 0.2s; border-radius: 8px; }

        .stats-section { padding: 15px 20px; background: #ffffff; border-bottom: 1px solid #dee2e6; }
        .stat-card { border-radius: 10px; padding: 15px; color: white; display: flex; flex-direction: column; justify-content: center; box-shadow: 0 4px 6px rgba(0,0,0,0.1); height: 90px; position: relative; overflow: hidden; }
        .stat-card i { position: absolute; right: -10px; bottom: -15px; font-size: 4.5rem; opacity: 0.2; }
        .stat-num { font-size: 2rem; font-weight: 900; line-height: 1; z-index: 2; text-shadow: 1px 1px 2px rgba(0,0,0,0.2); }
        .stat-label { font-size: 0.75rem; font-weight: bold; text-transform: uppercase; z-index: 2; margin-top: 5px; opacity: 0.9; }

        .bg-blue { background: #0d6efd; } .bg-green { background: #198754; } .bg-cyan { background: #0dcaf0; color: #000 !important; }
        .bg-yellow { background: #ffc107; color: #000 !important; } .bg-red-outline { background: #fff; color: #dc3545 !important; border: 2px solid #dc3545; }

        .scrolling-wrapper-outer { position: relative; width: 100%; display: flex; align-items: center; }
        .scrolling-wrapper { overflow-x: auto; white-space: nowrap; width: 100%; scrollbar-width: none; scroll-behavior: smooth; }
        .scrolling-wrapper::-webkit-scrollbar { display: none; }
        .scrolling-content { display: inline-flex; gap: 15px; padding: 5px; }

        .nav-btn { position: absolute; top: 50%; transform: translateY(-50%); background: rgba(0,0,0,0.6); color: white; border: none; width: 40px; height: 40px; border-radius: 50%; z-index: 10; cursor: pointer; transition: 0.3s; display: flex; align-items: center; justify-content: center; }
        .nav-btn:hover { background: rgba(0,0,0,0.9); transform: translateY(-50%) scale(1.1); }
        .nav-left { left: 0px; } .nav-right { right: 0px; }

        .photo-card-inline { min-width: 200px; width: 200px; height: 290px; position: relative; border-radius: 12px; overflow: hidden; background: #000; box-shadow: 0 6px 12px rgba(0,0,0,0.15); border: 2px solid #fff; }
        .photo-card-inline img { width: 100%; height: 100%; object-fit: cover; opacity: 1; transition: transform 0.3s; }
        .photo-card-inline .overlay { position: absolute; bottom: 0; left: 0; right: 0; padding: 12px; background: linear-gradient(to top, rgba(0,0,0,0.95) 0%, rgba(0,0,0,0.7) 60%, transparent 100%); color: white; white-space: normal; }
        .badge-tipe { position: absolute; top: 8px; left: 8px; font-size: 0.7rem; z-index: 5; box-shadow: 0 2px 4px rgba(0,0,0,0.3); }

        .jurnal-text { font-size: 0.75rem; color: #e9ecef; font-style: italic; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; margin-top: 8px; padding-top: 8px; border-top: 1px dashed rgba(255,255,255,0.3); line-height: 1.3; font-weight: normal; }

        .epg-container { height: calc(100vh - 540px); overflow: auto; position: relative; background: #fff; border-top: 2px solid #dee2e6; }
        .epg-table { width: 100%; border-collapse: separate; border-spacing: 0; table-layout: fixed; }
        .epg-table th, .epg-table td { border-bottom: 1px solid #dee2e6; border-right: 1px solid #dee2e6; padding: 0; height: 65px; }
        .epg-time-header { background: #f8f9fa; position: sticky; top: 0; z-index: 10; text-align: center; font-weight: bold; padding: 5px 0 !important; color: #495057; width: 220px; border-bottom: 2px solid #dee2e6 !important; }
        .epg-room-col { background: #fff; position: sticky; left: 0; z-index: 5; text-align: center; font-weight: bold; width: 160px; border-right: 2px solid #dee2e6 !important; color: #212529; }
        .epg-corner { background: #e9ecef; position: sticky; top: 0; left: 0; z-index: 20; border-right: 2px solid #dee2e6 !important; border-bottom: 2px solid #dee2e6 !important; }
        
        .prog-block-wrapper { padding: 4px; height: 100%; box-sizing: border-box; }
        .prog-block { background: #f1f3f5; border-radius: 6px; height: 100%; padding: 4px 8px; display: flex; flex-direction: column; justify-content: center; position: relative; border-left: 4px solid #ced4da; }
        .status-live { background: #d1e7dd; border-left: 4px solid #198754; }
        .status-izin { background: #f8d7da; border-left: 4px solid #dc3545; }
        .prog-title { font-weight: bold; font-size: 0.9rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: #495057; }
        .prog-sub { font-size: 0.75rem; color: #6c757d; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
    </style>
</head>
<body>

<div class="header-tv">
    <div class="d-flex align-items-center gap-3">
        <h5 class="m-0 fw-bold text-warning d-none d-md-block"><i class="fas fa-tv me-2"></i> SIMKURING TV</h5>
        <div class="d-flex gap-2 ms-lg-3">
            <?php 
            for($i=6; $i>=0; $i--) {
                $d = date('Y-m-d', strtotime("-$i days", strtotime($actual_today)));
                $label = ($i==0) ? 'HARI INI' : (($i==1) ? 'KEMARIN' : date('d M', strtotime($d)));
                $active = ($d == $selected_date) ? 'btn-warning text-dark fw-bold' : 'btn-outline-secondary text-white';
                echo "<a href='?date=$d&jurusan_id=$filter_jurusan&class_id=$filter_kelas' class='btn btn-history $active'>$label</a>";
            }
            ?>
        </div>
    </div>

    <div class="d-flex align-items-center gap-3">
        <form method="GET" class="d-flex gap-2">
            <input type="hidden" name="date" value="<?= $selected_date ?>">
            <select name="jurusan_id" class="form-select form-select-sm fw-bold border-warning" onchange="this.form.submit()" style="max-width: 150px;">
                <option value="all">Semua Jurusan</option>
                <?php foreach($q_jurusan as $j): ?>
                    <option value="<?= $j['id_jurusan'] ?>" <?= $filter_jurusan == $j['id_jurusan'] ? 'selected' : '' ?>><?= htmlspecialchars($j['nama_jurusan']) ?></option>
                <?php endforeach; ?>
            </select>
            <select name="class_id" class="form-select form-select-sm fw-bold border-warning" onchange="this.form.submit()" style="max-width: 150px;">
                <option value="all">Semua Kelas</option>
                <?php foreach($q_kelas as $c): ?>
                    <option value="<?= $c['id_kelas'] ?>" <?= $filter_kelas == $c['id_kelas'] ? 'selected' : '' ?>><?= htmlspecialchars($c['nama_kelas']) ?></option>
                <?php endforeach; ?>
            </select>
        </form>
        <div class="clock-time" id="clock_time"><?= date('H:i:s') ?></div>
    </div>
</div>

<div class="stats-section">
    <div class="row g-3">
        <div class="col">
            <div class="stat-card bg-blue">
                <i class="fas fa-school"></i>
                <div class="stat-num text-center"><?= $stat_total_kelas ?></div>
                <div class="stat-label text-center">TOTAL KELAS</div>
            </div>
        </div>
        <div class="col">
            <div class="stat-card bg-green">
                <i class="fas fa-chalkboard-teacher"></i>
                <div class="stat-num text-center"><?= $stat_guru_hari_ini ?></div>
                <div class="stat-label text-center">GURU TERJADWAL <?= $is_history_mode ? 'TGL INI' : 'HARI INI' ?></div>
            </div>
        </div>
        <div class="col">
            <div class="stat-card bg-cyan">
                <i class="fas fa-door-open"></i>
                <div class="stat-num text-center"><?= $stat_guru_jam_ini ?> <span class="fs-5 fw-normal text-muted">/ <?= $stat_kelas_jam_ini ?></span></div>
                <div class="stat-label text-center">GURU DI KELAS SAAT INI (JP <?= $jp_sekarang ?>)</div>
            </div>
        </div>
        <div class="col">
            <div class="stat-card bg-red-outline">
                <i class="fas fa-envelope-open-text text-danger opacity-25"></i>
                <div class="stat-num text-center"><?= $stat_izin_hari_ini ?></div>
                <div class="stat-label text-center">GURU IZIN / TIDAK HADIR</div>
            </div>
        </div>
        <div class="col">
            <div class="stat-card bg-yellow">
                <i class="fas fa-chart-pie"></i>
                <div class="stat-num text-center"><?= $persentase_kehadiran ?>%</div>
                <div class="stat-label text-center">KEHADIRAN <?= $is_history_mode ? 'TGL INI' : 'HARI INI' ?></div>
            </div>
        </div>
    </div>
</div>

<div class="px-4 py-3 bg-white">
    <h6 class="fw-bold text-secondary mb-3"><i class="fas fa-camera-retro me-2"></i>TIMELINE BUKTI MENGAJAR (SESUAI FILTER)</h6>
    <div class="scrolling-wrapper-outer">
        <button class="nav-btn nav-left" onclick="scrollContainer('feed-container', -300)"><i class="fas fa-chevron-left"></i></button>
        
        <div id="feed-container" class="scrolling-wrapper pb-2">
            <div class="scrolling-content">
                <?php foreach($data_feed as $f): 
                    $jam = substr($f['waktu_absen'], 0, 5);
                    $is_hadir = ($f['status'] == 'Hadir');
                    
                    if ($is_hadir) {
                        $img = 'uploads/kehadiran/' . htmlspecialchars($f['foto_path']);
                        $badge_color = $f['is_tes'] ? 'bg-danger' : 'bg-success';
                        $badge_text = $f['is_tes'] ? 'UJI COBA' : 'LIVE KBM';
                        $jurnal_teks = !empty($f['jurnal_materi']) ? htmlspecialchars($f['jurnal_materi']) : 'Sedang melangsungkan KBM...';
                    } else {
                        // Logika Parsing Status Ketidakhadiran
                        $alasan = 'Izin'; $instruksi = $f['keterangan_izin'];
                        if (preg_match('/\[(.*?)\]\s*(.*)/', $f['keterangan_izin'], $matches)) {
                            $alasan = strtoupper($matches[1]);
                            $instruksi = $matches[2];
                        }
                        
                        $jurnal_teks = "Tugas: " . htmlspecialchars($instruksi);
                        $badge_text = $alasan;
                        
                        // Pembuatan Poster Gambar Dinamis berdasarkan Izin
                        if (strpos(strtolower($alasan), 'sakit') !== false) {
                            $img = "https://placehold.co/200x290/dc3545/ffffff?text=SAKIT\\n&font=montserrat";
                            $badge_color = 'bg-danger';
                        } elseif (strpos(strtolower($alasan), 'dinas') !== false) {
                            $img = "https://placehold.co/200x290/0dcaf0/ffffff?text=DINAS\\nLUAR&font=montserrat";
                            $badge_color = 'bg-info text-dark';
                        } else {
                            $img = "https://placehold.co/200x290/ffc107/000000?text=IZIN\\nPENTING&font=montserrat";
                            $badge_color = 'bg-warning text-dark';
                        }
                    }
                ?>
                <div class="photo-card-inline">
                    <span class="badge <?= $badge_color ?> badge-tipe shadow"><?= $badge_text ?></span>
                    <img src="<?= $img ?>" alt="Foto" onerror="this.src='https://via.placeholder.com/200x290/198754/FFFFFF?text=📸'">
                    <div class="overlay">
                        <div class="fw-bold text-white text-truncate mb-1" style="font-size:0.9rem" title="<?= htmlspecialchars($f['nama_guru']) ?>"><?= htmlspecialchars($f['nama_guru']) ?></div>
                        <div class="small text-info fw-bold text-truncate" style="font-size:0.75rem;" title="<?= htmlspecialchars($f['nama_jurusan']) ?>"><?= htmlspecialchars($f['nama_jurusan']) ?></div>
                        <div class="small text-white text-truncate mb-1" style="font-size:0.75rem; opacity:0.9" title="<?= htmlspecialchars($f['nama_mapel']) ?>"><?= htmlspecialchars($f['nama_mapel']) ?></div>
                        <div class="fw-bold text-warning" style="font-size:0.8rem">
                            <i class="fas fa-users me-1"></i><?= htmlspecialchars($f['nama_kelas']) ?> 
                            <i class="far fa-clock ms-2 me-1"></i><?= $jam ?>
                        </div>
                        
                        <div class="jurnal-text" title="<?= $jurnal_teks ?>">
                            "<?= $jurnal_teks ?>"
                        </div>
                    </div>
                </div>
                <?php endforeach; ?>
                
                <?php if(empty($data_feed)): ?>
                    <div class="d-flex align-items-center justify-content-center w-100 p-5">
                        <div class="text-muted fs-5"><i class="fas fa-search me-2"></i> Belum ada rekaman log KBM untuk filter ini.</div>
                    </div>
                <?php endif; ?>
            </div>
        </div>
        
        <button class="nav-btn nav-right" onclick="scrollContainer('feed-container', 300)"><i class="fas fa-chevron-right"></i></button>
    </div>
</div>

<div class="epg-container" id="epg_scroll">
    <table class="epg-table">
        <thead>
            <tr>
                <th class="epg-corner text-muted small px-2">JADWAL LAB & KELAS<br><?= strtoupper($hari_ini) ?></th>
                <?php foreach($waktu_jp as $w): ?>
                    <th class="epg-time-header">JP <?= $w['urutan_jp'] ?><br><span style="font-size: 0.75rem; font-weight: normal;"><?= $w['jam_mulai'] ?> - <?= $w['jam_selesai'] ?></span></th>
                <?php endforeach; ?>
            </tr>
        </thead>
        <tbody>
            <?php if (empty($ruangan_aktif)): ?>
                <tr><td colspan="<?= count($waktu_jp) + 1 ?>" class="text-center py-5 text-muted h4">Tidak ada jadwal tercatat pada hari <?= $hari_ini ?>.</td></tr>
            <?php else: ?>
                <?php foreach($ruangan_aktif as $rng): ?>
                    <tr>
                        <td class="epg-room-col"><?= htmlspecialchars($rng['nama_ruangan']) ?></td>
                        <?php 
                        $jp_skip = 0; 
                        foreach($waktu_jp as $w): 
                            if ($jp_skip > 0) { $jp_skip--; continue; } 
                            
                            $jp_skrg = $w['urutan_jp'];
                            if (isset($jadwal_matriks[$rng['id_ruangan']][$jp_skrg])) {
                                $jdwl = $jadwal_matriks[$rng['id_ruangan']][$jp_skrg];
                                $colspan = $jdwl['jumlah_jp'];
                                $jp_skip = $colspan - 1;

                                $status_class = ''; $badge_html = '';
                                if ($jdwl['status'] == 'Hadir') {
                                    $status_class = 'status-live';
                                    $badge_html = '<span class="badge bg-success position-absolute top-0 end-0 m-1" style="font-size: 0.6rem;">HADIR</span>';
                                } elseif ($jdwl['status'] == 'Tidak Hadir') {
                                    $status_class = 'status-izin';
                                    $badge_html = '<span class="badge bg-danger position-absolute top-0 end-0 m-1" style="font-size: 0.6rem;">IZIN</span>';
                                }
                                ?>
                                <td colspan="<?= $colspan ?>">
                                    <div class="prog-block-wrapper">
                                        <div class="prog-block <?= $status_class ?>">
                                            <?= $badge_html ?>
                                            <div class="prog-title"><?= htmlspecialchars($jdwl['nama_mapel']) ?></div>
                                            <div class="prog-sub"><i class="fas fa-users me-1"></i> <?= htmlspecialchars($jdwl['nama_kelas']) ?></div>
                                            <div class="prog-sub mt-1 text-dark fw-bold"><i class="fas fa-chalkboard-teacher me-1"></i> <?= htmlspecialchars($jdwl['nama_guru']) ?></div>
                                        </div>
                                    </div>
                                </td>
                                <?php
                            } else { echo "<td></td>"; }
                        endforeach; 
                        ?>
                    </tr>
                <?php endforeach; ?>
            <?php endif; ?>
        </tbody>
    </table>
</div>

<script>
    function updateClock() { 
        document.getElementById('clock_time').innerText = new Date().toLocaleTimeString('id-ID', { hour12: false }); 
    }
    setInterval(updateClock, 1000); 
    
    let refreshTimer;
    function startRefreshTimer() {
        if(refreshTimer) clearTimeout(refreshTimer);
        refreshTimer = setTimeout(function() { window.location.reload(); }, 60000); 
    }
    startRefreshTimer();
    function resetRefreshTimer() { startRefreshTimer(); }
    document.addEventListener('mousemove', resetRefreshTimer);
    document.addEventListener('click', resetRefreshTimer);

    window.scrollContainer = function(elementId, amount) {
        const container = document.getElementById(elementId);
        if(container) {
            container.scrollBy({ left: amount, behavior: 'smooth' });
            resetRefreshTimer(); 
        }
    };

    function setupAutoScroll(containerId, speed = 1) {
        const container = document.getElementById(containerId);
        if (!container) return;
        let scrollInterval;
        function startScroll() {
            if (scrollInterval) clearInterval(scrollInterval);
            scrollInterval = setInterval(() => {
                if (container.scrollLeft >= (container.scrollWidth - container.clientWidth - 1)) {
                    container.scrollLeft = 0; 
                } else {
                    container.scrollLeft += 1;
                }
            }, 30 * speed); 
        }
        function stopScroll() { clearInterval(scrollInterval); }
        startScroll();
        container.parentElement.addEventListener('mouseenter', stopScroll);
        container.parentElement.addEventListener('mouseleave', startScroll);
        container.parentElement.addEventListener('touchstart', stopScroll);
        container.parentElement.addEventListener('touchend', startScroll);
    }
    setupAutoScroll('feed-container', 1.5);   
</script>
</body>
</html>

--------------------------------------------------------
FILE: index.php
--------------------------------------------------------
<?php
if (session_status() === PHP_SESSION_NONE) { session_start(); }
require_once 'koneksi.php';

// BLOKIR AKSES UNTUK GURU
if (isset($_SESSION['role_simkuring']) && $_SESSION['role_simkuring'] !== 'Admin') {
    header("Location: dashboard.php");
    exit;
}

// Tarik Statistik Master Data
$tot_guru = $pdo->query("SELECT COUNT(*) FROM master_guru")->fetchColumn();
$tot_kelas = $pdo->query("SELECT COUNT(*) FROM master_kelas")->fetchColumn();
$tot_ruangan = $pdo->query("SELECT COUNT(*) FROM master_ruangan")->fetchColumn();

// Tarik Statistik Transaksional (Beban & Hasil Jadwal)
$tot_beban = $pdo->query("SELECT COUNT(*) FROM beban_mengajar")->fetchColumn();
$tot_terjadwal = 0;
try {
    $tot_terjadwal = $pdo->query("SELECT COUNT(*) FROM jadwal_pelajaran")->fetchColumn();
} catch (\Throwable $e) { /* Abaikan jika tabel jadwal belum ada */ }

$persentase = ($tot_beban > 0) ? round(($tot_terjadwal / $tot_beban) * 100) : 0;

// Analisis Mapel yang Gagal Masuk Jadwal (Bentrok Absolut)
$sql_gagal = "SELECT b.nama_mapel, b.jumlah_jp, k.nama_kelas, r.nama_ruangan, 
              GROUP_CONCAT(g.nama_guru SEPARATOR ', ') as tim_guru
              FROM beban_mengajar b
              LEFT JOIN jadwal_pelajaran j ON b.id_beban = j.id_beban
              JOIN master_kelas k ON b.id_kelas = k.id_kelas
              LEFT JOIN master_ruangan r ON b.id_ruangan = r.id_ruangan
              LEFT JOIN beban_mengajar_guru bg ON b.id_beban = bg.id_beban
              LEFT JOIN master_guru g ON bg.id_guru = g.id_guru
              WHERE j.id_jadwal IS NULL
              GROUP BY b.id_beban";
$data_gagal = $pdo->query($sql_gagal)->fetchAll();

include 'header.php';
include 'sidebar.php';
?>

<div class="container-fluid">
    <div class="row mb-4 align-items-center">
        <div class="col-lg-8">
            <h2 class="fw-bold mb-1"><i class="fas fa-brain text-primary me-2"></i> Command Center Penjadwalan AI</h2>
            <p class="text-muted">Analisis data sekolah, deteksi bentrok (clash detection), dan *generate* jadwal otomatis.</p>
        </div>
        <div class="col-lg-4 text-lg-end">
            <form action="generate.php" method="POST" onsubmit="return confirm('Peringatan: Melakukan Generate AI akan menimpa (menghapus) seluruh jadwal yang sudah terbentuk sebelumnya. Apakah Anda yakin ingin memproses algoritma?');">
                <button type="submit" class="btn btn-primary btn-lg shadow-sm fw-bold w-100">
                    <i class="fas fa-magic me-2"></i> GENERATE JADWAL OTOMATIS
                </button>
            </form>
        </div>
    </div>

    <?php if (isset($_GET['status']) && $_GET['status'] == 'generate_sukses'): ?>
        <div class="alert alert-success shadow-sm mb-4 border-success border-2 border-start-0 border-end-0 border-top-0">
            <h5 class="fw-bold mb-1"><i class="fas fa-check-circle me-2"></i> Algoritma Selesai Diproses!</h5>
            <p class="mb-0">Mesin AI berhasil menyusun <b><?= $_GET['berhasil'] ?> blok tugas</b>. 
            <?php if ($_GET['gagal'] > 0): ?>
                Namun, terdapat <b><span class="text-danger"><?= $_GET['gagal'] ?> tugas GAGAL dipasang</span></b> akibat batasan bentrok waktu/ruangan. (Silakan periksa tabel Evaluasi di bawah).
            <?php endif; ?>
            </p>
        </div>
    <?php endif; ?>

    <div class="row g-3 mb-4">
        <div class="col-md-3">
            <div class="card shadow-sm border-0 border-bottom border-info border-4">
                <div class="card-body">
                    <div class="text-muted fw-bold small text-uppercase">Bahan Baku: Guru</div>
                    <div class="fs-2 fw-bold text-dark"><?= $tot_guru ?> <i class="fas fa-chalkboard-teacher text-info opacity-50 float-end mt-2"></i></div>
                </div>
            </div>
        </div>
        <div class="col-md-3">
            <div class="card shadow-sm border-0 border-bottom border-warning border-4">
                <div class="card-body">
                    <div class="text-muted fw-bold small text-uppercase">Bahan Baku: Kelas</div>
                    <div class="fs-2 fw-bold text-dark"><?= $tot_kelas ?> <i class="fas fa-users text-warning opacity-50 float-end mt-2"></i></div>
                </div>
            </div>
        </div>
        <div class="col-md-3">
            <div class="card shadow-sm border-0 border-bottom border-danger border-4">
                <div class="card-body">
                    <div class="text-muted fw-bold small text-uppercase">Total Beban/Tugas Mengajar</div>
                    <div class="fs-2 fw-bold text-dark"><?= $tot_beban ?> <i class="fas fa-book text-danger opacity-50 float-end mt-2"></i></div>
                </div>
            </div>
        </div>
        <div class="col-md-3">
            <div class="card shadow-sm border-0 border-bottom border-success border-4 bg-light">
                <div class="card-body">
                    <div class="text-muted fw-bold small text-uppercase">Status Penjadwalan AI</div>
                    <div class="fs-2 fw-bold text-success"><?= $persentase ?>% <i class="fas fa-calendar-check text-success opacity-50 float-end mt-2"></i></div>
                    <div class="progress mt-2" style="height: 5px;">
                        <div class="progress-bar bg-success" role="progressbar" style="width: <?= $persentase ?>%;"></div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <?php if (count($data_gagal) > 0 && $tot_beban > 0): ?>
    <div class="card shadow-sm border-0 border-danger border-1 mb-4">
        <div class="card-header bg-danger text-white fw-bold py-3">
            <i class="fas fa-exclamation-triangle me-2"></i> Laporan Evaluasi: Mapel Gagal Terjadwal (<?= count($data_gagal) ?> Tugas)
        </div>
        <div class="card-body p-0">
            <div class="alert alert-light m-0 border-0 rounded-0 pb-0 small">
                <b>Mengapa ini terjadi?</b> Mesin AI tidak menemukan satupun slot waktu yang kosong untuk mapel di bawah ini. Hal ini biasanya terjadi jika: 
                (1) Durasi blok JP terlalu panjang melebihi jam kosong tersisa, (2) Guru di tim tersebut memiliki jadwal mengajar paralel (bentrok) di kelas lain sepanjang minggu, atau (3) Ruang lab sudah dipakai penuh (Full-Booked) oleh kelas lain.
            </div>
            <div class="table-responsive">
                <table class="table table-striped table-hover mb-0 m-0">
                    <thead class="table-light text-danger">
                        <tr>
                            <th width="5%" class="text-center">No</th>
                            <th>Mata Pelajaran (Durasi)</th>
                            <th>Kelas Terdampak</th>
                            <th>Ruangan Diminta</th>
                            <th>Tim Guru (Clash Suspect)</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php $n=1; foreach($data_gagal as $ggl): ?>
                        <tr>
                            <td class="text-center fw-bold"><?= $n++ ?></td>
                            <td><span class="fw-bold text-dark"><?= htmlspecialchars($ggl['nama_mapel']) ?></span> <span class="badge bg-danger ms-1"><?= $ggl['jumlah_jp'] ?> Jam Blok</span></td>
                            <td class="fw-bold"><?= htmlspecialchars($ggl['nama_kelas']) ?></td>
                            <td><?= htmlspecialchars($ggl['nama_ruangan'] ?: 'Fleksibel (Moving)') ?></td>
                            <td class="small"><i class="fas fa-user-times text-danger me-1"></i> <?= htmlspecialchars($ggl['tim_guru']) ?></td>
                        </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
    <?php elseif ($tot_terjadwal > 0 && count($data_gagal) == 0): ?>
    <div class="alert alert-success shadow-sm d-flex align-items-center mb-4">
        <i class="fas fa-trophy fa-3x me-4 opacity-50"></i>
        <div>
            <h4 class="fw-bold mb-1">Sempurna! 100% Jadwal Tersusun.</h4>
            <p class="mb-0">Mesin AI berhasil merangkai seluruh tugas mengajar tanpa menyisakan satupun jadwal yang bentrok. Silakan periksa hasilnya di menu <b>Output Jadwal</b> (Jadwal per Kelas / per Guru).</p>
        </div>
    </div>
    <?php endif; ?>

    <div class="card shadow-sm border-0 bg-light">
        <div class="card-body text-center py-5">
            <h5 class="fw-bold text-secondary mb-3">Lihat Hasil Penjadwalan</h5>
            <div class="d-flex justify-content-center gap-3 flex-wrap">
                <a href="jadwal_kelas.php" class="btn btn-outline-primary btn-lg fw-bold px-4"><i class="fas fa-th me-2"></i> Jadwal Papan Kelas</a>
                <a href="jadwal_guru.php" class="btn btn-outline-success btn-lg fw-bold px-4"><i class="fas fa-user-tie me-2"></i> Jadwal Papan Guru</a>
            </div>
        </div>
    </div>
</div>

<?php include 'footer.php'; ?>

--------------------------------------------------------
FILE: bot_webhook.php
--------------------------------------------------------
<?php
date_default_timezone_set('Asia/Jakarta');
require_once 'koneksi.php';

$botToken = "8899680546:AAGLczYc6FG-smYvDYL5yp3AUzNwhf-tOXM";
$apiUrl = "https://api.telegram.org/bot" . $botToken;

// Menangkap sinyal masuk dari server Telegram
$content = file_get_contents("php://input");
$update = json_decode($content, true);

if (!$update) { exit; }

// Fungsi Kirim Pesan
function sendMessage($chatId, $text, $replyMarkup = null) {
    global $apiUrl;
    $data = [
        'chat_id' => $chatId,
        'text' => $text,
        'parse_mode' => 'HTML'
    ];
    if ($replyMarkup) {
        $data['reply_markup'] = json_encode($replyMarkup);
    }
    file_get_contents($apiUrl . "/sendMessage?" . http_build_query($data));
}

// Fungsi Bantuan Tarik Jadwal
function ambilJadwal($pdo, $id_guru, $nama_hari) {
    $sql = "SELECT j.jp_mulai, j.jp_selesai, b.nama_mapel, k.nama_kelas, r.nama_ruangan, w1.jam_mulai as jam_masuk, w2.jam_selesai as jam_keluar
            FROM jadwal_pelajaran j 
            JOIN beban_mengajar b ON j.id_beban = b.id_beban 
            JOIN master_kelas k ON b.id_kelas = k.id_kelas 
            LEFT JOIN master_ruangan r ON b.id_ruangan = r.id_ruangan 
            JOIN beban_mengajar_guru bg ON b.id_beban = bg.id_beban 
            JOIN master_waktu_jp w1 ON j.jp_mulai = w1.urutan_jp
            JOIN master_waktu_jp w2 ON j.jp_selesai = w2.urutan_jp
            WHERE j.hari = ? AND bg.id_guru = ? ORDER BY j.jp_mulai ASC";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$nama_hari, $id_guru]);
    return $stmt->fetchAll();
}

// ============================================
// 1. JIKA ADA PESAN TEKS BIASA ATAU COMMAND
// ============================================
if (isset($update['message'])) {
    $message = $update['message'];
    $chatId = $message['chat']['id'];
    $text = isset($message['text']) ? strtolower(trim($message['text'])) : '';

    $stmtCek = $pdo->prepare("SELECT id_guru, nama_guru FROM master_guru WHERE telegram_chat_id = ?");
    $stmtCek->execute([$chatId]);
    $guru = $stmtCek->fetch();

    // JIKA GURU SUDAH TERDAFTAR (DIKENALI SISTEM)
    if ($guru) {
        $id_guru = $guru['id_guru'];
        $nama_guru = $guru['nama_guru'];
        $hari_indonesia = ['Monday'=>'Senin', 'Tuesday'=>'Selasa', 'Wednesday'=>'Rabu', 'Thursday'=>'Kamis', 'Friday'=>'Jumat', 'Saturday'=>'Sabtu', 'Sunday'=>'Minggu'];

        switch ($text) {
            case '/start':
            case '/bantuan':
                $pesan = "Halo Bapak/Ibu <b>" . htmlspecialchars($nama_guru) . "</b>! 🤖\n\n";
                $pesan .= "Berikut adalah layanan asisten yang bisa Anda gunakan:\n\n";
                $pesan .= "📅 /jadwalhariini - Cek jadwal mengajar Anda hari ini.\n";
                $pesan .= "⏭ /jadwalbesok - Cek persiapan jadwal untuk besok.\n";
                $pesan .= "📊 /rekapbulanini - Lihat total absensi Anda bulan ini.\n";
                $pesan .= "🏆 /guruterajin - Lihat guru paling rajin bulan ini.\n";
                $pesan .= "🏅 /peringkatguru - Lihat klasemen tingkat kedisiplinan guru.\n";
                sendMessage($chatId, $pesan);
                break;

            case '/jadwalhariini':
                $hari_ini = $hari_indonesia[date('l')];
                $jadwal = ambilJadwal($pdo, $id_guru, $hari_ini);
                
                if (empty($jadwal)) {
                    sendMessage($chatId, "Bapak/Ibu <b>" . htmlspecialchars($nama_guru) . "</b>, Anda <b>tidak memiliki jadwal mengajar</b> pada hari ini ($hari_ini). Selamat beristirahat atau mengerjakan tugas lainnya! ☕");
                } else {
                    $pesan = "📅 <b>JADWAL HARI INI (" . strtoupper($hari_ini) . ")</b>\n\n";
                    foreach ($jadwal as $j) {
                        $ruangan = $j['nama_ruangan'] ?: 'Moving Class';
                        $pesan .= "⏰ <b>{$j['jam_masuk']} - {$j['jam_keluar']}</b> (Sesi {$j['jp_mulai']}-{$j['jp_selesai']})\n";
                        $pesan .= "📚 {$j['nama_mapel']}\n";
                        $pesan .= "👥 {$j['nama_kelas']} 📍 $ruangan\n\n";
                    }
                    sendMessage($chatId, $pesan);
                }
                break;

            case '/jadwalbesok':
                $hari_besok = $hari_indonesia[date('l', strtotime('+1 day'))];
                $jadwal = ambilJadwal($pdo, $id_guru, $hari_besok);
                
                if (empty($jadwal)) {
                    sendMessage($chatId, "Bapak/Ibu <b>" . htmlspecialchars($nama_guru) . "</b>, Anda <b>TIDAK ADA JADWAL</b> untuk hari esok ($hari_besok). 🎉");
                } else {
                    $pesan = "⏭ <b>PERSIAPAN JADWAL BESOK (" . strtoupper($hari_besok) . ")</b>\n\n";
                    foreach ($jadwal as $j) {
                        $ruangan = $j['nama_ruangan'] ?: 'Moving Class';
                        $pesan .= "⏰ <b>{$j['jam_masuk']} - {$j['jam_keluar']}</b> (Sesi {$j['jp_mulai']}-{$j['jp_selesai']})\n";
                        $pesan .= "📚 {$j['nama_mapel']} | 👥 {$j['nama_kelas']}\n\n";
                    }
                    sendMessage($chatId, $pesan);
                }
                break;

            case '/rekapbulanini':
                $bulan_ini = date('Y-m');
                $sql_rekap = "SELECT status, COUNT(*) as total FROM jurnal_kehadiran WHERE id_guru = ? AND is_tes = 0 AND DATE_FORMAT(tanggal, '%Y-%m') = ? GROUP BY status";
                $stmtRekap = $pdo->prepare($sql_rekap);
                $stmtRekap->execute([$id_guru, $bulan_ini]);
                $rekap = $stmtRekap->fetchAll(PDO::FETCH_KEY_PAIR);

                $hadir = isset($rekap['Hadir']) ? $rekap['Hadir'] : 0;
                $izin = isset($rekap['Tidak Hadir']) ? $rekap['Tidak Hadir'] : 0;

                $pesan = "📊 <b>REKAPITULASI BULAN INI (" . date('M Y') . ")</b>\n\n";
                $pesan .= "👨‍🏫 Guru: " . htmlspecialchars($nama_guru) . "\n";
                $pesan .= "✅ Total Hadir Mengajar: <b>$hadir Sesi</b>\n";
                $pesan .= "ℹ️ Total Izin/Berhalangan: <b>$izin Sesi</b>\n\n";
                $pesan .= "<i>Catatan: Data ini tersinkronisasi otomatis dengan server sekolah.</i>";
                sendMessage($chatId, $pesan);
                break;

            case '/guruterajin':
                $bulan_ini = date('Y-m');
                $sql_rajin = "SELECT g.nama_guru, 
                               COUNT(h.id_kehadiran) as total_hadir,
                               SUM(
                                   CASE 
                                       WHEN h.waktu_absen > w.jam_mulai THEN CEIL(TIME_TO_SEC(TIMEDIFF(h.waktu_absen, w.jam_mulai))/60) 
                                       ELSE 0 
                                   END
                               ) as total_telat_menit
                        FROM master_guru g
                        JOIN jurnal_kehadiran h ON g.id_guru = h.id_guru 
                        JOIN jadwal_pelajaran j ON h.id_jadwal = j.id_jadwal
                        JOIN master_waktu_jp w ON j.jp_mulai = w.urutan_jp
                        WHERE h.status = 'Hadir' AND h.is_tes = 0 AND DATE_FORMAT(h.tanggal, '%Y-%m') = ?
                        GROUP BY g.id_guru
                        HAVING total_hadir > 0
                        ORDER BY total_hadir DESC, total_telat_menit ASC LIMIT 1";
                
                $stmtRajin = $pdo->prepare($sql_rajin);
                $stmtRajin->execute([$bulan_ini]);
                $rajin = $stmtRajin->fetch();

                if ($rajin) {
                    $pesan = "🏆 <b>GURU PALING RAJIN BULAN INI</b> 🏆\n\n";
                    $pesan .= "Apresiasi tertinggi diberikan kepada:\n";
                    $pesan .= "🎉 <b>Bapak/Ibu " . htmlspecialchars($rajin['nama_guru']) . "</b> 🎉\n\n";
                    $pesan .= "📈 <b>{$rajin['total_hadir']} Sesi</b> Kehadiran\n";
                    $pesan .= "⏱ Hanya <b>{$rajin['total_telat_menit']} Menit</b> Total Keterlambatan\n\n";
                    $pesan .= "<i>Dedikasi Anda adalah inspirasi bagi seluruh civitas akademika SMKN 1 Sukalarang.</i>";
                } else {
                    $pesan = "Belum ada data kehadiran kelas yang tercatat pada bulan ini.";
                }
                sendMessage($chatId, $pesan);
                break;

            case '/peringkatguru':
                $bulan_ini = date('Y-m');
                $sql_peringkat = "SELECT g.nama_guru, 
                               COUNT(h.id_kehadiran) as total_hadir,
                               SUM(
                                   CASE 
                                       WHEN h.waktu_absen > w.jam_mulai THEN CEIL(TIME_TO_SEC(TIMEDIFF(h.waktu_absen, w.jam_mulai))/60) 
                                       ELSE 0 
                                   END
                               ) as total_telat_menit
                        FROM master_guru g
                        JOIN jurnal_kehadiran h ON g.id_guru = h.id_guru 
                        JOIN jadwal_pelajaran j ON h.id_jadwal = j.id_jadwal
                        JOIN master_waktu_jp w ON j.jp_mulai = w.urutan_jp
                        WHERE h.status = 'Hadir' AND h.is_tes = 0 AND DATE_FORMAT(h.tanggal, '%Y-%m') = ?
                        GROUP BY g.id_guru
                        HAVING total_hadir > 0
                        ORDER BY total_hadir DESC, total_telat_menit ASC LIMIT 15";
                        
                $stmtPeringkat = $pdo->prepare($sql_peringkat);
                $stmtPeringkat->execute([$bulan_ini]);
                $peringkat = $stmtPeringkat->fetchAll();

                if (count($peringkat) > 0) {
                    $pesan = "📊 <b>KLASEMEN KEDISIPLINAN GURU</b> 📊\n";
                    $pesan .= "<i>Periode: " . date('M Y') . " (Top 15)</i>\n\n";
                    
                    $no = 1;
                    foreach ($peringkat as $p) {
                        $medali = ($no == 1) ? '🥇' : (($no == 2) ? '🥈' : (($no == 3) ? '🥉' : "<b>$no.</b>"));
                        $pesan .= "{$medali} <b>" . htmlspecialchars($p['nama_guru']) . "</b>\n";
                        $pesan .= "      └ Masuk: <b>{$p['total_hadir']}</b> Sesi | Telat: <b>{$p['total_telat_menit']}</b> Mnt\n";
                        $no++;
                    }
                    $pesan .= "\n<i>Peringkat diurutkan berdasarkan kehadiran terbanyak, lalu persentase keterlambatan terkecil.</i>";
                } else {
                    $pesan = "Belum ada rekam jejak mengajar di bulan ini.";
                }
                sendMessage($chatId, $pesan);
                break;

            default:
                if(strpos($text, '/') === 0) {
                    sendMessage($chatId, "Maaf, perintah <b>$text</b> tidak dikenali. Ketik /bantuan untuk melihat daftar menu.");
                }
                break;
        }
    } else {
        // JIKA GURU BELUM TERDAFTAR (HANYA BISA /START)
        if ($text === '/start') {
            $replyMarkup = [
                'keyboard' => [
                    [
                        ['text' => '📱 Bagikan Nomor HP untuk Registrasi', 'request_contact' => true]
                    ]
                ],
                'resize_keyboard' => true,
                'one_time_keyboard' => true
            ];
            $pesan = "Selamat datang di <b>Bot Simkuring SMKN 1 Sukalarang</b>!\n\nUntuk menghubungkan jadwal mengajar Anda, silakan tekan tombol <b>'Bagikan Nomor HP'</b> di bawah ini agar kami dapat memverifikasi identitas Anda.";
            sendMessage($chatId, $pesan, $replyMarkup);
        }
    }

    // ============================================
    // PROSES PENCOCOKAN NOMOR HP (ANTI GAGAL)
    // ============================================
    if (isset($message['contact'])) {
        $phoneNumber = $message['contact']['phone_number'];
        $cleanPhone = preg_replace('/[^0-9]/', '', $phoneNumber);
        if (substr($cleanPhone, 0, 2) == '62') { $cleanPhone = '0' . substr($cleanPhone, 2); }

        $stmtAll = $pdo->query("SELECT id_guru, nama_guru, no_telepon FROM master_guru");
        $all_guru = $stmtAll->fetchAll();
        $guruMatch = null;

        foreach ($all_guru as $g) {
            $dbPhone = preg_replace('/[^0-9]/', '', $g['no_telepon']);
            if (substr($dbPhone, 0, 2) == '62') { $dbPhone = '0' . substr($dbPhone, 2); }
            if ($dbPhone === $cleanPhone || (!empty($dbPhone) && strpos($dbPhone, substr($cleanPhone, -9)) !== false)) {
                $guruMatch = $g;
                break;
            }
        }

        if ($guruMatch) {
            $stmtUpdate = $pdo->prepare("UPDATE master_guru SET telegram_chat_id = ? WHERE id_guru = ?");
            $stmtUpdate->execute([$chatId, $guruMatch['id_guru']]);

            $removeKeyboard = ['remove_keyboard' => true];
            $pesanSukses = "✅ <b>Registrasi Berhasil!</b>\n\nSelamat datang, Bapak/Ibu <b>" . htmlspecialchars($guruMatch['nama_guru']) . "</b>.\n\nKini Anda dapat menggunakan perintah seperti /jadwalhariini atau ketik /bantuan untuk melihat menu asisten yang tersedia.";
            sendMessage($chatId, $pesanSukses, $removeKeyboard);
        } else {
            $removeKeyboard = ['remove_keyboard' => true];
            sendMessage($chatId, "❌ <b>Registrasi Gagal!</b>\nNomor HP Anda ($phoneNumber) tidak ditemukan di sistem. Silakan hubungi Administrator untuk memastikan nomor Anda terdaftar dengan benar.", $removeKeyboard);
        }
    }
}

// ============================================
// 2. JIKA GURU KLIK TOMBOL INLINE (PRA-VALIDASI)
// ============================================
if (isset($update['callback_query'])) {
    $callbackQuery = $update['callback_query'];
    $chatId = $callbackQuery['message']['chat']['id'];
    $dataCallback = $callbackQuery['data']; 
    $messageId = $callbackQuery['message']['message_id'];
    
    $tanggal_hari_ini = date('Y-m-d');
    $waktu_sekarang = date('H:i:s');

    if (strpos($dataCallback, 'HADIR_') === 0) {
        $id_jadwal = str_replace('HADIR_', '', $dataCallback);
        
        // AMBIL DATA JADWAL DAN GURU UNTUK PRA-VALIDASI
        $sql_cek = "SELECT j.jp_mulai, j.hari, bg.id_guru, w1.jam_mulai as batas_masuk 
                    FROM jadwal_pelajaran j 
                    JOIN beban_mengajar_guru bg ON j.id_beban = bg.id_beban 
                    JOIN master_waktu_jp w1 ON j.jp_mulai = w1.urutan_jp 
                    WHERE j.id_jadwal = ?";
        $stmtCek = $pdo->prepare($sql_cek);
        $stmtCek->execute([$id_jadwal]);
        $jdwl = $stmtCek->fetch();

        if ($jdwl) {
            // 1. CEK APAKAH GURU SUDAH ABSEN?
            $stmtAbsen = $pdo->prepare("SELECT id_kehadiran FROM jurnal_kehadiran WHERE id_jadwal = ? AND id_guru = ? AND tanggal = ? AND is_tes = 0");
            $stmtAbsen->execute([$id_jadwal, $jdwl['id_guru'], $tanggal_hari_ini]);
            
            if ($stmtAbsen->rowCount() > 0) {
                // JIKA SUDAH ABSEN: Tarik tombolnya, ubah jadi teks.
                file_get_contents($apiUrl . "/editMessageText?" . http_build_query([
                    'chat_id' => $chatId, 
                    'message_id' => $messageId,
                    'text' => "✅ <b>Selesai!</b>\nAnda telah sukses melaporkan kehadiran dan mengisi jurnal untuk sesi kelas ini.",
                    'parse_mode' => 'HTML'
                ]));
            } else {
                // 2. CEK JENDELA WAKTU (Mencari jadwal selanjutnya agar link hangus jika kelas sudah ganti)
                $sql_next = "SELECT w.jam_mulai 
                             FROM jadwal_pelajaran jn
                             JOIN beban_mengajar_guru bgn ON jn.id_beban = bgn.id_beban
                             JOIN master_waktu_jp w ON jn.jp_mulai = w.urutan_jp
                             WHERE bgn.id_guru = ? AND jn.hari = ? AND jn.jp_mulai > ?
                             ORDER BY jn.jp_mulai ASC LIMIT 1";
                $stmtNext = $pdo->prepare($sql_next);
                $stmtNext->execute([$jdwl['id_guru'], $jdwl['hari'], $jdwl['jp_mulai']]);
                $next_schedule = $stmtNext->fetch();

                $batas_tutup = $next_schedule ? $next_schedule['jam_mulai'] : '23:59:59';
                
                // Kamera baru bisa diakses 30 menit sebelum jadwal resmi
                $batas_buka = date('H:i:s', strtotime($jdwl['batas_masuk']) - (30 * 60));

                if ($waktu_sekarang > $batas_tutup) {
                    // JIKA KADALUARSA
                    file_get_contents($apiUrl . "/editMessageText?" . http_build_query([
                        'chat_id' => $chatId, 
                        'message_id' => $messageId,
                        'text' => "❌ <b>Sesi Telah Berakhir</b>\n\nKamera tidak dapat diakses karena jadwal kelas ini sudah lewat atau tertimpa oleh jadwal Anda yang selanjutnya.",
                        'parse_mode' => 'HTML'
                    ]));
                } elseif ($waktu_sekarang < $batas_buka) {
                    // JIKA TERLALU CEPAT: Munculkan Pop-up Alert di layar
                    file_get_contents($apiUrl . "/answerCallbackQuery?" . http_build_query([
                        'callback_query_id' => $callbackQuery['id'],
                        'text' => "⏳ Kelas belum dimulai!\nAnda baru dapat membuka kamera 30 menit sebelum jam pelajaran sesungguhnya dimulai.",
                        'show_alert' => true
                    ]));
                } else {
                    // WAKTU VALID -> BERIKAN TAUTAN KAMERA
                    $token = md5($id_jadwal . $chatId . date('Ymd')); 
                    $linkKamera = "https://simkuring.smkn1sukalarang.sch.id/absen_kamera.php?jdwl=$id_jadwal&token=$token";

                    file_get_contents($apiUrl . "/editMessageText?" . http_build_query([
                        'chat_id' => $chatId, 
                        'message_id' => $messageId,
                        'text' => "✅ Anda mengonfirmasi <b>Hadir</b>.\nSilakan klik tautan di bawah ini untuk mengambil foto kelas (Selfie & GPS):",
                        'parse_mode' => 'HTML',
                        'reply_markup' => json_encode([
                            'inline_keyboard' => [[ ['text' => '📸 Buka Kamera Kehadiran', 'url' => $linkKamera] ]]
                        ])
                    ]));
                }
            }
        }

    } elseif (strpos($dataCallback, 'TES_') === 0) {
        // MODE TES UJI COBA (Bypass pengecekan waktu agar Admin leluasa menguji)
        $id_jadwal = str_replace('TES_', '', $dataCallback);
        $token = md5($id_jadwal . $chatId . date('Ymd')); 
        $linkKamera = "https://simkuring.smkn1sukalarang.sch.id/absen_kamera.php?jdwl=$id_jadwal&token=$token&tes=1";
        
        file_get_contents($apiUrl . "/editMessageText?" . http_build_query([
            'chat_id' => $chatId, 
            'message_id' => $messageId,
            'text' => "🧪 <b>[MODE UJI COBA]</b>\nSilakan klik tautan di bawah untuk mengirim foto tes ke layar Smart TV:",
            'parse_mode' => 'HTML',
            'reply_markup' => json_encode([
                'inline_keyboard' => [[ ['text' => '📸 Buka Kamera Uji Coba', 'url' => $linkKamera] ]]
            ])
        ]));
        
    } elseif (strpos($dataCallback, 'TIDAK_') === 0) {
        // TAHAP 3: MENGARAHKAN TOMBOL 'TIDAK' KE FORM IZIN & TUGAS PIKET
        $id_jadwal = str_replace('TIDAK_', '', $dataCallback);
        $token = md5($id_jadwal . $chatId . date('Ymd')); 
        $linkIzin = "https://simkuring.smkn1sukalarang.sch.id/form_izin.php?jdwl=$id_jadwal&token=$token";
        
        file_get_contents($apiUrl . "/editMessageText?" . http_build_query([
            'chat_id' => $chatId, 
            'message_id' => $messageId,
            'text' => "⚠️ Anda mengonfirmasi <b>Berhalangan Hadir</b>.\n\nAgar kelas tetap tertib dan kondusif, silakan klik tautan di bawah ini untuk <b>Mengisi Instruksi & Melampirkan File Modul Tugas</b> yang akan diteruskan otomatis secara <i>Japri</i> ke Telegram <b>Guru Piket</b>:",
            'parse_mode' => 'HTML',
            'reply_markup' => json_encode([
                'inline_keyboard' => [[ ['text' => '📝 Buka Form Penugasan Piket', 'url' => $linkIzin] ]]
            ])
        ]));
    }
}
?>

