<?php
// ═══════════════════════════════════════════════════════════════
// notifikasi_spp.php
// Jalankan via CRON setiap hari jam 07:00 pagi:
//   0 7 * * * php /home/abdulura/public_html/spp_admin/cron/notifikasi_spp.php
//
// Fungsi:
//   1. H-5 (tgl 25 tiap bulan) — kirim peringatan akan jatuh tempo
//   2. H+1 (tgl 1 tiap bulan)  — kirim notifikasi sudah terlambat
// ═══════════════════════════════════════════════════════════════

require_once dirname(__DIR__) . '/config/db.php';
require_once dirname(__DIR__) . '/config/telegram_notify.php';

$hari    = (int)date('j');   // tanggal hari ini (1-31)
$bulan   = (int)date('n');   // bulan sekarang
$tahun   = (int)date('Y');

// Tentukan bulan tagihan yang dicek
// H-5 (tgl 25): cek tagihan bulan INI yang belum lunas
// H+1 (tgl 1) : cek tagihan bulan LALU yang belum lunas
if ($hari === 25) {
    $modeCek    = 'peringatan';
    $bulanCek   = $bulan;
    $tahunCek   = $tahun;
    $judulMode  = '⚠️ Peringatan Jatuh Tempo';
} elseif ($hari === 1) {
    $modeCek    = 'terlambat';
    // Bulan lalu
    if ($bulan === 1) { $bulanCek = 12; $tahunCek = $tahun - 1; }
    else              { $bulanCek = $bulan - 1; $tahunCek = $tahun; }
    $judulMode  = '🔴 Tagihan Terlambat';
} else {
    // Tidak ada yang perlu dikirim hari ini
    echo date('Y-m-d H:i:s') . " — Tidak ada notifikasi hari ini (tgl $hari)\n";
    exit;
}

$bulanNama = ['','Januari','Februari','Maret','April','Mei','Juni',
              'Juli','Agustus','September','Oktober','November','Desember'];

echo date('Y-m-d H:i:s') . " — Mode: $modeCek | Bulan: {$bulanNama[$bulanCek]} $tahunCek\n";

// ── Ambil semua tagihan belum lunas di bulan tersebut ─────────────
$stmt = $pdo->prepare("
    SELECT
        t.id          AS tagihan_id,
        t.nominal,
        t.status,
        s.id          AS siswa_id,
        s.nama,
        s.nis,
        s.kelas,
        s.jurusan,
        s.no_hp,
        u.telegram_chat_id,
        COALESCE(SUM(p.jumlah_bayar), 0) AS sudah_bayar
    FROM tagihan_spp t
    JOIN siswa s ON t.siswa_id = s.id
    LEFT JOIN pembayaran p ON p.tagihan_id = t.id
    LEFT JOIN users u ON u.siswa_id = s.id AND u.role = 'siswa'
    WHERE t.bulan = ?
      AND t.tahun = ?
      AND t.status != 'lunas'
      AND s.status = 'aktif'
    GROUP BY t.id, s.id, u.telegram_chat_id
    ORDER BY s.kelas, s.nama
");
$stmt->execute([$bulanCek, $tahunCek]);
$tagihan = $stmt->fetchAll(PDO::FETCH_ASSOC);

if (empty($tagihan)) {
    echo "✅ Semua tagihan {$bulanNama[$bulanCek]} $tahunCek sudah lunas.\n";
    exit;
}

$totalSiswa  = count($tagihan);
$totalNominal = array_sum(array_column($tagihan, 'nominal'));
$totalBayar  = array_sum(array_column($tagihan, 'sudah_bayar'));
$totalSisa   = $totalNominal - $totalBayar;

echo "Ditemukan $totalSiswa siswa belum lunas.\n";

// ── 1. Kirim ringkasan ke Admin ───────────────────────────────────
kirimNotifikasiAdmin($pdo, $tagihan, $modeCek, $bulanNama[$bulanCek], $tahunCek,
                     $totalSiswa, $totalSisa);

// ── 2. Kirim notifikasi personal ke tiap siswa ────────────────────
$kirimSiswa = 0;
foreach ($tagihan as $t) {
    $chatId = $t['telegram_chat_id'] ?? '';
    if (empty($chatId)) continue;

    $sisa   = (int)$t['nominal'] - (int)$t['sudah_bayar'];
    $status = $t['status'] === 'cicilan' ? 'Cicilan (Belum Lunas)' : 'Belum Bayar';

    if ($modeCek === 'peringatan') {
        $pesan = "⚠️ *Peringatan SPP* ⚠️\n\n"
               . "Halo *{$t['nama']}*,\n\n"
               . "SPP bulan *{$bulanNama[$bulanCek]} $tahunCek* Anda belum lunas.\n\n"
               . "📋 Detail:\n"
               . "• NIS    : {$t['nis']}\n"
               . "• Kelas  : {$t['kelas']} {$t['jurusan']}\n"
               . "• Nominal: Rp " . number_format($t['nominal'],0,',','.') . "\n"
               . "• Dibayar: Rp " . number_format($t['sudah_bayar'],0,',','.') . "\n"
               . "• *Sisa  : Rp " . number_format($sisa,0,',','.') . "*\n\n"
               . "⏰ Segera lakukan pembayaran sebelum akhir bulan.\n"
               . "Terima kasih 🙏";
    } else {
        $pesan = "🔴 *SPP Terlambat* 🔴\n\n"
               . "Halo *{$t['nama']}*,\n\n"
               . "SPP bulan *{$bulanNama[$bulanCek]} $tahunCek* Anda *TERLAMBAT*.\n\n"
               . "📋 Detail:\n"
               . "• NIS    : {$t['nis']}\n"
               . "• Kelas  : {$t['kelas']} {$t['jurusan']}\n"
               . "• Status : $status\n"
               . "• *Sisa  : Rp " . number_format($sisa,0,',','.') . "*\n\n"
               . "⚠️ Harap segera hubungi bendahara sekolah untuk melakukan pembayaran.\n"
               . "Terima kasih 🙏";
    }

    $ok = kirimTelegram($chatId, $pesan);
    if ($ok) $kirimSiswa++;
    usleep(300000); // delay 0.3 detik antar pesan agar tidak rate-limit
}

echo "✅ Notifikasi siswa terkirim: $kirimSiswa dari $totalSiswa\n";

// ── Log hasil ─────────────────────────────────────────────────────
$logFile = dirname(__DIR__) . '/logs/notifikasi_' . date('Y-m') . '.log';
if (!is_dir(dirname($logFile))) mkdir(dirname($logFile), 0755, true);
file_put_contents($logFile,
    date('Y-m-d H:i:s') . " | $modeCek | {$bulanNama[$bulanCek]} $tahunCek"
    . " | $totalSiswa siswa | siswa terkirim: $kirimSiswa\n",
    FILE_APPEND
);


// ════════════════════════════════════════════════════════════════
// FUNGSI HELPER
// ════════════════════════════════════════════════════════════════

function kirimNotifikasiAdmin(PDO $pdo, array $tagihan, string $mode,
                               string $bulanNama, int $tahun,
                               int $total, int $totalSisa): void
{
    // Ambil semua chat_id admin dari tabel pengaturan
    try {
        $rows = $pdo->query(
            "SELECT nilai FROM pengaturan WHERE kunci = 'telegram_admin_chat_id' LIMIT 1"
        )->fetch(PDO::FETCH_ASSOC);
        $adminChatId = $rows['nilai'] ?? '';
    } catch (Exception $e) {
        $adminChatId = '';
    }

    if (empty($adminChatId)) {
        echo "⚠️  Admin chat_id belum dikonfigurasi di pengaturan.\n";
        return;
    }

    // Buat daftar siswa (max 30 baris agar tidak terlalu panjang)
    $daftar = '';
    $i = 1;
    foreach ($tagihan as $t) {
        $sisa   = (int)$t['nominal'] - (int)$t['sudah_bayar'];
        $status = $t['status'] === 'cicilan' ? '🔄' : '⏳';
        $daftar .= "$i. $status {$t['nama']} ({$t['kelas']}) — Rp " . number_format($sisa,0,',','.') . "\n";
        if ($i >= 30) { $daftar .= "... dan " . ($total - 30) . " siswa lainnya\n"; break; }
        $i++;
    }

    $emoji = $mode === 'peringatan' ? '⚠️' : '🔴';
    $judul = $mode === 'peringatan' ? 'PERINGATAN JATUH TEMPO' : 'LAPORAN KETERLAMBATAN SPP';

    $pesan = "$emoji *$judul* $emoji\n\n"
           . "📅 Periode  : *$bulanNama $tahun*\n"
           . "👥 Belum lunas : *$total siswa*\n"
           . "💰 Total sisa  : *Rp " . number_format($totalSisa,0,',','.') . "*\n\n"
           . "📋 *Daftar Siswa:*\n$daftar\n"
           . "🕐 " . date('d/m/Y H:i') . " WIB";

    $ok = kirimTelegram($adminChatId, $pesan);
    echo $ok ? "✅ Notifikasi admin terkirim.\n" : "❌ Gagal kirim ke admin.\n";
}

function kirimTelegram(string $chatId, string $pesan): bool {
    // Ambil token dari config
    $token = defined('TELEGRAM_BOT_TOKEN') ? TELEGRAM_BOT_TOKEN : '';
    if (empty($token) || empty($chatId)) return false;

    $url  = "https://api.telegram.org/bot{$token}/sendMessage";
    $data = http_build_query([
        'chat_id'    => $chatId,
        'text'       => $pesan,
        'parse_mode' => 'Markdown',
    ]);

    $ctx = stream_context_create([
        'http' => [
            'method'  => 'POST',
            'header'  => "Content-Type: application/x-www-form-urlencoded\r\n",
            'content' => $data,
            'timeout' => 10,
        ]
    ]);

    $result = @file_get_contents($url, false, $ctx);
    if ($result === false) return false;

    $json = json_decode($result, true);
    return $json['ok'] ?? false;
}