<?php

namespace Midtrans;

require_once dirname(__FILE__) . '/../vendor/autoload.php';

// Masukkan file-file yang diperlukan
include("../include/koneksi.php");
include("../include/routeros_api.php"); // Pastikan path ini benar

// Ambil kunci Midtrans dari database
$queryP = $koneksi->query("SELECT * FROM tbl_pgate WHERE id_pgat=1");
$tokenP = $queryP->fetch_assoc();
Config::$serverKey = $tokenP['serverrkey'];
Config::$isProduction = true; // Set ke true untuk mode produksi
Config::$isSanitized = true;
Config::$is3ds = true;

try {
    // Buat instance notifikasi
    $notif = new Notification();

    $transaction_status = $notif->transaction_status;
    $order_id = $notif->order_id;

    // Proses hanya jika transaksi berhasil (status 'settlement' atau 'capture')
    if ($transaction_status == 'settlement' || $transaction_status == 'capture') {

        // 1. Ambil ID Tagihan Asli dari order_id
        list($id_tagihan, $timestamp) = explode('-', $order_id);
        $id_tagihan = (int)$id_tagihan;

        // 2. Periksa apakah tagihan ini sudah pernah diproses sebelumnya
        $stmt_check = $koneksi->prepare("SELECT status_bayar FROM tb_tagihan WHERE id_tagihan = ?");
        $stmt_check->bind_param("i", $id_tagihan);
        $stmt_check->execute();
        $result_check = $stmt_check->get_result();
        $tagihan_sebelumnya = $result_check->fetch_assoc();

        // Jika tagihan belum lunas (status_bayar bukan 1), maka proses.
        // Ini untuk mencegah pemrosesan ganda.
        if ($tagihan_sebelumnya && $tagihan_sebelumnya['status_bayar'] != 1) {

            // 3. Ambil data lengkap pelanggan untuk proses selanjutnya
            $stmt_data = $koneksi->prepare(
                "SELECT p.id_pelanggan, p.nama_pelanggan, p.no_telp, p.ip_address, p.paket, u.username, t.jml_bayar, pk.nama_paket
                 FROM tb_tagihan t 
                 JOIN tb_pelanggan p ON t.id_pelanggan = p.id_pelanggan 
                 JOIN tb_user u ON p.id_pelanggan = u.id_pelanggan
                 JOIN tb_paket pk ON p.paket = pk.id_paket
                 WHERE t.id_tagihan = ?"
            );
            $stmt_data->bind_param("i", $id_tagihan);
            $stmt_data->execute();
            $result_data = $stmt_data->get_result();
            $data = $result_data->fetch_assoc();

            $id_pelanggan = $data['id_pelanggan'];
            $tanggal_bayar = date('Y-m-d');

            // 4. Update status tagihan menjadi LUNAS
            $stmt_update_tagihan = $koneksi->prepare("UPDATE tb_tagihan SET status_bayar = 1, tgl_bayar = ?, blokir_status = NULL, waktu_bayar = NOW() WHERE id_tagihan = ?");
            $stmt_update_tagihan->bind_param("si", $tanggal_bayar, $id_tagihan);
            $stmt_update_tagihan->execute();
            
            // 5. LOGIKA BARU: Hitung dan update jatuh tempo berikutnya
            $jatuh_tempo_berikutnya = date('Y-m-d', strtotime('+1 month', strtotime($tanggal_bayar)));
            $stmt_update_pelanggan = $koneksi->prepare("UPDATE tb_pelanggan SET jatuh_tempo = ? WHERE id_pelanggan = ?");
            $stmt_update_pelanggan->bind_param("si", $jatuh_tempo_berikutnya, $id_pelanggan);
            $stmt_update_pelanggan->execute();

            // 6. Masukkan ke buku kas
            $ket_kas = "Pembayaran Internet AN. " . $data['nama_pelanggan'] . ", Paket " . $data['nama_paket'];
            $stmt_kas = $koneksi->prepare("INSERT INTO tb_kas (tgl_kas, keterangan, penerimaan, id_tagihan) VALUES (?, ?, ?, ?)");
            $stmt_kas->bind_param("ssii", $tanggal_bayar, $ket_kas, $data['jml_bayar'], $id_tagihan);
            $stmt_kas->execute();

            // 7. Proses buka blokir di MikroTik
            $mikrotik_q = $koneksi->query("SELECT * FROM tbl_mikrotik WHERE id_mikrotik = 1");
            $mikrotik_data = $mikrotik_q->fetch_assoc();
            $config_pelanggan_q = $koneksi->query("SELECT * FROM tbl_penggunamikrotik");
            $config_pelanggan = $config_pelanggan_q->fetch_assoc();

            if ($mikrotik_data) {
                $API = new \RouterosAPI();
                if ($API->connect($mikrotik_data['ip'], $mikrotik_data['username'], $mikrotik_data['password'])) {
                    if ($config_pelanggan['ippelanggan'] == 'statik') {
                        // Logika untuk menghapus dari address-list (unblock)
                        $commentToSearch = "Blokir Otomatis: " . $data['nama_pelanggan'];
                        $lists = $API->comm("/ip/firewall/address-list/print", ["?comment" => $commentToSearch]);
                        if (!empty($lists)) {
                            $API->comm("/ip/firewall/address-list/remove", [".id" => $lists[0]['.id']]);
                        }
                    } else { // Asumsi PPPoE
                        // Logika untuk mengaktifkan kembali user PPPoE
                        $secrets = $API->comm("/ppp/secret/print", ["?name" => $data['username']]);
                        if (!empty($secrets)) {
                            $API->comm("/ppp/secret/enable", [".id" => $secrets[0]['.id']]);
                        }
                    }
                    $API->disconnect();
                }
            }

            // 8. Kirim Notifikasi Pembayaran Lunas via Fonnte
            $fonnte_q = $koneksi->query("SELECT * FROM tbl_token LIMIT 1");
            $fonnte_data = $fonnte_q->fetch_assoc();
            $notif_q = $koneksi->query("SELECT * FROM tbl_notifbayar LIMIT 1");
            $notif_data = $notif_q->fetch_assoc();

            if ($fonnte_data && $notif_data) {
                $pesan_template = $notif_data['pesan_bayar'];
                $placeholders = ['$nama', '$tagihan', '$harinin', '$no_telp'];
                $values = [
                    $data['nama_pelanggan'],
                    'Rp ' . number_format($data['jml_bayar'], 0, ',', '.'),
                    date('d F Y H:i:s'),
                    $data['no_telp']
                ];
                $pesan_final = str_replace($placeholders, $values, $pesan_template);

                $curl = curl_init();
                curl_setopt_array($curl, [
                    CURLOPT_URL => 'https://api.fonnte.com/send',
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_TIMEOUT => 30,
                    CURLOPT_CUSTOMREQUEST => 'POST',
                    CURLOPT_POSTFIELDS => ['target' => $data['no_telp'], 'message' => $pesan_final, 'countryCode' => '62'],
                    CURLOPT_HTTPHEADER => ['Authorization: ' . $fonnte_data['token']],
                ]);
                curl_exec($curl);
                curl_close($curl);
            }
        }
    }

} catch (\Exception $e) {
    // Sebaiknya catat error ke file log, bukan ditampilkan ke publik
    error_log($e->getMessage());
    // Beri respons HTTP error agar Midtrans tahu ada masalah
    http_response_code(500);
}

// Beri respons OK ke Midtrans untuk mengonfirmasi notifikasi telah diterima
http_response_code(200);

?>