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

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

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

include '../config/koneksi.php';

$id_siswa = $_SESSION['id_user'];
$jenis_transaksi = $_POST['jenis_transaksi'] ?? '';
$jumlah = $_POST['jumlah'] ?? 0;

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

if ($jenis_transaksi == 'setoran') {
    $tanggal = $_POST['tanggal'] ?? date('Y-m-d');
    $status = 'pending';
    try {
        $stmt = $pdo->prepare("INSERT INTO transaksi (id_siswa, jenis_transaksi, jumlah, status, tanggal_transaksi) VALUES (?, ?, ?, ?, ?)");
        $stmt->execute([$id_siswa, 'setoran', $jumlah, $status, $tanggal]);
        echo json_encode(['status' => 'success', 'message' => 'Permintaan setoran berhasil diajukan, menunggu validasi admin.']);
    } catch (PDOException $e) {
        echo json_encode(['status' => 'error', 'message' => 'Gagal mengajukan setoran: ' . $e->getMessage()]);
    }

} elseif ($jenis_transaksi == 'penarikan') {
    $status = 'pending';
    try {
        // Hitung saldo realtime dari transaksi valid
        $stmt_saldo = $pdo->prepare("SELECT 
            SUM(CASE WHEN jenis_transaksi IN ('setoran', 'transfer_masuk') THEN jumlah ELSE 0 END) -
            SUM(CASE WHEN jenis_transaksi IN ('penarikan', 'transfer_keluar', 'pembayaran') THEN jumlah ELSE 0 END)
            AS saldo_akhir 
            FROM transaksi WHERE id_siswa = ? AND status = 'valid'");
        $stmt_saldo->execute([$id_siswa]);
        $saldo_sekarang = $stmt_saldo->fetchColumn();

        if ($saldo_sekarang >= $jumlah) {
            $stmt = $pdo->prepare("INSERT INTO transaksi (id_siswa, jenis_transaksi, jumlah, status, tanggal_transaksi) VALUES (?, ?, ?, ?, NOW())");
            $stmt->execute([$id_siswa, 'penarikan', $jumlah, $status]);
            echo json_encode(['status' => 'success', 'message' => 'Permintaan penarikan berhasil diajukan, menunggu validasi admin.']);
        } else {
            echo json_encode(['status' => 'error', 'message' => 'Saldo tidak mencukupi.']);
        }
    } catch (PDOException $e) {
        echo json_encode(['status' => 'error', 'message' => 'Gagal mengajukan penarikan: ' . $e->getMessage()]);
    }
} elseif ($jenis_transaksi == 'transfer') {
    $id_siswa_tujuan = $_POST['id_siswa_tujuan'] ?? '';
    $pin = $_POST['pin'] ?? '';

    // Validasi PIN
    $stmt_pin = $pdo->prepare("SELECT pin FROM siswa WHERE id_siswa = ?");
    $stmt_pin->execute([$id_siswa]);
    $pin_database = $stmt_pin->fetchColumn();
    
    if ($pin_database != $pin) {
        echo json_encode(['status' => 'error', 'message' => 'PIN yang Anda masukkan salah.']);
        exit();
    }
    
    if (!$id_siswa_tujuan || $id_siswa_tujuan == $id_siswa) {
        echo json_encode(['status' => 'error', 'message' => 'Siswa tujuan tidak valid.']);
        exit();
    }

    try {
        // Cek saldo pengirim dari transaksi valid
        $stmt_saldo_pengirim = $pdo->prepare("SELECT 
            SUM(CASE WHEN jenis_transaksi IN ('setoran', 'transfer_masuk') THEN jumlah ELSE 0 END) -
            SUM(CASE WHEN jenis_transaksi IN ('penarikan', 'transfer_keluar', 'pembayaran') THEN jumlah ELSE 0 END)
            AS saldo_akhir 
            FROM transaksi WHERE id_siswa = ? AND status = 'valid'");
        $stmt_saldo_pengirim->execute([$id_siswa]);
        $saldo_pengirim = $stmt_saldo_pengirim->fetchColumn();

        if ($saldo_pengirim < $jumlah) {
            echo json_encode(['status' => 'error', 'message' => 'Saldo tidak mencukupi untuk transfer.']);
            exit();
        }

        // Verifikasi siswa tujuan ada
        $stmt_cek_tujuan = $pdo->prepare("SELECT COUNT(*) FROM siswa WHERE id_siswa = ?");
        $stmt_cek_tujuan->execute([$id_siswa_tujuan]);
        if ($stmt_cek_tujuan->fetchColumn() == 0) {
            echo json_encode(['status' => 'error', 'message' => 'Siswa tujuan tidak ditemukan.']);
            exit();
        }

        // Ambil nama siswa pengirim dan penerima
        $stmt_nama_pengirim = $pdo->prepare("SELECT nama_siswa FROM siswa WHERE id_siswa = ?");
        $stmt_nama_pengirim->execute([$id_siswa]);
        $nama_pengirim = $stmt_nama_pengirim->fetchColumn();

        $stmt_nama_penerima = $pdo->prepare("SELECT nama_siswa FROM siswa WHERE id_siswa = ?");
        $stmt_nama_penerima->execute([$id_siswa_tujuan]);
        $nama_penerima = $stmt_nama_penerima->fetchColumn();
        
        $pdo->beginTransaction();

        // Catat transaksi (tidak perlu update saldo di tabel siswa)
        $keterangan_keluar = "Transfer ke " . $nama_penerima;
        $keterangan_masuk = "Transfer dari " . $nama_pengirim;

        $stmt_log_keluar = $pdo->prepare("INSERT INTO transaksi (id_siswa, jenis_transaksi, jumlah, status, tanggal_transaksi, keterangan, id_siswa_terkait) VALUES (?, 'transfer_keluar', ?, 'valid', NOW(), ?, ?)");
        $stmt_log_keluar->execute([$id_siswa, $jumlah, $keterangan_keluar, $id_siswa_tujuan]);
        
        $stmt_log_masuk = $pdo->prepare("INSERT INTO transaksi (id_siswa, jenis_transaksi, jumlah, status, tanggal_transaksi, keterangan, id_siswa_terkait) VALUES (?, 'transfer_masuk', ?, 'valid', NOW(), ?, ?)");
        $stmt_log_masuk->execute([$id_siswa_tujuan, $jumlah, $keterangan_masuk, $id_siswa]);

        $pdo->commit();
        echo json_encode(['status' => 'success', 'message' => 'Transfer berhasil!']);

    } catch (PDOException $e) {
        $pdo->rollBack();
        echo json_encode(['status' => 'error', 'message' => 'Gagal melakukan transfer: ' . $e->getMessage()]);
    }
} elseif ($jenis_transaksi == 'payment') {
    $nama_pembayaran = $_POST['jenis_payment'] ?? 'Pembayaran';
    $id_penerima_payment = 2112; // ID tujuan pembayaran yang ditetapkan oleh admin
    $keterangan = 'Pembayaran ' . htmlspecialchars($nama_pembayaran);
    $status = 'pending';
    $input_by = 'siswa';

    try {
        // Verifikasi penerima payment ada
        $stmt_cek_penerima = $pdo->prepare("SELECT COUNT(*) FROM siswa WHERE id_siswa = ?");
        $stmt_cek_penerima->execute([$id_penerima_payment]);
        if ($stmt_cek_penerima->fetchColumn() == 0) {
            echo json_encode(['status' => 'error', 'message' => 'Akun penerima payment tidak valid.']);
            exit();
        }

        // Cek saldo dari transaksi valid
        $stmt_saldo = $pdo->prepare("SELECT 
            SUM(CASE WHEN jenis_transaksi IN ('setoran', 'transfer_masuk') THEN jumlah ELSE 0 END) -
            SUM(CASE WHEN jenis_transaksi IN ('penarikan', 'transfer_keluar', 'pembayaran') THEN jumlah ELSE 0 END)
            AS saldo_akhir 
            FROM transaksi WHERE id_siswa = ? AND status = 'valid'");
        $stmt_saldo->execute([$id_siswa]);
        $saldo_sekarang = $stmt_saldo->fetchColumn();

        if ($saldo_sekarang >= $jumlah) {
            $stmt = $pdo->prepare("INSERT INTO transaksi (id_siswa, jenis_transaksi, jumlah, status, keterangan, tanggal_transaksi, id_siswa_terkait, input_by) VALUES (?, 'pembayaran', ?, ?, ?, NOW(), ?, ?)");
            $stmt->execute([$id_siswa, $jumlah, $status, $keterangan, $id_penerima_payment, $input_by]);
            echo json_encode(['status' => 'success', 'message' => 'Permintaan pembayaran berhasil diajukan, menunggu validasi admin.']);
        } else {
            echo json_encode(['status' => 'error', 'message' => 'Saldo tidak mencukupi.']);
        }
    } catch (PDOException $e) {
        echo json_encode(['status' => 'error', 'message' => 'Gagal mengajukan pembayaran: ' . $e->getMessage()]);
    }

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