<?php
/**
 * apibuku.php
 * Lokasi: public_html/Buku/apibuku.php
 * Fungsi:
 * - Menyimpan rekap Buku / buku warung
 * - Mencatat otomatis penjualan digital
 * - Mencatat otomatis penjualan fisik
 * - Tambah pemasukan manual
 * - Tambah pengeluaran manual
 * - Anti double data berdasarkan ref_id
 */

header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    exit;
}

date_default_timezone_set('Asia/Jakarta');

/**
 * Folder data akan otomatis dibuat:
 * public_html/Buku/data/
 */
$DATA_DIR = __DIR__ . '/data';

if (!is_dir($DATA_DIR)) {
    mkdir($DATA_DIR, 0755, true);
}

function buku_response($status, $message, $extra = []) {
    echo json_encode(array_merge([
        'status' => $status,
        'message' => $message
    ], $extra), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    exit;
}

function buku_get_input() {
    $raw = file_get_contents('php://input');
    $json = json_decode($raw, true);

    if (is_array($json)) {
        return $json;
    }

    return $_POST;
}

function buku_clean_uid($uid) {
    $uid = trim((string)$uid);
    $uid = preg_replace('/[^a-zA-Z0-9_\-@.]/', '', $uid);

    if ($uid === '') {
        buku_response('error', 'UID kosong. User belum login atau data tidak valid.');
    }

    return $uid;
}

function buku_file_path($uid) {
    global $DATA_DIR;
    $uid = buku_clean_uid($uid);
    return $DATA_DIR . '/buku_' . md5($uid) . '.json';
}

function buku_read($uid) {
    $file = buku_file_path($uid);

    if (!file_exists($file)) {
        return [];
    }

    $json = file_get_contents($file);
    $data = json_decode($json, true);

    return is_array($data) ? $data : [];
}

function buku_write($uid, $data) {
    $file = buku_file_path($uid);
    $tmp = $file . '.tmp';

    file_put_contents(
        $tmp,
        json_encode(array_values($data), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT),
        LOCK_EX
    );

    rename($tmp, $file);
}

function buku_number($value) {
    $value = preg_replace('/[^0-9]/', '', (string)$value);
    return (int)$value;
}

function buku_text($value, $max = 180) {
    $value = trim(strip_tags((string)$value));
    $value = preg_replace('/\s+/', ' ', $value);

    if (mb_strlen($value) > $max) {
        $value = mb_substr($value, 0, $max);
    }

    return $value;
}

function buku_make_id() {
    return 'BK-' . date('YmdHis') . '-' . substr(md5(uniqid('', true)), 0, 8);
}

function buku_normalize_jenis($jenis) {
    $jenis = strtolower(trim((string)$jenis));

    if ($jenis === 'pengeluaran') {
        return 'pengeluaran';
    }

    return 'pemasukan';
}

function buku_normalize_sumber($sumber) {
    $sumber = strtolower(trim((string)$sumber));

    $allowed = ['digital', 'fisik', 'manual'];

    if (!in_array($sumber, $allowed, true)) {
        return 'manual';
    }

    return $sumber;
}

function buku_find_duplicate_ref($rows, $ref_id) {
    $ref_id = trim((string)$ref_id);

    if ($ref_id === '') {
        return false;
    }

    foreach ($rows as $row) {
        if (isset($row['ref_id']) && (string)$row['ref_id'] === $ref_id) {
            return true;
        }
    }

    return false;
}

$action = isset($_GET['action']) ? strtolower(trim($_GET['action'])) : '';
$input = buku_get_input();

$uid = isset($input['uid']) ? buku_clean_uid($input['uid']) : '';

if ($action === '') {
    buku_response('error', 'Action kosong.');
}

/**
 * ACTION: list
 * Mengambil seluruh data buku milik user
 */
if ($action === 'list') {
    $rows = buku_read($uid);

    usort($rows, function($a, $b) {
        $ta = isset($a['tanggal']) ? strtotime($a['tanggal']) : 0;
        $tb = isset($b['tanggal']) ? strtotime($b['tanggal']) : 0;
        return $tb <=> $ta;
    });

    buku_response('success', 'Data buku berhasil diambil.', [
        'data' => $rows
    ]);
}

/**
 * ACTION: add_auto
 * Untuk catatan otomatis dari:
 * - penjualan digital
 * - penjualan fisik
 *
 * Wajib punya ref_id agar tidak dobel.
 */
if ($action === 'add_auto') {
    $rows = buku_read($uid);

    $ref_id = buku_text($input['ref_id'] ?? '', 120);

    if ($ref_id === '') {
        buku_response('error', 'ref_id wajib diisi untuk catatan otomatis.');
    }

    if (buku_find_duplicate_ref($rows, $ref_id)) {
        buku_response('success', 'Data otomatis sudah pernah dicatat, tidak dibuat dobel.', [
            'duplicate' => true
        ]);
    }

    $nominal = buku_number($input['nominal'] ?? 0);

    if ($nominal <= 0) {
        buku_response('error', 'Nominal tidak valid.');
    }

    $jenis = buku_normalize_jenis($input['jenis'] ?? 'pemasukan');
    $sumber = buku_normalize_sumber($input['sumber'] ?? 'digital');

    $judul = buku_text($input['judul'] ?? 'Catatan Otomatis', 160);
    $catatan = buku_text($input['catatan'] ?? '', 250);

    $row = [
        'id' => buku_make_id(),
        'ref_id' => $ref_id,
        'mode' => 'auto',
        'jenis' => $jenis,
        'sumber' => $sumber,
        'judul' => $judul,
        'nominal' => $nominal,
        'catatan' => $catatan,
        'email' => buku_text($input['email'] ?? '', 120),
        'tanggal' => date('Y-m-d H:i:s')
    ];

    $rows[] = $row;
    buku_write($uid, $rows);

    buku_response('success', 'Catatan otomatis berhasil disimpan.', [
        'data' => $row
    ]);
}

/**
 * ACTION: add_manual
 * Untuk:
 * - tambah pemasukan manual
 * - tambah pengeluaran manual
 *
 * Contoh:
 * - jual kopi
 * - beli gula
 * - beli plastik
 */
if ($action === 'add_manual') {
    $rows = buku_read($uid);

    $nominal = buku_number($input['nominal'] ?? 0);

    if ($nominal <= 0) {
        buku_response('error', 'Nominal tidak valid.');
    }

    $jenis = buku_normalize_jenis($input['jenis'] ?? 'pemasukan');
    $judul = buku_text($input['judul'] ?? '', 160);

    if ($judul === '') {
        buku_response('error', 'Judul catatan wajib diisi.');
    }

    $row = [
        'id' => buku_make_id(),
        'ref_id' => '',
        'mode' => 'manual',
        'jenis' => $jenis,
        'sumber' => 'manual',
        'judul' => $judul,
        'nominal' => $nominal,
        'catatan' => buku_text($input['catatan'] ?? '', 250),
        'email' => buku_text($input['email'] ?? '', 120),
        'tanggal' => date('Y-m-d H:i:s')
    ];

    $rows[] = $row;
    buku_write($uid, $rows);

    buku_response('success', 'Catatan manual berhasil disimpan.', [
        'data' => $row
    ]);
}

/**
 * ACTION: delete
 * Hanya untuk hapus catatan manual.
 * Catatan otomatis tidak boleh dihapus dari tombol hapus biasa,
 * supaya rekap penjualan digital/fisik tidak mudah rusak.
 */
if ($action === 'delete') {
    $id = buku_text($input['id'] ?? '', 120);

    if ($id === '') {
        buku_response('error', 'ID kosong.');
    }

    $rows = buku_read($uid);
    $newRows = [];
    $deleted = false;

    foreach ($rows as $row) {
        if (($row['id'] ?? '') === $id) {
            if (($row['mode'] ?? '') !== 'manual' && ($row['sumber'] ?? '') !== 'manual') {
                buku_response('error', 'Catatan otomatis tidak bisa dihapus dari tombol hapus biasa.');
            }

            $deleted = true;
            continue;
        }

        $newRows[] = $row;
    }

    buku_write($uid, $newRows);

    buku_response('success', $deleted ? 'Catatan berhasil dihapus.' : 'Catatan tidak ditemukan.', [
        'deleted' => $deleted
    ]);
}

/**
 * ACTION: clear_manual
 * Opsional, untuk hapus semua catatan manual user.
 * Tidak dipakai di index sekarang, tapi aman disediakan.
 */
if ($action === 'clear_manual') {
    $rows = buku_read($uid);
    $newRows = [];

    foreach ($rows as $row) {
        if (($row['mode'] ?? '') === 'manual' || ($row['sumber'] ?? '') === 'manual') {
            continue;
        }

        $newRows[] = $row;
    }

    buku_write($uid, $newRows);

    buku_response('success', 'Semua catatan manual berhasil dihapus.');
}

buku_response('error', 'Action tidak dikenal.');