<?php
date_default_timezone_set('Asia/Jakarta');
session_start();

header('Content-Type: application/json');

// Proteksi akses
if (!isset($_SESSION['user_logged_in']) || $_SESSION['user_type'] != 'siswa') {
    echo json_encode(['status' => 'error', 'message' => 'Akses ditolak.']);
    exit();
}

// Gunakan file database yang benar sesuai struktur folder Anda
require_once '../config/database.php'; 

$id_siswa = $_SESSION['id_user'];
$jenis_transaksi = $_POST['jenis_transaksi'] ?? '';
$jumlah = filter_var($_POST['jumlah'] ?? 0, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

// 1. Validasi Dasar
if ($jumlah <= 0) {
    echo json_encode(['status' => 'error', 'message' => 'Jumlah harus lebih dari 0.']);
    exit();
}

try {
    // Ambil data saldo dan PIN terbaru dari DB untuk validasi
    $stmt_user = $pdo->prepare("SELECT saldo, pin, nama_siswa FROM siswa WHERE id_siswa = ?");
    $stmt_user->execute([$id_siswa]);
    $user_data = $stmt_user->fetch();

    if (!$user_data) {
        throw new Exception("Data nasabah tidak ditemukan.");
    }

    // === LOGIKA SETORAN ===
    if ($jenis_transaksi == 'setoran') {
        $tanggal = $_POST['tanggal'] ?? date('Y-m-d H:i:s');
        $stmt = $pdo->prepare("INSERT INTO transaksi (id_siswa, jenis_transaksi, jumlah, status, tanggal_transaksi, input_by) VALUES (?, 'setoran', ?, 'pending', ?, 'siswa')");
        $stmt->execute([$id_siswa, $jumlah, $tanggal]);
        echo json_encode(['status' => 'success', 'message' => 'Permintaan setoran disimpan, silakan setor uang tunai ke Admin.']);

    // === LOGIKA PENARIKAN ===
    } elseif ($jenis_transaksi == 'penarikan') {
        if ($user_data['saldo'] < $jumlah) {
            echo json_encode(['status' => 'error', 'message' => 'Saldo tidak mencukupi. Saldo Anda: Rp' . number_format($user_data['saldo'], 0, ',', '.')]);
            exit();
        }

        $stmt = $pdo->prepare("INSERT INTO transaksi (id_siswa, jenis_transaksi, jumlah, status, tanggal_transaksi, keterangan, input_by) VALUES (?, 'penarikan', ?, 'pending', NOW(), 'Tarik Mandiri via App', 'siswa')");
        $stmt->execute([$id_siswa, $jumlah]);
        echo json_encode(['status' => 'success', 'message' => 'Permintaan penarikan dikirim. Silakan ambil uang di Admin.']);

    // === LOGIKA TRANSFER (Langsung Valid/Potong Saldo) ===
    } elseif ($jenis_transaksi == 'transfer') {
        $id_siswa_tujuan = $_POST['id_siswa_tujuan'] ?? '';
        $pin_input = $_POST['pin'] ?? '';

        if ($user_data['pin'] !== $pin_input) {
            echo json_encode(['status' => 'error', 'message' => 'PIN salah.']);
            exit();
        }
        if ($id_siswa_tujuan == $id_siswa) {
            echo json_encode(['status' => 'error', 'message' => 'Tidak bisa transfer ke diri sendiri.']);
            exit();
        }
        if ($user_data['saldo'] < $jumlah) {
            echo json_encode(['status' => 'error', 'message' => 'Saldo tidak mencukupi untuk transfer.']);
            exit();
        }

        // Cek tujuan
        $stmt_dest = $pdo->prepare("SELECT id_siswa, nama_siswa FROM siswa WHERE id_siswa = ?");
        $stmt_dest->execute([$id_siswa_tujuan]);
        $dest_data = $stmt_dest->fetch();
        if (!$dest_data) {
            echo json_encode(['status' => 'error', 'message' => 'Siswa tujuan tidak ditemukan.']);
            exit();
        }

        $pdo->beginTransaction();
        $group_trf = 'TRF' . time() . rand(10, 99);

        // 1. Catat Keluar (Pengirim)
        $stmt_out = $pdo->prepare("INSERT INTO transaksi (id_siswa, jenis_transaksi, jumlah, status, tanggal_transaksi, tanggal_verifikasi, keterangan, id_siswa_terkait, group_transfer, input_by) VALUES (?, 'transfer_keluar', ?, 'valid', NOW(), NOW(), ?, ?, ?, 'siswa')");
        $stmt_out->execute([$id_siswa, $jumlah, "Kirim ke " . $dest_data['nama_siswa'], $id_siswa_tujuan, $group_trf]);

        // 2. Catat Masuk (Penerima)
        $stmt_in = $pdo->prepare("INSERT INTO transaksi (id_siswa, jenis_transaksi, jumlah, status, tanggal_transaksi, tanggal_verifikasi, keterangan, id_siswa_terkait, group_transfer, input_by) VALUES (?, 'transfer_masuk', ?, 'valid', NOW(), NOW(), ?, ?, ?, 'siswa')");
        $stmt_in->execute([$id_siswa_tujuan, $jumlah, "Terima dari " . $user_data['nama_siswa'], $id_siswa, $group_trf]);

        // 3. Update Saldo Realtime (Penting untuk db_mms26)
        $pdo->prepare("UPDATE siswa SET saldo = saldo - ? WHERE id_siswa = ?")->execute([$jumlah, $id_siswa]);
        $pdo->prepare("UPDATE siswa SET saldo = saldo + ? WHERE id_siswa = ?")->execute([$jumlah, $id_siswa_tujuan]);

        $pdo->commit();
        echo json_encode(['status' => 'success', 'message' => 'Transfer Berhasil ke ' . $dest_data['nama_siswa']]);

    // === LOGIKA PAYMENT (Iuran/Tagihan) ===
    } elseif ($jenis_transaksi == 'payment') {
        $id_payment_type = $_POST['id_pembayaran'] ?? ''; // ID dari data_pembayaran
        
        // Ambil info tagihan
        $stmt_pay = $pdo->prepare("SELECT * FROM data_pembayaran WHERE id_pembayaran = ?");
        $stmt_pay->execute([$id_payment_type]);
        $pay_info = $stmt_pay->fetch();

        if (!$pay_info) throw new Exception("Jenis pembayaran tidak valid.");
        if ($user_data['saldo'] < $jumlah) throw new Exception("Saldo tidak cukup.");

        // Pembayaran oleh siswa masuk ke status PENDING agar dicek Admin (atau VALID jika ingin otomatis)
        $stmt_trf_pay = $pdo->prepare("INSERT INTO transaksi_payment (id_siswa, id_pembayaran, jumlah, tanggal_bayar, status, input_by, keterangan) VALUES (?, ?, ?, NOW(), 'pending', 'siswa', ?)");
        $stmt_trf_pay->execute([$id_siswa, $id_payment_type, $jumlah, "Pembayaran " . $pay_info['nama_pembayaran']]);
        
        echo json_encode(['status' => 'success', 'message' => 'Pembayaran diajukan. Saldo akan terpotong setelah divalidasi Admin.']);

    } else {
        echo json_encode(['status' => 'error', 'message' => 'Jenis transaksi tidak dikenal.']);
    }

} catch (Exception $e) {
    if ($pdo->inTransaction()) $pdo->rollBack();
    echo json_encode(['status' => 'error', 'message' => 'Sistem Error: ' . $e->getMessage()]);
}