<?php
ini_set('display_errors', 0);
ini_set('log_errors', 1);
error_reporting(E_ALL);
set_exception_handler(function($e) {
    file_put_contents(__DIR__ . '/debug_error.log', date('[Y-m-d H:i:s] ') . 'Exception: ' . $e->getMessage() . ' in ' . $e->getFile() . ':' . $e->getLine() . "\n", FILE_APPEND);
    header('Content-Type: application/json');
    echo json_encode(['status' => 'error', 'msg' => 'Server error: ' . $e->getMessage()]);
    exit;
});
set_error_handler(function($errno, $errstr, $errfile, $errline) {
    file_put_contents(__DIR__ . '/debug_error.log', date('[Y-m-d H:i:s] ') . "Error[$errno]: $errstr in $errfile:$errline\n", FILE_APPEND);
    if (in_array($errno, [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
        header('Content-Type: application/json');
        echo json_encode(['status' => 'error', 'msg' => "PHP Error: $errstr"]);
        exit;
    }
    return false;
});
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
header('Content-Type: application/json');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit(); }

require_once 'config.php';

$input = json_decode(file_get_contents('php://input'), true) ?? [];
$action = $input['action'] ?? '';

$token = $input['token'] ?? '';
$db = getDB();
$t = $db->real_escape_string($token);
$sesi = $db->query("SELECT * FROM sesi WHERE token='$t' AND expired_at > NOW()")->fetch_assoc();
if (!$sesi) jsonResponse(['status' => 'error', 'msg' => 'Sesi tidak valid']);

$kode = $sesi['kode_reseller'];
$pwd  = $sesi['password'];
$pin  = $sesi['pin'];

function tpCmd($kode, $pwd, $pin, $perintah) {
    $ch = curl_init(PULSA_API_URL);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
        'action'   => 'cmd',
        'kode'     => $kode,
        'password' => $pwd,
        'pin'      => $pin,
        'perintah' => $perintah,
    ]));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        'Authorization: Bearer ' . PULSA_API_KEY,
    ]);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $res = curl_exec($ch);
    $err = curl_error($ch);
    curl_close($ch);
    if ($err) return ['success' => false, 'message' => 'curl error: ' . $err, 'data' => []];
    $decoded = json_decode($res, true);
    if (!$decoded) return ['success' => false, 'message' => 'response kosong: ' . $res, 'data' => []];
    return $decoded;
}

switch ($action) {
    case 'list':
        $res = tpCmd($kode, $pwd, $pin, 'LDL');
        if (!($res['success'] ?? false)) {
            jsonResponse(['status' => 'error', 'msg' => $res['message'] ?? 'Gagal', 'raw' => $res]);
        }
        $msg = $res['data']['msg'] ?? $res['message'] ?? '';
        jsonResponse(['status' => 'sukses', 'data' => parseDownline($msg), 'raw' => $msg]);
        break;

    case 'daftar':
        $nama = trim($input['nama'] ?? '');
        $hp   = trim($input['hp'] ?? '');
        $kota = trim($input['kota'] ?? '');
        if (empty($nama) || empty($hp)) jsonResponse(['status' => 'error', 'msg' => 'Nama dan HP wajib diisi']);
        $perintah = 'REGISTRASI.' . $nama . '.' . $kota . '.' . $hp . '.' . $pin;
        $res = tpCmd($kode, $pwd, $pin, $perintah);
        if ($res['success'] ?? false) {
            jsonResponse(['status' => 'sukses', 'data' => ['msg' => $res['data']['msg'] ?? $res['message'] ?? 'Berhasil']]);
        }
        jsonResponse(['status' => 'error', 'msg' => $res['message'] ?? 'Gagal', 'raw' => $res]);
        break;

    case 'transfer':
        $ke_kode   = trim($input['ke_kode'] ?? '');
        $jumlah    = intval($input['jumlah'] ?? 0);
        $pin_input = trim($input['pin'] ?? $pin);
        if (empty($ke_kode)) jsonResponse(['status' => 'error', 'msg' => 'ID downline wajib diisi']);
        if ($jumlah < 1000) jsonResponse(['status' => 'error', 'msg' => 'Minimal transfer Rp 1.000']);

        $perintah = 'KIRIM.' . $ke_kode . '.' . $jumlah . '.' . $pin_input;
        file_put_contents(__DIR__ . '/debug_transfer.log',
            date('[Y-m-d H:i:s] ') . "perintah=$perintah kode=$kode\n", FILE_APPEND);
        $res = tpCmd($kode, $pwd, $pin_input, $perintah);
        file_put_contents(__DIR__ . '/debug_transfer.log',
            date('[Y-m-d H:i:s] ') . "res=" . json_encode($res) . "\n", FILE_APPEND);
        // Log data field untuk cek saldo2
        file_put_contents(__DIR__ . '/debug_transfer.log',
            date('[Y-m-d H:i:s] ') . "data=" . json_encode($res['data'] ?? []) . "\n", FILE_APPEND);
        $msg_tp = $res['data']['msg'] ?? $res['message'] ?? '';

        // Selalu simpan inbox pengirim dengan response TigaPutri
        $k      = $db->real_escape_string($kode);
        $ke_esc = $db->real_escape_string($ke_kode);
        $judul_k = $db->real_escape_string("Transfer ke $ke_kode");
        $isi_k   = $db->real_escape_string($msg_tp ?: "Transfer Rp " . number_format($jumlah,0,',','.') . " ke $ke_kode");
        $db->query("INSERT INTO inbox (kode_reseller,judul,pesan) VALUES ('$k','$judul_k','$isi_k')");

        if ($res['success'] ?? false) {
            $tr     = 'KCK' . date('YmdHis') . rand(10, 99);
            $tr_esc = $db->real_escape_string($tr);
            $jumlah_fmt   = number_format($jumlah, 0, ',', '.');
            $tgl_transfer = date('d-m-Y H.i.s', strtotime('+7 hours'));
            $nama_pengirim = $sesi['nama_reseller'] ?? $kode;

            $db->query("INSERT INTO riwayat (kode_reseller,trxid,produk,msisdn,harga,status,sn) VALUES ('$k','$tr_esc','KIRIM_SALDO','$ke_esc',$jumlah,'sukses','Kirim ke $ke_kode')");

            // Gunakan msg langsung dari TigaPutri sebagai isi inbox penerima
            $tr2     = 'KCK' . date('YmdHis') . rand(10, 99);
            $tr2_esc = $db->real_escape_string($tr2);
            $db->query("INSERT INTO riwayat (kode_reseller,trxid,produk,msisdn,harga,status,sn) VALUES ('$ke_esc','$tr2_esc','TERIMA_SALDO','$k',$jumlah,'sukses','Terima dari $kode')");
            $judul_p = $db->real_escape_string("Terima Saldo dari $nama_pengirim");
            $isi_p   = $db->real_escape_string(
                "Saldo Anda Telah ditambahkan $nama_pengirim BERHASIL.\n" .
                "sebesar Rp.$jumlah_fmt\n" .
                "Pada Tgl: $tgl_transfer\n" .
                "# Trims atas kepercayaan Anda."
            );
            $db->query("INSERT INTO inbox (kode_reseller,judul,pesan) VALUES ('$ke_esc','$judul_p','$isi_p')");
            jsonResponse(['status' => 'sukses', 'msg' => $msg_tp]);
        }
        jsonResponse(['status' => 'error', 'msg' => $msg_tp ?: 'Gagal transfer']);
        break;

    case 'cek_markup':
        $ke_kode = trim($input['ke_kode'] ?? '');
        if (empty($ke_kode)) jsonResponse(['status' => 'error', 'msg' => 'Kode downline wajib diisi']);
        $perintah = 'CEKSETKOM.' . $ke_kode . '.' . $pin;
        $res = tpCmd($kode, $pwd, $pin, $perintah);
        if ($res['success'] ?? false) {
            jsonResponse(['status' => 'sukses', 'msg' => $res['data']['msg'] ?? $res['message'] ?? '']);
        }
        jsonResponse(['status' => 'error', 'msg' => $res['message'] ?? 'Gagal cek markup', 'raw' => $res]);
        break;

    case 'set_markup':
        $ke_kode = trim($input['ke_kode'] ?? '');
        $markup  = intval($input['markup'] ?? 0);
        if (empty($ke_kode)) jsonResponse(['status' => 'error', 'msg' => 'Kode downline wajib diisi']);
        $perintah = 'SETKOM.' . $ke_kode . '.' . $markup . '.' . $pin;
        $res = tpCmd($kode, $pwd, $pin, $perintah);
        if ($res['success'] ?? false) {
            jsonResponse(['status' => 'sukses', 'msg' => $res['data']['msg'] ?? $res['message'] ?? 'Markup berhasil diubah']);
        }
        jsonResponse(['status' => 'error', 'msg' => $res['message'] ?? 'Gagal set markup', 'raw' => $res]);
        break;

    default:
        jsonResponse(['status' => 'error', 'msg' => 'Action tidak valid']);
}

function parseDownline($msg) {
    $result = [];
    preg_match_all('/(\S+):([^:]+):Rp\s*([\-\d.,]+)/u', $msg, $matches, PREG_SET_ORDER);
    foreach ($matches as $m) {
        $result[] = [
            'kode'  => trim($m[1]),
            'nama'  => trim($m[2]),
            'saldo' => str_replace(['.', ',', ' '], '', trim($m[3])),
        ];
    }
    return $result;
}
