<?php
// File: includes/cache.php
// Cache sederhana berbasis file. Tidak butuh Redis/Memcache.

define('CACHE_DIR', __DIR__ . '/../cache/');
define('CACHE_TTL', 300); // 5 menit default

/**
 * Ambil data dari cache.
 * @return mixed|null  Data jika cache valid, null jika expired/tidak ada
 */
function cacheGet($key) {
    $file = CACHE_DIR . 'data_' . md5($key) . '.json';
    if (!file_exists($file)) return null;
    $raw = @file_get_contents($file);
    if (!$raw) return null;
    $data = json_decode($raw, true);
    if (!$data || !isset($data['exp'], $data['val'])) return null;
    if (time() > $data['exp']) {
        @unlink($file);
        return null;
    }
    return $data['val'];
}

/**
 * Simpan data ke cache.
 * @param mixed $value  Data yang akan di-cache (harus JSON-serializable)
 * @param int   $ttl    Waktu cache dalam detik
 */
function cacheSet($key, $value, $ttl = CACHE_TTL) {
    if (!file_exists(CACHE_DIR)) @mkdir(CACHE_DIR, 0755, true);
    $file = CACHE_DIR . 'data_' . md5($key) . '.json';
    $data = ['exp' => time() + $ttl, 'val' => $value];
    @file_put_contents($file, json_encode($data), LOCK_EX);
}

/**
 * Hapus satu key dari cache.
 */
function cacheDelete($key) {
    $file = CACHE_DIR . 'data_' . md5($key) . '.json';
    if (file_exists($file)) @unlink($file);
}

/**
 * Hapus semua cache (flush).
 * Panggil ini setelah admin menyimpan perubahan data.
 */
function cacheFlush() {
    if (!file_exists(CACHE_DIR)) return;
    $files = glob(CACHE_DIR . 'data_*.json');
    if ($files) foreach ($files as $f) @unlink($f);
}

/**
 * Helper: ambil dari cache atau jalankan callback jika cache miss.
 * Contoh: $products = cacheRemember('all_products', fn() => getAllProducts($pdo));
 */
function cacheRemember($key, callable $callback, $ttl = CACHE_TTL) {
    $cached = cacheGet($key);
    if ($cached !== null) return $cached;
    $value = $callback();
    cacheSet($key, $value, $ttl);
    return $value;
}
?>
