<?php
// api_journal.php
require_once 'auth_check.php';
require_once 'db.php';

header('Content-Type: application/json');
$action = $_GET['action'] ?? '';

try {
    // 1. Ambil daftar akun untuk pilihan dropdown
    if ($action === 'get_accounts') {
        $stmt = $pdo->query("
            SELECT DISTINCT account_code AS code, 
                   CASE 
                       WHEN account_code = '1100' THEN 'Kas / Bank'
                       WHEN account_code = '1120' THEN 'Piutang Usaha'
                       WHEN account_code = '4100' THEN 'Penjualan Barang'
                       WHEN account_code = '5100' THEN 'Harga Pokok Produksi (HPP)'
                       ELSE CONCAT('Akun ', account_code)
                   END AS name
            FROM journal_details 
            UNION
            SELECT '1100', 'Kas / Bank'
            UNION
            SELECT '1120', 'Piutang Usaha'
            UNION
            SELECT '4100', 'Penjualan Barang'
            UNION
            SELECT '5100', 'Harga Pokok Produksi (HPP)'
            ORDER BY code ASC
        ");
        $accounts = $stmt->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode(['status' => 'success', 'data' => $accounts]);
    }

    // 2. Simpan Jurnal Manual Baru
    elseif ($action === 'save_journal') {
        $journal_date = $_POST['journal_date'] ?? date('Y-m-d');
        $description  = $_POST['description'] ?? '';
        $items        = json_decode($_POST['items'] ?? '[]', true);

        if (empty($journal_date) || empty($items) || count($items) < 2) {
            echo json_encode(['status' => 'error', 'message' => 'Tanggal, keterangan, dan minimal 2 baris akun (Debit & Kredit) wajib diisi!']);
            exit;
        }

        $total_debit = 0;
        $total_credit = 0;

        foreach ($items as $item) {
            $total_debit  += floatval($item['debit']);
            $total_credit += floatval($item['credit']);
        }

        // Validasi Keseimbangan Debet dan Kredit
        if (round($total_debit, 2) !== round($total_credit, 2)) {
            echo json_encode(['status' => 'error', 'message' => "Total Debit (Rp " . number_format($total_debit, 0, ',', '.') . ") harus sama dengan Total Kredit (Rp " . number_format($total_credit, 0, ',', '.') . ")!"]);
            exit;
        }

        // Generate Nomor Jurnal Otomatis (Format: JRN-YYYYMM-XXXX)
        $prefix = "JRN-" . date('Ym') . "-";
        $stmtSeq = $pdo->query("SELECT COUNT(*) AS total FROM journal_entries WHERE journal_number LIKE '$prefix%'");
        $seq = $stmtSeq->fetch()['total'] + 1;
        $journal_number = $prefix . str_pad($seq, 4, '0', STR_PAD_LEFT);

        $pdo->beginTransaction();

        // Simpan Header Jurnal
        $stmtHeader = $pdo->prepare("INSERT INTO journal_entries (journal_number, journal_date, reference_type, reference_id, description, total_debit, total_credit) VALUES (?, ?, 'Manual', 0, ?, ?, ?)");
        $stmtHeader->execute([$journal_number, $journal_date, $description, $total_debit, $total_credit]);
        $journal_id = $pdo->lastInsertId();

        // Simpan Detail Jurnal
        $stmtDetail = $pdo->prepare("INSERT INTO journal_details (journal_id, account_code, debit, credit) VALUES (?, ?, ?, ?)");
        foreach ($items as $item) {
            $debit  = floatval($item['debit']);
            $credit = floatval($item['credit']);
            $stmtDetail->execute([$journal_id, $item['account_code'], $debit, $credit]);
        }

        $pdo->commit();
        echo json_encode(['status' => 'success', 'message' => "Jurnal Manual $journal_number berhasil disimpan!"]);
    }

    // 3. Ambil Daftar Jurnal (Dengan Paging, Filter Tahun, & Search per Kolom)
    elseif ($action === 'get_journal_list') {
        $year   = isset($_GET['year']) && trim($_GET['year']) !== '' ? intval($_GET['year']) : date('Y');
        $page   = isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1;
        $limit  = isset($_GET['limit']) ? max(1, intval($_GET['limit'])) : 10;
        $offset = ($page - 1) * $limit;

        $searchJrnNum = isset($_GET['search_journal_number']) ? trim($_GET['search_journal_number']) : '';
        $searchDate   = isset($_GET['search_journal_date']) ? trim($_GET['search_journal_date']) : '';
        $searchRef    = isset($_GET['search_reference_type']) ? trim($_GET['search_reference_type']) : '';
        $searchDesc   = isset($_GET['search_description']) ? trim($_GET['search_description']) : '';
        $searchTotal  = isset($_GET['search_total_debit']) ? trim($_GET['search_total_debit']) : '';

        $whereClause = "WHERE 1=1";
        $params = [];

        if ($year > 0) {
            $whereClause .= " AND YEAR(journal_date) = ?";
            $params[] = $year;
        }

        if ($searchJrnNum !== '') {
            $whereClause .= " AND journal_number LIKE ?";
            $params[] = "%{$searchJrnNum}%";
        }
        if ($searchDate !== '') {
            $whereClause .= " AND journal_date LIKE ?";
            $params[] = "%{$searchDate}%";
        }
        if ($searchRef !== '') {
            $whereClause .= " AND reference_type LIKE ?";
            $params[] = "%{$searchRef}%";
        }
        if ($searchDesc !== '') {
            $whereClause .= " AND description LIKE ?";
            $params[] = "%{$searchDesc}%";
        }
        if ($searchTotal !== '') {
            $whereClause .= " AND total_debit LIKE ?";
            $params[] = "%{$searchTotal}%";
        }

        // Hitung total data
        $stmtCount = $pdo->prepare("SELECT COUNT(*) AS total FROM journal_entries $whereClause");
        $stmtCount->execute($params);
        $totalRecords = $stmtCount->fetch()['total'];
        $totalPages   = ceil($totalRecords / $limit);

        // Ambil data dengan limit & offset
        $sqlData = "SELECT * FROM journal_entries $whereClause ORDER BY id DESC LIMIT ? OFFSET ?";
        $stmtData = $pdo->prepare($sqlData);
        $bindIdx = 1;
        foreach ($params as $paramVal) {
            $stmtData->bindValue($bindIdx++, $paramVal);
        }
        $stmtData->bindValue($bindIdx++, $limit, PDO::PARAM_INT);
        $stmtData->bindValue($bindIdx++, $offset, PDO::PARAM_INT);
        $stmtData->execute();

        echo json_encode([
            'status'     => 'success',
            'data'       => $stmtData->fetchAll(PDO::FETCH_ASSOC),
            'pagination' => [
                'current_page'  => $page,
                'limit'         => $limit,
                'total_records' => $totalRecords,
                'total_pages'   => $totalPages,
                'selected_year' => $year
            ]
        ]);
    }

    // 4. Ambil Detail Jurnal (untuk Lihat Baris Akun Debit/Kredit)
    elseif ($action === 'get_journal_detail') {
        $journal_id = $_GET['journal_id'] ?? 0;

        $stmtHeader = $pdo->prepare("SELECT * FROM journal_entries WHERE id = ?");
        $stmtHeader->execute([$journal_id]);
        $header = $stmtHeader->fetch(PDO::FETCH_ASSOC);

        $stmtDetails = $pdo->prepare("
            SELECT jd.*, 
                   CASE 
                       WHEN jd.account_code = '1100' THEN 'Kas / Bank'
                       WHEN jd.account_code = '1120' THEN 'Piutang Usaha'
                       WHEN jd.account_code = '4100' THEN 'Penjualan Barang'
                       WHEN jd.account_code = '5100' THEN 'Harga Pokok Produksi (HPP)'
                       ELSE CONCAT('Akun ', jd.account_code)
                   END AS account_name
            FROM journal_details jd 
            WHERE jd.journal_id = ?
        ");
        $stmtDetails->execute([$journal_id]);
        $details = $stmtDetails->fetchAll(PDO::FETCH_ASSOC); // Diperbaiki ke PDO::FETCH_ASSOC

        if ($header) {
            echo json_encode(['status' => 'success', 'header' => $header, 'details' => $details]);
        } else {
            echo json_encode(['status' => 'error', 'message' => 'Data jurnal tidak ditemukan']);
        }
    }

    // 5. Hapus Jurnal (Hanya diizinkan jika reference_type adalah 'Manual')
    elseif ($action === 'delete_journal') {
        $id = $_POST['id'] ?? '';

        if (empty($id)) {
            echo json_encode(['status' => 'error', 'message' => 'ID Jurnal tidak valid!']);
            exit;
        }

        try {
            $pdo->beginTransaction();

            // Cek tipe referensi jurnal
            $stmtCheck = $pdo->prepare("SELECT reference_type FROM journal_entries WHERE id = ?");
            $stmtCheck->execute([$id]);
            $jrn = $stmtCheck->fetch();

            if (!$jrn) {
                echo json_encode(['status' => 'error', 'message' => 'Jurnal tidak ditemukan!']);
                exit;
            }

            // Validasi: Tolak penghapusan jika bukan jurnal manual
            if ($jrn['reference_type'] !== 'Manual') {
                echo json_encode(['status' => 'error', 'message' => 'Jurnal otomatis (Invoice/Payment) tidak dapat dihapus dari menu Jurnal Umum! Hapus melalui transaksi aslinya.']);
                exit;
            }

            // Hapus detail dan header jurnal manual
            $pdo->prepare("DELETE FROM journal_details WHERE journal_id = ?")->execute([$id]);
            $pdo->prepare("DELETE FROM journal_entries WHERE id = ?")->execute([$id]);

            $pdo->commit();
            echo json_encode(['status' => 'success', 'message' => 'Jurnal manual berhasil dihapus!']);
        } catch (Exception $e) {
            $pdo->rollBack();
            echo json_encode(['status' => 'error', 'message' => 'Gagal menghapus jurnal: ' . $e->getMessage()]);
        }
    } else {
        echo json_encode(['status' => 'error', 'message' => 'Aksi tidak valid!']);
    }

} catch (Exception $e) {
    if (isset($pdo) && $pdo->inTransaction()) {
        $pdo->rollBack();
    }
    echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]);
}
?>