<?php
require('fpdf/fpdf.php');
include 'config.php';

$kelas = $_GET['kelas'] ?? '';
$bulan = $_GET['bulan'] ?? date('m');
$tahun = $_GET['tahun'] ?? date('Y');

// Dapatkan tanggal hari ini untuk perbandingan
$hariIni = date('d');
$bulanIni = date('m');
$tahunIni = date('Y');

$jumlahHari = cal_days_in_month(CAL_GREGORIAN, $bulan, $tahun);

// Ambil nama sekolah dan profil lengkap
$profil = mysqli_fetch_assoc(mysqli_query($conn, "SELECT nama_sekolah, alamat, kepala_sekolah, nip_kepala FROM profil_sekolah LIMIT 1"));
$nama_sekolah = $profil['nama_sekolah'] ?? 'Nama Sekolah';
$alamat_sekolah = $profil['alamat'] ?? '';

// Ambil daftar hari libur dari database
$libur = [];
$queryLibur = mysqli_query($conn, "SELECT tanggal FROM hari_libur");
while ($row = mysqli_fetch_assoc($queryLibur)) {
    $libur[] = $row['tanggal'];
}

// Ambil data wali kelas
$wali_nama = '....................................';
$wali_nip = '........................';
if ($kelas != '') {
    $qWali = mysqli_query($conn, "SELECT nama_wali, nip_wali FROM wali_kelas WHERE kelas = '$kelas' LIMIT 1");
    if ($w = mysqli_fetch_assoc($qWali)) {
        $wali_nama = $w['nama_wali'];
        $wali_nip = $w['nip_wali'];
    }
}

// Ambil daftar kelas untuk pengurutan
$kelasList = mysqli_query($conn, "SELECT DISTINCT kelas FROM siswa WHERE status='aktif' ORDER BY CAST(kelas AS UNSIGNED), kelas");

// Ambil daftar siswa - DIURUTKAN BERDASARKAN KELAS (KECIL KE BESAR) DAN NAMA
$sqlSiswa = "SELECT id, nis, nama, kelas FROM siswa WHERE status='aktif'";
if ($kelas != '') {
    $sqlSiswa .= " AND kelas = '$kelas'";
}
$sqlSiswa .= " ORDER BY CAST(kelas AS UNSIGNED), kelas, nama";
$siswaResult = mysqli_query($conn, $sqlSiswa);

// Ambil data absensi
$absensi = [];
$absensiQuery = "SELECT a.*, s.nis, s.nama FROM absensi a 
                 JOIN siswa s ON a.siswa_id = s.id 
                 WHERE MONTH(a.tanggal) = '$bulan' 
                   AND YEAR(a.tanggal) = '$tahun'
                   AND s.status='aktif'";
if ($kelas != '') {
    $absensiQuery .= " AND s.kelas = '$kelas'";
}
$resultAbsensi = mysqli_query($conn, $absensiQuery);

while ($row = mysqli_fetch_assoc($resultAbsensi)) {
    $sid = $row['siswa_id'];
    $tgl = (int)date('j', strtotime($row['tanggal']));
    $absensi[$sid][$tgl] = $row['status'];
}

// Ambil data izin yang disetujui
$izin_data = [];
$izinQuery = "SELECT p.siswa_id, p.tanggal_izin, p.jenis_izin, p.keterangan 
              FROM perizinan p 
              JOIN siswa s ON p.siswa_id = s.id 
              WHERE MONTH(p.tanggal_izin) = '$bulan' 
              AND YEAR(p.tanggal_izin) = '$tahun' 
              AND s.status='aktif'
              AND p.status = 'approved'";
if ($kelas != '') {
    $izinQuery .= " AND s.kelas = '$kelas'";
}
$resultIzin = mysqli_query($conn, $izinQuery);

while ($izin = mysqli_fetch_assoc($resultIzin)) {
    $sid = $izin['siswa_id'];
    $tgl = (int)date('j', strtotime($izin['tanggal_izin']));
    $jenis = $izin['jenis_izin'];
    // Konversi jenis izin ke format status
    if ($jenis == 'Sakit' || $jenis == 'S') {
        $izin_data[$sid][$tgl] = 'S';
    } else {
        $izin_data[$sid][$tgl] = 'I';
    }
}

// Hitung rekap dan persentase - HANYA UNTUK SISWA YANG DITAMPILKAN (SESUAI FILTER)
$totalGlobal = ['H' => 0, 'I' => 0, 'S' => 0, 'A' => 0];
$rekapSiswa = [];
$totalSiswa = 0;

mysqli_data_seek($siswaResult, 0);
while ($siswa = mysqli_fetch_assoc($siswaResult)) {
    $sid = $siswa['id'];
    $rekapSiswa[$sid] = [
        'nis' => $siswa['nis'],
        'nama' => $siswa['nama'],
        'kelas' => $siswa['kelas'],
        'H' => 0, 'I' => 0, 'S' => 0, 'A' => 0
    ];
    $totalSiswa++;

    for ($i = 1; $i <= $jumlahHari; $i++) {
        $tanggal = "$tahun-" . str_pad($bulan, 2, '0', STR_PAD_LEFT) . "-" . str_pad($i, 2, '0', STR_PAD_LEFT);
        $day = date('w', strtotime($tanggal));
        $isLibur = in_array($tanggal, $libur);

        // Tentukan apakah hari ini adalah hari mendatang
        $isHariMendatang = false;
        if ($tahun == $tahunIni && $bulan == $bulanIni && $i > $hariIni) {
            $isHariMendatang = true;
        } elseif ($tahun == $tahunIni && $bulan > $bulanIni) {
            $isHariMendatang = true;
        } elseif ($tahun > $tahunIni) {
            $isHariMendatang = true;
        }

        // Cek status berdasarkan prioritas: izin > absensi
        $status = '';
        if (isset($izin_data[$sid][$i])) {
            $status = $izin_data[$sid][$i];
        } elseif (isset($absensi[$sid][$i])) {
            $status = $absensi[$sid][$i];
        } else {
            if ($day == 0 || $isLibur || $isHariMendatang) {
                continue; // Tidak dihitung dalam rekap
            } else {
                $status = 'A';
            }
        }

        if ($status != '') {
            $rekapSiswa[$sid][$status]++;
            $totalGlobal[$status]++;
        }
    }
}

// Hitung persentase per siswa
foreach ($rekapSiswa as $sid => $data) {
    $totalAbsen = $data['H'] + $data['I'] + $data['S'] + $data['A'];
    $persen = $totalAbsen > 0 ? round(($data['H'] / $totalAbsen) * 100, 1) : 0;
    $rekapSiswa[$sid]['persen'] = $persen;
}

// Hitung persentase per kelas (berdasarkan data yang sudah difilter)
$persentasePerKelas = [];
foreach ($rekapSiswa as $sid => $data) {
    $kelasSiswa = $data['kelas'];
    if (!isset($persentasePerKelas[$kelasSiswa])) {
        $persentasePerKelas[$kelasSiswa] = ['totalHadir' => 0, 'totalAbsen' => 0];
    }
    $totalHadirSiswa = $data['H'];
    $totalAbsenSiswa = $data['H'] + $data['I'] + $data['S'] + $data['A'];
    $persentasePerKelas[$kelasSiswa]['totalHadir'] += $totalHadirSiswa;
    $persentasePerKelas[$kelasSiswa]['totalAbsen'] += $totalAbsenSiswa;
}

// Urutkan persentase per kelas berdasarkan kelas (dari kecil ke besar)
uksort($persentasePerKelas, function($a, $b) {
    return intval($a) - intval($b);
});

// Hitung persentase global (berdasarkan data yang sudah difilter)
$totalAbsenGlobal = $totalGlobal['H'] + $totalGlobal['I'] + $totalGlobal['S'] + $totalGlobal['A'];
$persentaseGlobal = $totalAbsenGlobal > 0 ? round(($totalGlobal['H'] / $totalAbsenGlobal) * 100, 1) : 0;

// Ambil nama kota/kabupaten dari alamat sekolah (asumsi kata terakhir setelah koma)
$kota = '';
if (!empty($alamat_sekolah)) {
    $alamat_parts = explode(',', $alamat_sekolah);
    $kota = trim(end($alamat_parts));
}
if (empty($kota)) {
    $kota = '....................';
}

// Format tanggal untuk TTD: Kota, 04 March 2026
$tanggal_ttd = $kota . ', ' . date('d F Y', strtotime("$tahun-$bulan-" . cal_days_in_month(CAL_GREGORIAN, $bulan, $tahun)));

// --- Cetak PDF dengan tampilan modern ---
class PDF extends FPDF
{
    // Header dengan desain modern
    function Header()
    {
        global $nama_sekolah, $alamat_sekolah, $kelas, $bulan, $tahun;
        
        // Garis header
        $this->SetDrawColor(41, 128, 185);
        $this->SetLineWidth(1);
        $this->Line(10, 15, 287, 15);
        
        $this->SetY(20);
        $this->SetFont('Arial', 'B', 18);
        $this->SetTextColor(41, 128, 185);
        $this->Cell(0, 10, $nama_sekolah, 0, 1, 'C');
        
        if (!empty($alamat_sekolah)) {
            $this->SetFont('Arial', '', 10);
            $this->SetTextColor(100, 100, 100);
            $this->Cell(0, 5, $alamat_sekolah, 0, 1, 'C');
        }
        
        $this->SetFont('Arial', 'B', 14);
        $this->SetTextColor(52, 73, 94);
        $this->Ln(3);
        $this->Cell(0, 8, 'LAPORAN REKAPITULASI ABSENSI SISWA', 0, 1, 'C');
        
        $this->SetFont('Arial', 'B', 12);
        $this->SetTextColor(46, 204, 113);
        $this->Cell(0, 7, 'Bulan: ' . date('F Y', strtotime("$tahun-$bulan-01")), 0, 1, 'C');
        
        if ($kelas != '') {
            $this->Cell(0, 7, "Kelas: $kelas", 0, 1, 'C');
        } else {
            $this->Cell(0, 7, "Kelas: Semua Kelas", 0, 1, 'C');
        }
        
        $this->SetTextColor(0, 0, 0);
        $this->Ln(8);
        
        // Garis pemisah
        $this->SetDrawColor(189, 195, 199);
        $this->SetLineWidth(0.5);
        $this->Line(10, $this->GetY(), 287, $this->GetY());
        $this->Ln(5);
    }

    // Footer dengan desain modern
    function Footer()
    {
        $this->SetY(-20);
        $this->SetDrawColor(41, 128, 185);
        $this->SetLineWidth(0.5);
        $this->Line(10, $this->GetY(), 287, $this->GetY());
        
        $this->SetY(-15);
        $this->SetFont('Arial', 'I', 8);
        $this->SetTextColor(127, 140, 141);
        $this->Cell(0, 10, 'Halaman ' . $this->PageNo() . ' | Dicetak pada: ' . date('d-m-Y H:i:s'), 0, 0, 'C');
    }

    // Fungsi untuk membuat cell dengan warna background
    function ColoredCell($w, $h, $txt, $border=0, $align='C', $bgcolor=null)
    {
        if ($bgcolor) {
            list($r, $g, $b) = $bgcolor;
            $this->SetFillColor($r, $g, $b);
            $this->Cell($w, $h, $txt, $border, 0, $align, true);
        } else {
            $this->Cell($w, $h, $txt, $border, 0, $align);
        }
    }
}

$pdf = new PDF('L', 'mm', 'A4');
$pdf->AddPage();
$pdf->SetFont('Arial', '', 8);
$pdf->SetTextColor(0, 0, 0);

// --- Ringkasan Persentase dengan desain modern ---
$pdf->SetFont('Arial', 'B', 10);
$pdf->SetFillColor(236, 240, 241);
$pdf->Cell(0, 8, 'RINGKASAN PERSENTASE KEHADIRAN', 0, 1, 'L', true);
$pdf->Ln(2);

// Layout grid 2 kolom untuk ringkasan
$pdf->SetFont('Arial', 'B', 9);

// Baris 1: Global
$pdf->Cell(50, 8, 'Persentase Global:', 0, 0, 'L');
$pdf->SetFont('Arial', '', 9);
$pdf->Cell(30, 8, $persentaseGlobal . '%', 0, 0, 'L');

$pdf->SetFont('Arial', 'B', 9);
$pdf->Cell(50, 8, 'Total Hadir:', 0, 0, 'L');
$pdf->SetFont('Arial', '', 9);
$pdf->Cell(30, 8, $totalGlobal['H'] . ' kali', 0, 1, 'L');

$pdf->SetFont('Arial', 'B', 9);
$pdf->Cell(50, 8, 'Total Izin:', 0, 0, 'L');
$pdf->SetFont('Arial', '', 9);
$pdf->Cell(30, 8, $totalGlobal['I'] . ' kali', 0, 0, 'L');

$pdf->SetFont('Arial', 'B', 9);
$pdf->Cell(50, 8, 'Total Sakit:', 0, 0, 'L');
$pdf->SetFont('Arial', '', 9);
$pdf->Cell(30, 8, $totalGlobal['S'] . ' kali', 0, 1, 'L');

$pdf->SetFont('Arial', 'B', 9);
$pdf->Cell(50, 8, 'Total Alpha:', 0, 0, 'L');
$pdf->SetFont('Arial', '', 9);
$pdf->Cell(30, 8, $totalGlobal['A'] . ' kali', 0, 0, 'L');

$pdf->SetFont('Arial', 'B', 9);
$pdf->Cell(50, 8, 'Jumlah Siswa:', 0, 0, 'L');
$pdf->SetFont('Arial', '', 9);
$pdf->Cell(30, 8, $totalSiswa . ' siswa', 0, 1, 'L');

$pdf->SetFont('Arial', 'B', 9);
$pdf->Cell(50, 8, 'Hari Efektif:', 0, 0, 'L');
$pdf->SetFont('Arial', '', 9);
$pdf->Cell(30, 8, $jumlahHari . ' hari', 0, 1, 'L');

// Ringkasan per kelas (jika filter "Semua Kelas" atau menampilkan kelas yang difilter)
if (!empty($persentasePerKelas)) {
    $pdf->Ln(3);
    $pdf->SetFont('Arial', 'B', 9);
    $pdf->SetFillColor(240, 248, 255);
    
    if ($kelas == '') {
        $pdf->Cell(0, 6, 'Persentase per Kelas:', 0, 1, 'L', true);
    } else {
        $pdf->Cell(0, 6, 'Persentase Kelas ' . $kelas . ':', 0, 1, 'L', true);
    }
    
    $pdf->SetFont('Arial', '', 9);
    $pdf->Cell(40, 6, 'Kelas', 1, 0, 'C');
    $pdf->Cell(40, 6, 'Total Hadir', 1, 0, 'C');
    $pdf->Cell(40, 6, 'Total Absen', 1, 0, 'C');
    $pdf->Cell(40, 6, 'Persentase', 1, 1, 'C');
    
    foreach ($persentasePerKelas as $kel => $data) {
        $persen = $data['totalAbsen'] > 0 ? round(($data['totalHadir'] / $data['totalAbsen']) * 100, 1) : 0;
        $pdf->Cell(40, 6, $kel, 1, 0, 'C');
        $pdf->Cell(40, 6, $data['totalHadir'], 1, 0, 'C');
        $pdf->Cell(40, 6, $data['totalAbsen'], 1, 0, 'C');
        $pdf->Cell(40, 6, $persen . '%', 1, 1, 'C');
    }
}

$pdf->Ln(8);

// --- Tabel Absensi dengan desain modern ---
$pdf->SetFont('Arial', 'B', 8);
$pdf->SetFillColor(52, 152, 219);
$pdf->SetTextColor(255, 255, 255);

// Header tabel
$pdf->Cell(10, 8, 'No', 1, 0, 'C', true);
$pdf->Cell(20, 8, 'NIS', 1, 0, 'C', true);
$pdf->Cell(45, 8, 'Nama Siswa', 1, 0, 'C', true);
$pdf->Cell(12, 8, 'Kelas', 1, 0, 'C', true);

// Kolom tanggal
for ($i = 1; $i <= $jumlahHari; $i++) {
    $pdf->Cell(5, 8, $i, 1, 0, 'C', true);
}

// Kolom rekap
$pdf->Cell(8, 8, 'H', 1, 0, 'C', true);
$pdf->Cell(8, 8, 'S', 1, 0, 'C', true);
$pdf->Cell(8, 8, 'I', 1, 0, 'C', true);
$pdf->Cell(8, 8, 'A', 1, 0, 'C', true);
$pdf->Cell(12, 8, '%', 1, 1, 'C', true);

$pdf->SetTextColor(0, 0, 0);
$pdf->SetFont('Arial', '', 7);

// Isi tabel
$no = 1;
mysqli_data_seek($siswaResult, 0);
while ($siswa = mysqli_fetch_assoc($siswaResult)) {
    $sid = $siswa['id'];
    
    // Cek apakah masih muat di halaman, jika tidak tambah halaman baru
    if ($pdf->GetY() > 180) {
        $pdf->AddPage();
        // Ulang header tabel di halaman baru
        $pdf->SetFont('Arial', 'B', 8);
        $pdf->SetFillColor(52, 152, 219);
        $pdf->SetTextColor(255, 255, 255);
        $pdf->Cell(10, 8, 'No', 1, 0, 'C', true);
        $pdf->Cell(20, 8, 'NIS', 1, 0, 'C', true);
        $pdf->Cell(45, 8, 'Nama Siswa', 1, 0, 'C', true);
        $pdf->Cell(12, 8, 'Kelas', 1, 0, 'C', true);
        for ($i = 1; $i <= $jumlahHari; $i++) {
            $pdf->Cell(5, 8, $i, 1, 0, 'C', true);
        }
        $pdf->Cell(8, 8, 'H', 1, 0, 'C', true);
        $pdf->Cell(8, 8, 'S', 1, 0, 'C', true);
        $pdf->Cell(8, 8, 'I', 1, 0, 'C', true);
        $pdf->Cell(8, 8, 'A', 1, 0, 'C', true);
        $pdf->Cell(12, 8, '%', 1, 1, 'C', true);
        $pdf->SetTextColor(0, 0, 0);
        $pdf->SetFont('Arial', '', 7);
    }
    
    $pdf->Cell(10, 6, $no, 1, 0, 'C');

    // NIS
    $pdf->Cell(20, 6, $siswa['nis'], 1, 0, 'C');

    // Nama - dipotong jika terlalu panjang agar tidak tumpang tindih
    $nama = $siswa['nama'];
    $maxChar = 25;
    if (strlen($nama) > $maxChar) {
        $nama = substr($nama, 0, $maxChar - 3) . '...';
    }
    $pdf->Cell(45, 6, $nama, 1, 0, 'L');

    // Kelas
    $pdf->Cell(12, 6, $siswa['kelas'], 1, 0, 'C');

    $countH = $countS = $countI = $countA = 0;

    for ($i = 1; $i <= $jumlahHari; $i++) {
        $tanggal = "$tahun-" . str_pad($bulan, 2, '0', STR_PAD_LEFT) . "-" . str_pad($i, 2, '0', STR_PAD_LEFT);
        $day = date('w', strtotime($tanggal));
        $isLibur = in_array($tanggal, $libur);

        // Tentukan apakah hari ini adalah hari mendatang
        $isHariMendatang = false;
        if ($tahun == $tahunIni && $bulan == $bulanIni && $i > $hariIni) {
            $isHariMendatang = true;
        } elseif ($tahun == $tahunIni && $bulan > $bulanIni) {
            $isHariMendatang = true;
        } elseif ($tahun > $tahunIni) {
            $isHariMendatang = true;
        }

        // Cek status berdasarkan prioritas: izin > absensi
        $status = '';
        if (isset($izin_data[$sid][$i])) {
            $status = $izin_data[$sid][$i];
        } elseif (isset($absensi[$sid][$i])) {
            $status = $absensi[$sid][$i];
        } else {
            if ($day == 0 || $isLibur) {
                $pdf->SetTextColor(255, 0, 0);
                $pdf->Cell(5, 6, 'L', 1, 0, 'C');
                $pdf->SetTextColor(0, 0, 0);
                continue;
            } elseif ($isHariMendatang) {
                $pdf->Cell(5, 6, '', 1, 0, 'C');
                continue;
            } else {
                $status = 'A';
            }
        }

        // Update counter berdasarkan status
        if ($status == 'H') $countH++;
        elseif ($status == 'S') $countS++;
        elseif ($status == 'I') $countI++;
        elseif ($status == 'A') $countA++;

        // Tampilkan status dengan warna
        if ($status == 'H') {
            $pdf->SetTextColor(39, 174, 96); // Hijau
            $pdf->Cell(5, 6, 'H', 1, 0, 'C');
        } elseif ($status == 'S') {
            $pdf->SetTextColor(241, 196, 15); // Kuning
            $pdf->Cell(5, 6, 'S', 1, 0, 'C');
        } elseif ($status == 'I') {
            $pdf->SetTextColor(52, 152, 219); // Biru
            $pdf->Cell(5, 6, 'I', 1, 0, 'C');
        } elseif ($status == 'A') {
            $pdf->SetTextColor(192, 57, 43); // Merah
            $pdf->Cell(5, 6, 'A', 1, 0, 'C');
        }
        $pdf->SetTextColor(0, 0, 0);
    }

    // Kolom rekap
    $pdf->Cell(8, 6, $countH, 1, 0, 'C');
    $pdf->Cell(8, 6, $countS, 1, 0, 'C');
    $pdf->Cell(8, 6, $countI, 1, 0, 'C');
    $pdf->Cell(8, 6, $countA, 1, 0, 'C');
    
    // Kolom persentase dengan background berdasarkan nilai
    $persen = $rekapSiswa[$sid]['persen'];
    if ($persen >= 90) {
        $pdf->SetFillColor(208, 235, 212); // Hijau muda
    } elseif ($persen >= 75) {
        $pdf->SetFillColor(255, 235, 156); // Kuning muda
    } else {
        $pdf->SetFillColor(250, 210, 210); // Merah muda
    }
    $pdf->Cell(12, 6, $persen . '%', 1, 1, 'C', true);

    $no++;
}

$pdf->Ln(8);

// Keterangan dengan desain modern
$pdf->SetFont('Arial', 'B', 9);
$pdf->SetFillColor(236, 240, 241);
$pdf->Cell(0, 6, 'KETERANGAN:', 0, 1, 'L', true);
$pdf->SetFont('Arial', '', 8);

// Buat tabel keterangan
$pdf->Cell(30, 5, 'H = Hadir', 0, 0, 'L');
$pdf->Cell(30, 5, 'S = Sakit', 0, 0, 'L');
$pdf->Cell(30, 5, 'I = Izin', 0, 0, 'L');
$pdf->Cell(30, 5, 'A = Alpha', 0, 0, 'L');
$pdf->Cell(30, 5, 'L = Libur/Minggu', 0, 1, 'L');

$pdf->Cell(0, 4, '* Data sudah sinkron dengan scan QR dan izin yang disetujui', 0, 1, 'L');
$pdf->Cell(0, 4, '* Warna hijau (>=90%), kuning (75-89%), merah (<75%)', 0, 1, 'L');
$pdf->Ln(5);

// Tanda tangan dengan desain modern - JARAK RAPAT
$pdf->SetFont('Arial', '', 10);
$pdf->Cell(95, 5, 'Mengetahui,', 0, 0, 'L');
$pdf->Cell(95, 5, $tanggal_ttd, 0, 1, 'R');
$pdf->Ln(5); // Jarak 5mm (rapat)

$pdf->Cell(95, 5, 'Kepala Sekolah', 0, 0, 'L');
$pdf->Cell(95, 5, 'Wali Kelas ' . ($kelas != '' ? $kelas : '(Semua Kelas)'), 0, 1, 'R');
$pdf->Ln(12); // Jarak untuk tanda tangan

$pdf->SetFont('Arial', 'B', 11);
$pdf->SetTextColor(41, 128, 185);
$pdf->Cell(95, 5, $profil['kepala_sekolah'] ?? '....................................', 0, 0, 'L');
$pdf->Cell(95, 5, $wali_nama, 0, 1, 'R');

$pdf->SetFont('Arial', '', 10);
$pdf->SetTextColor(0, 0, 0);
$pdf->Cell(95, 5, 'NIP. ' . ($profil['nip_kepala'] ?? '........................'), 0, 0, 'L');
$pdf->Cell(95, 5, 'NIP. ' . $wali_nip, 0, 1, 'R');

$pdf->Output();
?>	