<?php
/**
 * ملف الاتصال بقاعدة البيانات
 * @package CyberScanSystem
 * @version 3.0
 * @last_update 2026-03-20
 * 
 * قاعدة البيانات: digitals_autotestersystem
 * المستخدم: digitals_digitals
 */

class Database {
    // إعدادات الاتصال بقاعدة البيانات (محدثة من phpMyAdmin)
    private $host = "localhost";
    private $db_name = "digitals_autotestersystem";  // ✅ الاسم الصحيح من الصورة
    private $username = "digitals_digitals";           // ✅ المستخدم الصحيح
    private $password = "bassam.bassam";               // ✅ كلمة المرور
    private $conn;
    private static $instance = null;

    /**
     * تطبيق نمط Singleton للحصول على نسخة واحدة من الاتصال
     * @return Database
     */
    public static function getInstance() {
        if (self::$instance == null) {
            self::$instance = new Database();
        }
        return self::$instance;
    }

    /**
     * الحصول على اتصال قاعدة البيانات باستخدام MySQLi
     * @return mysqli|null
     */
    public function getConnection() {
        // إنشاء اتصال MySQLi
        $this->conn = new mysqli($this->host, $this->username, $this->password, $this->db_name);
        
        // التحقق من الاتصال
        if ($this->conn->connect_error) {
            error_log("❌ MySQLi Connection Error: " . $this->conn->connect_error);
            return null;
        }
        
        // تعيين الترميز للغة العربية
        $this->conn->set_charset("utf8mb4");
        
        return $this->conn;
    }

    /**
     * اختبار الاتصال بقاعدة البيانات وجلب قائمة الجداول
     * @return array
     */
    public function testConnection() {
        $conn = $this->getConnection();
        
        if ($conn) {
            try {
                // جلب قائمة الجداول
                $result = $conn->query("SHOW TABLES");
                $tables = [];
                while ($row = $result->fetch_array()) {
                    $tables[] = $row[0];
                }
                
                // جلب عدد السجلات في كل جدول رئيسي
                $counts = [];
                $mainTables = ['users', 'customers', 'inspections', 'vehicles'];
                
                foreach ($mainTables as $table) {
                    if (in_array($table, $tables)) {
                        $countResult = $conn->query("SELECT COUNT(*) as count FROM $table");
                        $countData = $countResult->fetch_assoc();
                        $counts[$table] = $countData['count'];
                    } else {
                        $counts[$table] = 0;
                    }
                }
                
                return [
                    'success' => true,
                    'message' => '✅ اتصال ناجح بقاعدة البيانات',
                    'database' => $this->db_name,
                    'username' => $this->username,
                    'tables_count' => count($tables),
                    'tables' => $tables,
                    'records_count' => $counts
                ];
            } catch (Exception $e) {
                return [
                    'success' => true,
                    'message' => '✅ اتصال ناجح (لكن فشل جلب الجداول)',
                    'database' => $this->db_name,
                    'username' => $this->username,
                    'error' => $e->getMessage()
                ];
            }
        }
        
        return [
            'success' => false,
            'message' => '❌ فشل الاتصال بقاعدة البيانات',
            'database' => $this->db_name,
            'username' => $this->username
        ];
    }

    /**
     * تنفيذ استعلام واسترجاع النتائج
     * @param string $sql
     * @return mysqli_result|false
     */
    public function query($sql) {
        $conn = $this->getConnection();
        if (!$conn) {
            error_log("❌ No database connection");
            return false;
        }
        
        $result = $conn->query($sql);
        if ($result === false) {
            error_log("❌ Query Error: " . $conn->error);
            error_log("📝 SQL: " . $sql);
            return false;
        }
        
        return $result;
    }

    /**
     * جلب جميع النتائج كمصفوفة
     * @param string $sql
     * @return array
     */
    public function fetchAll($sql) {
        $result = $this->query($sql);
        $data = [];
        
        if ($result && $result->num_rows > 0) {
            while ($row = $result->fetch_assoc()) {
                $data[] = $row;
            }
        }
        
        return $data;
    }

    /**
     * جلب صف واحد فقط
     * @param string $sql
     * @return array|null
     */
    public function fetchOne($sql) {
        $result = $this->query($sql);
        
        if ($result && $result->num_rows > 0) {
            return $result->fetch_assoc();
        }
        
        return null;
    }

    /**
     * إدراج بيانات جديدة
     * @param string $table
     * @param array $data
     * @return int|false
     */
    public function insert($table, $data) {
        $conn = $this->getConnection();
        if (!$conn) return false;
        
        // تجهيز الأعمدة والقيم
        $columns = implode(", ", array_keys($data));
        $values = "'" . implode("', '", array_map([$this, 'escapeString'], array_values($data))) . "'";
        
        $sql = "INSERT INTO {$table} ({$columns}) VALUES ({$values})";
        
        if ($conn->query($sql)) {
            return $conn->insert_id;
        }
        
        error_log("❌ Insert Error: " . $conn->error);
        return false;
    }

    /**
     * تحديث بيانات
     * @param string $table
     * @param array $data
     * @param string $where
     * @return bool
     */
    public function update($table, $data, $where) {
        $conn = $this->getConnection();
        if (!$conn) return false;
        
        $sets = [];
        foreach ($data as $key => $value) {
            $escapedValue = $this->escapeString($value);
            $sets[] = "{$key} = '{$escapedValue}'";
        }
        $setStr = implode(", ", $sets);
        
        $sql = "UPDATE {$table} SET {$setStr} WHERE {$where}";
        
        $result = $conn->query($sql);
        if (!$result) {
            error_log("❌ Update Error: " . $conn->error);
        }
        
        return $result;
    }

    /**
     * حذف بيانات
     * @param string $table
     * @param string $where
     * @return bool
     */
    public function delete($table, $where) {
        $conn = $this->getConnection();
        if (!$conn) return false;
        
        $sql = "DELETE FROM {$table} WHERE {$where}";
        
        $result = $conn->query($sql);
        if (!$result) {
            error_log("❌ Delete Error: " . $conn->error);
        }
        
        return $result;
    }

    /**
     * عدد السجلات في جدول
     * @param string $table
     * @param string $where
     * @return int
     */
    public function count($table, $where = "1") {
        $sql = "SELECT COUNT(*) as total FROM {$table} WHERE {$where}";
        $result = $this->fetchOne($sql);
        
        return $result ? (int)$result['total'] : 0;
    }

    /**
     * تنفيذ استعلام مع تجهيز المعاملات (للاستعلامات المحضرة)
     * @param string $sql
     * @param array $params
     * @return mysqli_stmt|false
     */
    public function prepareAndExecute($sql, $params = []) {
        $conn = $this->getConnection();
        if (!$conn) return false;
        
        $stmt = $conn->prepare($sql);
        if (!$stmt) {
            error_log("❌ Prepare Error: " . $conn->error);
            return false;
        }
        
        if (!empty($params)) {
            $types = str_repeat('s', count($params));
            $stmt->bind_param($types, ...$params);
        }
        
        if (!$stmt->execute()) {
            error_log("❌ Execute Error: " . $stmt->error);
            return false;
        }
        
        return $stmt;
    }

    /**
     * بدء معاملة
     * @return bool
     */
    public function beginTransaction() {
        $conn = $this->getConnection();
        if (!$conn) return false;
        
        return $conn->begin_transaction();
    }

    /**
     * تأكيد المعاملة
     * @return bool
     */
    public function commit() {
        $conn = $this->getConnection();
        if (!$conn) return false;
        
        return $conn->commit();
    }

    /**
     * التراجع عن المعاملة
     * @return bool
     */
    public function rollback() {
        $conn = $this->getConnection();
        if (!$conn) return false;
        
        return $conn->rollback();
    }

    /**
     * تنظيف النص من الأحرف الخاصة
     * @param string $str
     * @return string
     */
    private function escapeString($str) {
        $conn = $this->getConnection();
        if ($conn) {
            return $conn->real_escape_string($str);
        }
        return addslashes($str);
    }

    /**
     * الحصول على آخر خطأ
     * @return string
     */
    public function getLastError() {
        return $this->conn ? $this->conn->error : 'No connection';
    }

    /**
     * إغلاق الاتصال
     */
    public function close() {
        if ($this->conn) {
            $this->conn->close();
            $this->conn = null;
        }
    }

    /**
     * التحقق من وجود جدول
     * @param string $table
     * @return bool
     */
    public function tableExists($table) {
        $tables = $this->fetchAll("SHOW TABLES LIKE '{$table}'");
        return !empty($tables);
    }

    /**
     * الحصول على معلومات الجدول
     * @param string $table
     * @return array
     */
    public function getTableInfo($table) {
        return $this->fetchAll("DESCRIBE {$table}");
    }
}

// ============================================
// اختبار الاتصال عند تشغيل الملف مباشرة
// ============================================
if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) {
    header('Content-Type: application/json');
    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Methods: GET');
    
    $db = new Database();
    $result = $db->testConnection();
    
    // إضافة معلومات إضافية للتصحيح
    $result['php_version'] = PHP_VERSION;
    $result['server_time'] = date('Y-m-d H:i:s');
    $result['server_software'] = $_SERVER['SERVER_SOFTWARE'] ?? 'Unknown';
    
    echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
?>