<?php
/**
 * Univerzální třída pro práci s JSON databází
 */
class JsonDB {
    private $filePath;

    public function __construct($tableName) {
        $this->filePath = __DIR__ . '/data/' . $tableName . '.json';
        
        // Vytvořit složku a soubor, pokud neexistují
        if (!file_exists(dirname($this->filePath))) {
            @mkdir(dirname($this->filePath), 0777, true);
        }
        if (!file_exists($this->filePath)) {
            @file_put_contents($this->filePath, json_encode([]));
        }
    }

    public function getAll() {
        $content = @file_get_contents($this->filePath);
        if ($content === false || trim($content) === '') return [];
        
        // Odstranění neviditelného znaku UTF-8 BOM (Způsobuje selhání čtení po přesunu z Windows)
        $content = preg_replace('/^\xEF\xBB\xBF/', '', $content);
        
        // Záchrana pro případ, že Windows FTP klient uložil soubor v ANSI (Windows-1250) místo UTF-8
        if (!mb_check_encoding($content, 'UTF-8')) {
            $content = mb_convert_encoding($content, 'UTF-8', 'Windows-1250');
        }
        
        $decoded = json_decode($content, true);
        if (json_last_error() !== JSON_ERROR_NONE) { error_log("Chybný formát JSON v souboru: " . $this->filePath . " - " . json_last_error_msg()); }
        return is_array($decoded) ? $decoded : [];
    }

    private function save($data) {
        // Atomické ukládání: Nejprve zapíšeme do dočasného souboru a pak jej bleskově přejmenujeme.
        // To zabraňuje poškození JSON souborů (vymazání dat), když se sejde cron a uživatel ve stejnou vteřinu.
        $tempFile = $this->filePath . '.tmp.' . uniqid();
        $json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        if (@file_put_contents($tempFile, $json) !== false) {
            return @rename($tempFile, $this->filePath);
        }
        return false;
    }

    public function insert($data) {
        if (!is_array($data)) $data = [];
        $records = $this->getAll();
        $id = uniqid(); // Generování unikátního ID (např. 60f3d9b... )
        $data['id'] = $id;
        $data['created_at'] = date('Y-m-d H:i:s');
        $records[$id] = $data;
        $this->save($records);
        return $id;
    }

    public function getById($id) {
        $records = $this->getAll();
        return isset($records[$id]) && is_array($records[$id]) ? $records[$id] : null;
    }

    public function update($id, $data) {
        if (!is_array($data)) return false;
        $records = $this->getAll();
        if (isset($records[$id]) && is_array($records[$id])) {
            // Zachování původního ID a času vytvoření
            $data['id'] = $id;
            $data['created_at'] = $records[$id]['created_at'] ?? date('Y-m-d H:i:s');
            $data['updated_at'] = date('Y-m-d H:i:s');
            
            $records[$id] = array_merge($records[$id], $data);
            $this->save($records);
            return true;
        }
        return false;
    }

    public function delete($id) {
        $records = $this->getAll();
        if (isset($records[$id])) {
            unset($records[$id]);
            $this->save($records);
            return true;
        }
        return false;
    }
}