================================================================================
PERBANDINGAN KODE: CARA LAMA vs CARA BARU (MENGIKUTI MIKHMON ADMIN)
================================================================================

1. INCLUDE FILES
================

CARA LAMA (GAGAL):
------------------
<?php
session_start();
error_reporting(E_ALL);
ini_set('display_errors', 1);

include('../include/db_config.php');
include('../include/config.php');
include('../lib/Agent.class.php');
include('../lib/routeros_api.class.php');
?>

MASALAH:
❌ Fungsi helper tidak tersedia (randNULC, randLC, dll)
❌ Error reporting terlalu verbose
❌ Tidak set timezone

CARA BARU (BERHASIL) - MENGIKUTI MIKHMON ADMIN:
-----------------------------------------------
<?php
session_start();
error_reporting(0);
ini_set('max_execution_time', 300);

// Include files seperti MikhMon admin
include('../include/db_config.php');
include('../include/config.php');
include('../lib/Agent.class.php');
include('../lib/routeros_api.class.php');

// Set timezone
date_default_timezone_set('Asia/Jakarta');
?>

KEUNTUNGAN:
✅ Fungsi helper tersedia (dari routeros_api.class.php)
✅ Error handling seperti MikhMon admin
✅ Timezone sudah diset
✅ Max execution time 300 detik untuk generate banyak voucher

================================================================================

2. KONEKSI MIKROTIK
===================

CARA LAMA (GAGAL):
------------------
// Menggunakan API bridge yang kompleks
$_POST['agent_id'] = $_SESSION['agent_id'];
$_POST['agent_token'] = $agentToken;

ob_start();
include('../api/agent_generate_voucher.php');
$response = ob_get_clean();

$result = json_decode($response, true);

MASALAH:
❌ Terlalu kompleks dengan API bridge
❌ Banyak layer yang bisa error
❌ Sulit debug jika gagal
❌ Response tidak konsisten

CARA BARU (BERHASIL) - MENGIKUTI MIKHMON ADMIN:
-----------------------------------------------
// Koneksi langsung seperti MikhMon admin
if (!$session || !isset($data[$session])) {
    $error = 'Session MikroTik tidak ditemukan.';
} else {
    $iphost = explode('!', $data[$session][1])[1];
    $userhost = explode('@|@', $data[$session][2])[1];
    $passwdhost = explode('#|#', $data[$session][3])[1];
    
    $API = new RouterosAPI();
    $API->debug = false;
    
    if ($API->connect($iphost, $userhost, decrypt($passwdhost))) {
        // Generate voucher
    }
}

KEUNTUNGAN:
✅ Koneksi langsung ke MikroTik
✅ Menggunakan session admin yang sudah ada
✅ Lebih simple dan reliable
✅ Mudah debug jika error
✅ Cara yang TERBUKTI BERHASIL di MikhMon admin

================================================================================

3. GENERATE USERNAME & PASSWORD
===============================

CARA LAMA (GAGAL):
------------------
// Hardcode atau random sederhana
$username = 'AG' . time() . rand(1000, 9999);
$password = rand(100000, 999999);

MASALAH:
❌ Username terlalu panjang
❌ Password hanya angka
❌ Tidak konsisten dengan MikhMon
❌ Tidak menggunakan fungsi MikhMon

CARA BARU (BERHASIL) - MENGIKUTI MIKHMON ADMIN:
-----------------------------------------------
// Menggunakan fungsi MikhMon yang sudah ada
$username = 'AG' . randNULC(8);
$password = randNULC(6);
$comment = 'Agent-' . $agentData['agent_code'] . '-' . date('d.m.y');

KEUNTUNGAN:
✅ Username: AG + 8 karakter random (angka + huruf)
   Contoh: AG5aB2c34D
✅ Password: 6 karakter random (angka + huruf)
   Contoh: 5aB2c3
✅ Konsisten dengan format MikhMon
✅ Menggunakan fungsi yang sudah TERBUKTI BERHASIL

FUNGSI YANG TERSEDIA:
- randN($length)      → Random angka
- randUC($length)     → Random huruf besar
- randLC($length)     → Random huruf kecil
- randNLC($length)    → Random angka + huruf kecil
- randNUC($length)    → Random angka + huruf besar
- randNULC($length)   → Random angka + huruf besar + huruf kecil

================================================================================

4. ADD USER KE MIKROTIK
=======================

CARA LAMA (GAGAL):
------------------
// Melalui API bridge
$postData = [
    'username' => $username,
    'password' => $password,
    'profile' => $profileName
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData));
$response = curl_exec($ch);

MASALAH:
❌ Terlalu kompleks
❌ Butuh API bridge tambahan
❌ Banyak point of failure
❌ Sulit debug

CARA BARU (BERHASIL) - MENGIKUTI MIKHMON ADMIN:
-----------------------------------------------
// Langsung ke MikroTik seperti admin
$API->comm("/ip/hotspot/user/add", array(
    "server" => "all",
    "name" => $username,
    "password" => $password,
    "profile" => $profileName,
    "comment" => $comment,
));

KEUNTUNGAN:
✅ Langsung ke MikroTik API
✅ Tidak butuh API bridge
✅ Simple dan reliable
✅ Cara yang SAMA dengan MikhMon admin
✅ Mudah debug jika error

================================================================================

5. LOOP GENERATE MULTIPLE VOUCHER
=================================

CARA LAMA (GAGAL):
------------------
for ($i = 0; $i < $quantity; $i++) {
    // Generate voucher
}

MASALAH:
❌ Index mulai dari 0
❌ Tidak konsisten dengan MikhMon

CARA BARU (BERHASIL) - MENGIKUTI MIKHMON ADMIN:
-----------------------------------------------
for ($i = 1; $i <= $quantity; $i++) {
    // Generate voucher
}

KEUNTUNGAN:
✅ Index mulai dari 1 (seperti MikhMon admin)
✅ Lebih natural untuk counting
✅ Konsisten dengan cara MikhMon

================================================================================

6. ERROR HANDLING
=================

CARA LAMA (GAGAL):
------------------
if (!$result) {
    $error = 'Generate gagal';
}

MASALAH:
❌ Error message tidak jelas
❌ Tidak ada detail error
❌ Sulit troubleshooting

CARA BARU (BERHASIL) - MENGIKUTI MIKHMON ADMIN:
-----------------------------------------------
if (!$session || !isset($data[$session])) {
    $error = 'Session MikroTik tidak ditemukan. Pastikan admin sudah login.';
} else if (!$priceData) {
    $error = 'Harga untuk profile ini belum diset. Hubungi admin.';
} else if ($agentData['balance'] < $totalCost) {
    $error = 'Saldo tidak mencukupi. Saldo: ' . formatRupiah($agentData['balance']) . 
             ', Dibutuhkan: ' . formatRupiah($totalCost);
} else if (!$API->connect($iphost, $userhost, decrypt($passwdhost))) {
    $error = 'Gagal terhubung ke MikroTik. Periksa koneksi.';
}

KEUNTUNGAN:
✅ Error message jelas dan spesifik
✅ User tahu apa yang harus dilakukan
✅ Mudah troubleshooting
✅ Professional error handling

================================================================================

7. SAVE TO DATABASE
===================

CARA LAMA (SAMA):
-----------------
$sql = "INSERT INTO agent_vouchers (...) VALUES (...)";
$stmt = $db->prepare($sql);
$stmt->execute([...]);

CARA BARU (SAMA):
-----------------
$sql = "INSERT INTO agent_vouchers (...) VALUES (...)";
$stmt = $db->prepare($sql);
$stmt->execute([...]);

CATATAN:
✅ Bagian ini sudah benar dari awal
✅ Tidak perlu diubah

================================================================================

KESIMPULAN PERBANDINGAN:
========================

CARA LAMA:
----------
❌ Menggunakan API bridge yang kompleks
❌ Banyak layer yang bisa error
❌ Fungsi helper tidak tersedia
❌ Sulit debug dan troubleshooting
❌ Tidak konsisten dengan MikhMon admin

CARA BARU (MENGIKUTI MIKHMON ADMIN):
------------------------------------
✅ Koneksi langsung ke MikroTik
✅ Menggunakan fungsi yang sudah TERBUKTI BERHASIL
✅ Simple dan reliable
✅ Mudah debug dan troubleshooting
✅ Konsisten dengan MikhMon admin
✅ Menggunakan kode yang SAMA dengan admin

FILOSOFI:
=========
"Jangan reinvent the wheel. Gunakan kode yang sudah TERBUKTI BERHASIL!"

MikhMon admin sudah berhasil generate voucher dengan cara tertentu.
Maka agent panel juga harus menggunakan CARA YANG SAMA.

Ini adalah best practice dalam software development:
- Code reuse
- Consistency
- Reliability
- Maintainability

================================================================================

REKOMENDASI:
============

1. ✅ GUNAKAN cara baru (mengikuti MikhMon admin)
2. ✅ HAPUS API bridge yang tidak perlu
3. ✅ GUNAKAN fungsi helper yang sudah ada
4. ✅ IKUTI pattern yang sudah TERBUKTI BERHASIL
5. ✅ JANGAN membuat solusi yang terlalu kompleks

"Keep it simple, stupid!" (KISS principle)

================================================================================
