<?php
require __DIR__ . '/vendor/autoload.php';

consoleLog("Memulai Pembuatan Dokumen PDF Panduan via Standalone Dompdf...");

$htmlContent = <<<'HTML'
<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <title>Panduan Lengkap Integrasi Fingerprint — Powered by SyntaxTrust</title>
    <style>
        @page {
            margin: 90px 45px 65px 45px;
        }
        body {
            font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
            font-size: 10.5pt;
            line-height: 1.5;
            color: #1e293b;
        }

        /* Header & Footer Rules */
        header {
            position: fixed;
            top: -65px;
            left: 0px;
            right: 0px;
            height: 45px;
            border-bottom: 2px solid #0284c7;
            padding-bottom: 6px;
        }
        header table {
            width: 100%;
        }
        header .title {
            font-size: 8.5pt;
            font-weight: bold;
            color: #0f172a;
            text-transform: uppercase;
            letter-spacing: 0.5px;
        }
        header .brand {
            font-size: 8.5pt;
            font-weight: bold;
            color: #0284c7;
            text-align: right;
        }

        footer {
            position: fixed;
            bottom: -45px;
            left: 0px;
            right: 0px;
            height: 30px;
            border-top: 1px solid #cbd5e1;
            padding-top: 6px;
            font-size: 8pt;
            color: #64748b;
        }
        footer table {
            width: 100%;
        }
        footer .pagenum:before {
            content: counter(page);
        }

        /* Typography & Headings */
        h1.cover-title {
            font-size: 20pt;
            font-weight: 800;
            color: #0f172a;
            margin-top: 10px;
            margin-bottom: 5px;
            line-height: 1.25;
        }
        h2.cover-subtitle {
            font-size: 12pt;
            font-weight: 600;
            color: #0284c7;
            margin-top: 0;
            margin-bottom: 15px;
        }
        
        .badge-brand {
            display: inline-block;
            background-color: #0284c7;
            color: #ffffff;
            padding: 4px 12px;
            font-size: 8.5pt;
            font-weight: bold;
            border-radius: 4px;
            text-transform: uppercase;
            letter-spacing: 1px;
            margin-bottom: 12px;
        }

        h2.section-header {
            font-size: 13pt;
            font-weight: bold;
            color: #0f172a;
            border-bottom: 2px solid #e2e8f0;
            padding-bottom: 4px;
            margin-top: 22px;
            margin-bottom: 10px;
            page-break-after: avoid;
        }
        h3.subsection-header {
            font-size: 11pt;
            font-weight: bold;
            color: #0369a1;
            margin-top: 14px;
            margin-bottom: 6px;
            page-break-after: avoid;
        }

        /* Boxes & Callouts */
        .callout-box {
            background-color: #f0f9ff;
            border-left: 4px solid #0284c7;
            padding: 10px 14px;
            margin: 12px 0;
            border-radius: 0 6px 6px 0;
            font-size: 9.5pt;
        }
        .warning-box {
            background-color: #fff1f2;
            border-left: 4px solid #e11d48;
            padding: 10px 14px;
            margin: 12px 0;
            border-radius: 0 6px 6px 0;
            font-size: 9.5pt;
            color: #881337;
        }

        /* Diagrams & Code Blocks */
        .diagram-box {
            background-color: #0f172a;
            color: #38bdf8;
            font-family: 'Courier New', Courier, monospace;
            font-size: 8pt;
            padding: 12px;
            border-radius: 6px;
            white-space: pre;
            margin: 12px 0;
            line-height: 1.25;
        }
        code, pre {
            font-family: 'Courier New', Courier, monospace;
            background-color: #f1f5f9;
            color: #0f172a;
            font-size: 9pt;
        }
        pre {
            padding: 8px 10px;
            border-radius: 5px;
            border: 1px solid #cbd5e1;
            overflow-x: auto;
            white-space: pre-wrap;
            margin: 8px 0;
        }

        /* Lists & Tables */
        ul, ol {
            margin-top: 4px;
            margin-bottom: 10px;
            padding-left: 18px;
        }
        li {
            margin-bottom: 3px;
        }
        table.data-table {
            width: 100%;
            border-collapse: collapse;
            margin: 12px 0;
            font-size: 9pt;
        }
        table.data-table th, table.data-table td {
            border: 1px solid #cbd5e1;
            padding: 6px 8px;
            text-align: left;
        }
        table.data-table th {
            background-color: #f8fafc;
            color: #0f172a;
            font-weight: bold;
        }

        .text-center { text-align: center; }
        .font-bold { font-weight: bold; }
        .page-break { page-break-before: always; }
    </style>
</head>
<body>

    <!-- Header & Footer Canvas -->
    <header>
        <table>
            <tr>
                <td class="title">PANDUAN INTEGRASI MESIN FINGERSPOT & LARAVEL</td>
                <td class="brand">POWERED BY SYNTAXTRUST</td>
            </tr>
        </table>
    </header>

    <footer>
        <table>
            <tr>
                <td>Dokumentasi Resmi Sistem Absensi Real-Time — <strong>SyntaxTrust</strong></td>
                <td style="text-align: right;">Halaman <span class="pagenum"></span></td>
            </tr>
        </table>
    </footer>

    <!-- COVER SECTION -->
    <div style="text-align: center; padding-top: 20px; padding-bottom: 20px; border-bottom: 2px solid #e2e8f0; margin-bottom: 20px;">
        <span class="badge-brand">POWERED BY SYNTAXTRUST</span>
        <h1 class="cover-title">PANDUAN LENGKAP INTEGRASI REAL-TIME MESIN FINGERSPOT & LARAVEL WEB APP</h1>
        <h2 class="cover-subtitle">Manual Konfigurasi & Pengoperasian Local Connector Agent untuk Absensi Guru & Siswa</h2>
        <p style="font-size: 9pt; color: #64748b; margin-top: 10px;">
            <strong>Versi Dokumen:</strong> 1.0 (Produksi) &bull; 
            <strong>Tanggal Release:</strong> 15 Agustus 2026 &bull; 
            <strong>Pengembang:</strong> SyntaxTrust Technical Team
        </p>
    </div>

    <!-- 1. GAMBARAN UMUM ARSITEKTUR -->
    <h2 class="section-header">1. GAMBARAN UMUM ARSITEKTUR</h2>
    <p>
        Sistem Absensi Fingerprint ini dibangun menggunakan arsitektur <strong>Local Hybrid Sync Connector</strong>. Arsitektur ini memungkinkan mesin sidik jari fisik di sekolah terhubung secara real-time ke aplikasi web berbasis cloud <strong>tanpa memerlukan biaya langganan cloud Fingerspot harian maupun bulanan</strong>.
    </p>

    <div class="diagram-box">
┌───────────────────────────┐      Kabel LAN      ┌──────────────────────────────┐
│  Mesin Fingerspot Revo    │ ──────────────────> │ PC Gateway Lokal Sekolah     │
│  (IP: 192.168.0.50:8080)  │  (Download Log/Sync)│ (Aplikasi Fingerspot Personnel)│
└───────────────────────────┘                     └──────────────┬───────────────┘
                                                                 │ Database MySQL Port 3309 (fin_pro)
                                                                 ▼
┌───────────────────────────┐      HTTPS Push     ┌──────────────────────────────┐
│ Web Application Laravel   │ <────────────────── │ Local Connector Agent        │
│ (demo-absen-smk...)       │   (Tiap 10 Detik)   │ (node src/agent.js)          │
└───────────────────────────┘                     └──────────────────────────────┘
    </div>

    <div class="callout-box">
        <strong>Keunggulan Utama Sistem:</strong>
        <ul>
            <li><strong>0 Biaya Langganan Cloud:</strong> Sepenuhnya memanfaatkan jaringan LAN lokal dan database PC gateway.</li>
            <li><strong>Toleransi Offline (Offline Queue):</strong> Jika jaringan internet sekolah terputus, data scan jari tetap tersimpan aman di memori PC dan dikirim otomatis saat internet tersambung kembali.</li>
            <li><strong>Pemrosesan Real-Time:</strong> Data absensi terolah dalam 5-10 detik menjadi rekapitulasi Hadir, Terlambat, atau Alpha.</li>
            <li><strong>Skalabilitas Multi-Mesin:</strong> Mampu menangani dari 1 hingga 10+ mesin fingerprint secara simultan.</li>
        </ul>
    </div>

    <!-- 2. KONFIGURASI JARINGAN & MESIN FISIK -->
    <h2 class="section-header">2. KONFIGURASI JARINGAN & MESIN FISIK</h2>
    
    <h3 class="subsection-header">A. Pengaturan IP Kartu LAN Komputer Gateway (PC Sekolah)</h3>
    <p>PC Windows yang terhubung langsung ke mesin fingerprint via kabel LAN harus memiliki IP statis berikut:</p>
    <table class="data-table">
        <tr><th>Parameter Jaringan</th><th>Nilai Konfigurasi</th></tr>
        <tr><td>IP Address Kartu LAN</td><td><code>192.168.0.100</code></td></tr>
        <tr><td>Subnet Mask</td><td><code>255.255.255.0</code></td></tr>
        <tr><td>Default Gateway</td><td><code>192.168.0.1</code></td></tr>
    </table>

    <h3 class="subsection-header">B. Pengaturan Layar Mesin Fingerspot (Revo W-230N)</h3>
    <ol>
        <li>Tekan tombol <strong>[ MENU / OK ]</strong> pada tombol/layar mesin fisik.</li>
        <li>Masuk ke menu <strong>Comm / Komunikasi / Jaringan</strong> &rarr; <strong>Ethernet</strong>.</li>
        <li>Isi parameter jaringan mesin:
            <ul>
                <li><strong>IP Address:</strong> <code>192.168.0.50</code></li>
                <li><strong>Subnet Mask:</strong> <code>255.255.255.0</code></li>
                <li><strong>Gateway:</strong> <code>192.168.0.1</code></li>
                <li><strong>Comm Port:</strong> <code>8080</code></li>
            </ul>
        </li>
        <li>Tekan <strong>Simpan / Save</strong> dan matikan & nyalakan ulang mesin (Restart).</li>
    </ol>

    <h3 class="subsection-header">C. Pengujian Jaringan dari PC Windows</h3>
    <p>Buka Command Prompt (CMD) di PC Windows dan ketik perintah berikut untuk memverifikasi koneksi LAN:</p>
    <pre>ping 192.168.0.50</pre>
    <p><em>Pastikan output balasan menunjukkan <code>Reply from 192.168.0.50: bytes=32 time<5ms TTL=64</code>.</em></p>

    <div class="page-break"></div>

    <!-- 3. PENGATURAN APLIKASI FINGERSPOT PERSONNEL -->
    <h2 class="section-header">3. PENGATURAN APLIKASI FINGERSPOT PERSONNEL</h2>
    <p>
        Aplikasi desktop <strong>Fingerspot Personnel</strong> yang terinstal di PC sekolah berfungsi untuk menyinkronkan data dari mesin fingerprint ke database MySQL lokal (<code>fin_pro</code>).
    </p>

    <h3 class="subsection-header">A. Memastikan IP Mesin di Aplikasi Sesuai</h3>
    <ol>
        <li>Buka aplikasi <strong>Fingerspot Personnel 2024</strong> di Windows.</li>
        <li>Masuk ke tab menu <strong>Mesin</strong> &rarr; Klik tombol <strong>Pengaturan Mesin</strong>.</li>
        <li>Ubah nilai parameter:
            <ul>
                <li><strong>IP Address / URL:</strong> <code>192.168.0.50</code></li>
                <li><strong>Port:</strong> <code>8080</code></li>
            </ul>
        </li>
        <li>Klik <strong>Simpan</strong>.</li>
    </ol>

    <h3 class="subsection-header">B. Mengaktifkan Penarikan Otomatis (Auto Download)</h3>
    <p>Agar operator sekolah <strong>tidak perlu menekan tombol download secara manual</strong>:</p>
    <ol>
        <li>Masuk ke menu <strong>Pengaturan</strong> &rarr; <strong>Pengaturan Otomatis / Auto Download</strong>.</li>
        <li>Centang opsi <strong>Aktifkan Download Otomatis</strong>.</li>
        <li>Atur jeda penarikan otomatis (misal: setiap 1 menit atau 5 menit).</li>
        <li>Klik <strong>Simpan</strong>.</li>
    </ol>

    <div class="callout-box">
        <strong>Spesifikasi Database Internal Fingerspot Personnel:</strong>
        <table class="data-table" style="margin-top: 8px;">
            <tr><td>Engine Database</td><td>MySQL 5.1 (Embedded Engine Port 3309)</td></tr>
            <tr><td>Nama Database</td><td><code>fin_pro</code> (Tabel utama: <code>att_log</code>, <code>device</code>, <code>pegawai</code>)</td></tr>
            <tr><td>Kredensial Akses</td><td>User: <code>root</code> | Password: <code>Coba lagi lain kali 2015</code></td></tr>
        </table>
    </div>

    <!-- 4. KONFIGURASI & MENJALANKAN LOCAL CONNECTOR AGENT -->
    <h2 class="section-header">4. KONFIGURASI & MENJALANKAN LOCAL CONNECTOR AGENT</h2>
    
    <p>Local Connector Agent adalah layanan berbasis Node.js yang bertugas membaca database MySQL Fingerspot Personnel dan meneruskan data absensi ke server web Laravel.</p>

    <h3 class="subsection-header">A. Lokasi Folder Agent di PC</h3>
    <pre>C:\laragon\www\absen\local-connector</pre>

    <h3 class="subsection-header">B. File Konfigurasi `.env`</h3>
    <p>Buka file <code>.env</code> di folder <code>local-connector</code> dan pastikan parameternya sebagai berikut:</p>
    <pre>
# URL Target Web Application Laravel
LARAVEL_API_URL=https://demo-absen-smk.syntaxtrust.web.id

# Secret Token Autentikasi Connector
CONNECTOR_TOKEN=SK_LNK_SMKN1_9238491823
    </pre>

    <h3 class="subsection-header">C. Perintah Menjalankan Agent di PC Windows</h3>
    <p>Buka Command Prompt (CMD) atau Cmder dan jalankan perintah:</p>
    <pre>
cd C:\laragon\www\absen\local-connector
node src/agent.js
    </pre>

    <p>Terminal CMD akan menampilkan status agent aktif:</p>
    <div class="diagram-box">
╔══════════════════════════════════════════════════════╗
║ Local Connector Agent — Production DB Syncer Active ║
╠══════════════════════════════════════════════════════╣
║ Database Source: MySQL 127.0.0.1:3309 (fin_pro)     ║
║ Laravel Server : https://demo-absen-smk.syntaxtrust.web.id
╚══════════════════════════════════════════════════════╝

[PUSH_SUCCESS] 🎉 Record absensi BERHASIL TERKIRIM KE LARAVEL!
    </div>

    <div class="page-break"></div>

    <!-- 5. PEMETAAN DATA SISWA/GURU & PENGOPERASIAN WEB LARAVEL -->
    <h2 class="section-header">5. PEMETAAN DATA SISWA/GURU & PENGOPERASIAN WEB LARAVEL</h2>
    
    <div class="warning-box">
        <strong>Aturan Emas Pemetaan PIN (Sangat Penting):</strong><br>
        Agar data scan jari dicocokkan dengan tepat ke nama Siswa atau Guru di Web Laravel, pastikan:<br>
        <span style="font-size: 11pt; font-weight: bold; color: #0284c7;">PIN di Mesin Fingerprint = Kolom 'PIN Fingerprint' / 'NIP' / 'NIS' di Web Laravel</span>
    </div>

    <h3 class="subsection-header">A. Pemetaan Data Guru</h3>
    <ol>
        <li>Masuk ke Dashboard Laravel &rarr; Sidebar menu <strong>Data Guru & Siswa</strong> (atau <code>/users</code>).</li>
        <li>Pilih data Guru (atau tambah baru).</li>
        <li>Pada kolom <strong>PIN Fingerprint</strong> (atau <strong>NIP</strong>), masukkan nomor PIN yang sama dengan yang ada di mesin (contoh: PIN <code>10</code> untuk <em>Ahmad Fauzi, S.T.</em>).</li>
    </ol>

    <h3 class="subsection-header">B. Pemetaan Data Siswa</h3>
    <ol>
        <li>Masuk ke Dashboard Laravel &rarr; Sidebar menu <strong>Data Guru & Siswa</strong>.</li>
        <li>Pilih data Siswa (atau Import Excel / Tambah Baru).</li>
        <li>Pada kolom <strong>PIN Fingerprint</strong> (atau <strong>NIS/NISN</strong>), masukkan nomor PIN yang sama dengan di mesin (contoh: PIN <code>12</code> untuk <em>Andi Pratama</em>).</li>
    </ol>

    <h3 class="subsection-header">C. Memantau Status Agent & Kehadiran di Dashboard Web</h3>
    <ul>
        <li><strong>Banner Status Agent:</strong> Di halaman utama Dashboard (<code>/dashboard</code>), widget <strong>Local Connector Agent: ONLINE (ACTIVE)</strong> berwarna hijau menandakan koneksi dari PC sekolah ke cloud terhubung lancar.</li>
        <li><strong>Ringkasan Statistik:</strong> Menampilkan total Guru, total Siswa, jumlah mesin aktif, serta rekapitulasi Hadir, Terlambat, Izin, Sakit, dan Alpha secara real-time.</li>
    </ul>

    <h3 class="subsection-header">D. Meninjau Riwayat Absensi & Audit Log</h3>
    <ul>
        <li><strong>Menu Laporan Kehadiran (<code>/reports</code>):</strong> Menampilkan tabel rekap absensi harian Siswa & Guru lengkap dengan jam masuk, jam pulang, dan status keterlambatan.</li>
        <li><strong>Menu Monitoring Aplikasi (<code>/system-monitoring</code>):</strong> Menampilkan daftar log mentah (Raw Log) yang baru saja terkirim dari agent lokal beserta timestamp dan status pemrosesan.</li>
    </ul>

    <!-- 6. SKALABILITAS MULTI-MESIN -->
    <h2 class="section-header">6. SKALABILITAS MULTI-MESIN (2 HINGGA 10+ MESIN)</h2>
    <p>
        Sistem dirancang secara dinamis sehingga mumpuni untuk mendukung <strong>2, 6, hingga 10+ mesin fingerprint sekaligus</strong> di lokasi berbeda tanpa perlu mengubah kode agent maupun file <code>.env</code>.
    </p>

    <h3 class="subsection-header">Langkah Menambah Mesin Baru di Masa Depan:</h3>
    <ol>
        <li><strong>Di Aplikasi Fingerspot Personnel (PC Sekolah):</strong> Masuk ke menu Mesin &rarr; Tambah Mesin Baru &rarr; Masukkan IP & Nama Mesin baru tersebut.</li>
        <li><strong>Di Connector Agent (PC Sekolah):</strong> <em>TIDAK PERLU DIUBAH.</em> Agent otomatis mengambil log dari seluruh mesin yang terdaftar di database.</li>
        <li><strong>Di Web Laravel (Cloud):</strong> Masuk ke menu <strong>Mesin Fingerprint</strong> (<code>/machines</code>) &rarr; Tambah Mesin Baru &rarr; Masukkan Nama Mesin & Serial Number / IP-nya.</li>
    </ol>

    <!-- 7. TROUBLESHOOTING & FAQ -->
    <h2 class="section-header">7. TROUBLESHOOTING & SOLUSI KENDALA (FAQ)</h2>
    
    <table class="data-table">
        <tr>
            <th style="width: 35%;">Gejala Kendala</th>
            <th>Penyebab & Solusi Penanganan</th>
        </tr>
        <tr>
            <td><strong>Status Agent OFFLINE di Dashboard Web</strong></td>
            <td><strong>Penyebab:</strong> Perintah agent di PC mati atau PC terputus internet.<br><strong>Solusi:</strong> Buka CMD di PC sekolah dan jalankan <code>node src/agent.js</code>.</td>
        </tr>
        <tr>
            <td><strong>Fingerspot Personnel error "Tidak bisa terhubung dengan mesin"</strong></td>
            <td><strong>Penyebab:</strong> IP mesin di aplikasi Fingerspot berbeda dengan IP fisik mesin.<br><strong>Solusi:</strong> Buka Fingerspot Personnel &rarr; Mesin &rarr; Pengaturan Mesin &rarr; Ubah IP ke <code>192.168.0.50</code> port <code>8080</code>.</td>
        </tr>
        <tr>
            <td><strong>Nama Siswa/Guru belum muncul di Laporan Kehadiran</strong></td>
            <td><strong>Penyebab:</strong> PIN di mesin belum diinput pada data Siswa/Guru di web.<br><strong>Solusi:</strong> Masukkan PIN mesin ke kolom <em>PIN Fingerprint</em> pada menu Data Guru & Siswa di Web.</td>
        </tr>
        <tr>
            <td><strong>Koneksi internet sekolah terputus seharian</strong></td>
            <td><strong>Jaminan:</strong> Data TIDAK hilang. Agent menyimpan data di <em>Local Queue System</em> dan otomatis mengirimkannya saat internet kembali aktif.</td>
        </tr>
    </table>

    <br><br>
    <div style="text-align: center; border-top: 1px dashed #cbd5e1; padding-top: 15px; color: #64748b; font-size: 9pt;">
        <strong>POWERED BY SYNTAXTRUST TECHNICAL TEAM</strong><br>
        <em>Smart Biometric Attendance & Multi-Machine Connector System &bull; https://syntaxtrust.web.id</em>
    </div>

</body>
</html>
HTML;

function consoleLog($msg) {
    echo "[" . date('H:i:s') . "] $msg\n";
}

$dompdf = new \Dompdf\Dompdf();
$dompdf->loadHtml($htmlContent);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();

$pdfPath = __DIR__ . '/Panduan_Integrasi_Fingerprint_SyntaxTrust.pdf';
file_put_contents($pdfPath, $dompdf->output());

consoleLog("✅ PDF BERHASIL DIBUAT DENGAN SUKSES!");
consoleLog("Path PDF : $pdfPath");
consoleLog("Ukuran   : " . filesize($pdfPath) . " bytes");
