<?php
// تهيئة قاعدة البيانات SQLite
function initDatabase() {
    $dbFile = __DIR__ . '/association.db';
    $schemaFile = __DIR__ . '/schema.sql';
    $financeTablesFile = __DIR__ . '/finance_tables.sql';
    $financialSettingsFile = __DIR__ . '/financial_settings.sql';
    $notificationsTableFile = __DIR__ . '/notifications_table.sql';
    
    // التحقق من وجود قاعدة البيانات
    $dbExists = file_exists($dbFile);
    
    try {
        // إنشاء اتصال بقاعدة البيانات
        $db = new PDO('sqlite:' . $dbFile);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        
        // إذا كانت قاعدة البيانات غير موجودة، قم بإنشائها وتهيئتها
        if (!$dbExists) {
            // قراءة ملف السكيما
            $schema = file_get_contents($schemaFile);
            
            // تنفيذ استعلامات إنشاء الجداول
            $db->exec($schema);
            
            echo "تم إنشاء قاعدة البيانات وتهيئتها بنجاح.";
        }
        
        // تحديث قاعدة البيانات بجداول النظام المالي
        if (file_exists($financeTablesFile)) {
            $financeTables = file_get_contents($financeTablesFile);
            $db->exec($financeTables);
        }
        
        // تحديث قاعدة البيانات بإعدادات النظام المالي
        if (file_exists($financialSettingsFile)) {
            $financialSettings = file_get_contents($financialSettingsFile);
            $db->exec($financialSettings);
        }
        
        // تحديث قاعدة البيانات بجدول الإشعارات
        if (file_exists($notificationsTableFile)) {
            $notificationsTable = file_get_contents($notificationsTableFile);
            $db->exec($notificationsTable);
        }
        
        return $db;
    } catch (PDOException $e) {
        die("خطأ في قاعدة البيانات: " . $e->getMessage());
    }
}

// الحصول على اتصال قاعدة البيانات
function getDbConnection() {
    return new PDO('sqlite:' . __DIR__ . '/association.db', null, null, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_TIMEOUT => 10, // Augmentation du délai d'attente
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ]);
}

// تنفيذ استعلام على قاعدة البيانات
function executeQuery($query, $params = []) {
    try {
        $db = getDbConnection();
        $stmt = $db->prepare($query);
        $result = $stmt->execute($params);
        return $stmt;
    } catch (PDOException $e) {
        error_log("خطأ في تنفيذ الاستعلام: " . $e->getMessage());
        error_log("الاستعلام: " . $query);
        error_log("البيانات: " . print_r($params, true));
        die("خطأ في تنفيذ الاستعلام: " . $e->getMessage());
    }
}

// الحصول على سجل واحد
function fetchOne($query, $params = []) {
    $stmt = executeQuery($query, $params);
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    $stmt = null; // Libérer le statement
    return $result;
}

// الحصول على مجموعة سجلات
function fetchAll($query, $params = []) {
    $stmt = executeQuery($query, $params);
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $stmt = null; // Libérer le statement
    return $result;
}

// إدخال بيانات وإرجاع المعرف
function insert($query, $params = []) {
    try {
        $db = getDbConnection();
        $stmt = $db->prepare($query);
        $stmt->execute($params);
        $lastId = $db->lastInsertId();
        $stmt = null; // Libérer le statement
        $db = null; // Fermer la connexion
        return $lastId;
    } catch (PDOException $e) {
        error_log("خطأ في إدخال البيانات: " . $e->getMessage());
        error_log("الاستعلام: " . $query);
        error_log("البيانات: " . print_r($params, true));
        die("خطأ في إدخال البيانات: " . $e->getMessage());
    }
}

// تحديث بيانات وإرجاع عدد الصفوف المتأثرة
function update($query, $params = []) {
    $stmt = executeQuery($query, $params);
    $affectedRows = $stmt->rowCount();
    $stmt = null; // Libérer le statement
    return $affectedRows;
}

// حذف بيانات وإرجاع عدد الصفوف المتأثرة
function delete($query, $params = []) {
    $stmt = executeQuery($query, $params);
    $affectedRows = $stmt->rowCount();
    $stmt = null; // Libérer le statement
    return $affectedRows;
}
