<?php
require_once '../config.php';

// التحقق من تسجيل الدخول
requireLogin();

// التحقق من صلاحيات المستخدم (يجب أن يكون مسؤول)
requirePermission('admin');

// وظيفة لتصدير البيانات
function exportData() {
    // استخدام وظيفة getDbConnection للحصول على اتصال قاعدة البيانات
    $db = getDbConnection();
    
    $data = [
        'export_date' => date('Y-m-d H:i:s'),
        'tables' => []
    ];
    
    // قائمة الجداول المراد تصديرها
    $tables = [
        // بيانات المستخدمين والإعدادات
        'users' => 'المستخدمين',
        'association_settings' => 'إعدادات الجمعية',
        'categories' => 'الفئات',
        
        // بيانات المنخرطين
        'members' => 'المنخرطين',
        'subscriptions' => 'الاشتراكات',
        'payments' => 'المدفوعات',
        'monthly_payments' => 'الاشتراكات الشهرية',
        
        // بيانات المؤطرين
        'coaches' => 'المؤطرين',
        'coach_categories' => 'فئات المؤطرين',
        
        // بيانات التدريب
        'training_sessions' => 'حصص التدريب',
        'attendance' => 'سجل الحضور',
        
        // بيانات الأنشطة
        'events' => 'الأنشطة والفعاليات',
        
        // بيانات المالية
        'income' => 'الإيرادات',
        'expenses' => 'المصروفات'
    ];
    
    foreach ($tables as $table => $tableName) {
        try {
            $stmt = $db->prepare("SELECT * FROM $table");
            $stmt->execute();
            $data['tables'][$table] = [
                'name' => $tableName,
                'records' => $stmt->fetchAll(PDO::FETCH_ASSOC)
            ];
        } catch (PDOException $e) {
            // تجاهل الجداول غير الموجودة
            continue;
        }
    }
    
    return $data;
}

// وظيفة لاستيراد البيانات
function importData($jsonData) {
    // استخدام وظيفة getDbConnection للحصول على اتصال قاعدة البيانات
    $db = getDbConnection();
    
    $data = json_decode($jsonData, true);
    
    if (!$data || !isset($data['tables'])) {
        return [
            'success' => false,
            'message' => 'تنسيق البيانات غير صالح'
        ];
    }
    
    $results = [
        'success' => true,
        'message' => 'تم استيراد البيانات بنجاح',
        'imported_tables' => [],
        'skipped_tables' => []
    ];
    
    // بدء المعاملة
    $db->beginTransaction();
    
    try {
        foreach ($data['tables'] as $table => $tableData) {
            // تخطي الجداول الفارغة
            if (empty($tableData['records'])) {
                $results['skipped_tables'][] = $table;
                continue;
            }
            
            try {
                // حذف البيانات الحالية من الجدول
                $stmt = $db->prepare("DELETE FROM $table");
                $stmt->execute();
                
                // إعادة تعيين تسلسل المعرف
                $stmt = $db->prepare("DELETE FROM sqlite_sequence WHERE name = :table");
                $stmt->execute([':table' => $table]);
                
                // إدراج البيانات الجديدة
                foreach ($tableData['records'] as $record) {
                    $columns = array_keys($record);
                    $placeholders = array_map(function($col) { return ":$col"; }, $columns);
                    
                    $sql = "INSERT INTO $table (" . implode(', ', $columns) . ") VALUES (" . implode(', ', $placeholders) . ")";
                    $stmt = $db->prepare($sql);
                    
                    foreach ($record as $column => $value) {
                        $stmt->bindValue(":$column", $value);
                    }
                    
                    $stmt->execute();
                }
                
                $results['imported_tables'][] = $table;
            } catch (PDOException $e) {
                // تجاهل الجداول غير الموجودة
                $results['skipped_tables'][] = $table;
                continue;
            }
        }
        
        // تأكيد المعاملة
        $db->commit();
        
    } catch (PDOException $e) {
        // التراجع عن المعاملة في حالة حدوث خطأ
        $db->rollBack();
        $results['success'] = false;
        $results['message'] = 'حدث خطأ أثناء استيراد البيانات: ' . $e->getMessage();
    }
    
    return $results;
}

// وظيفة لإعادة تهيئة قاعدة البيانات
function resetDatabase() {
    // استخدام وظيفة getDbConnection للحصول على اتصال قاعدة البيانات
    $db = getDbConnection();
    
    // قائمة الجداول المراد إعادة تهيئتها (بترتيب يراعي العلاقات الخارجية)
    $tables = [
        // جداول تعتمد على جداول أخرى
        'attendance',
        'coach_categories',
        'subscriptions',
        'payments',
        'monthly_payments',
        'income',
        'expenses',
        'events',
        'training_sessions',
        
        // الجداول الرئيسية
        'members',
        'coaches',
        'categories',
        
        // الإعدادات (نحتفظ بها)
        // 'association_settings',
        // 'users'
    ];
    
    $results = [
        'success' => true,
        'message' => 'تمت إعادة تهيئة قاعدة البيانات بنجاح',
        'deleted_tables' => []
    ];
    
    // بدء المعاملة
    $db->beginTransaction();
    
    try {
        foreach ($tables as $table) {
            try {
                // حذف جميع البيانات من الجدول
                $stmt = $db->prepare("DELETE FROM $table");
                $stmt->execute();
                
                // إعادة تعيين تسلسل المعرف
                $stmt = $db->prepare("DELETE FROM sqlite_sequence WHERE name = :table");
                $stmt->execute([':table' => $table]);
                
                $results['deleted_tables'][] = $table;
            } catch (PDOException $e) {
                // تجاهل الجداول غير الموجودة
                continue;
            }
        }
        
        // تأكيد المعاملة
        $db->commit();
        
    } catch (PDOException $e) {
        // التراجع عن المعاملة في حالة حدوث خطأ
        $db->rollBack();
        $results['success'] = false;
        $results['message'] = 'حدث خطأ أثناء إعادة تهيئة قاعدة البيانات: ' . $e->getMessage();
    }
    
    return $results;
}

// معالجة طلب التصدير
if (isset($_POST['export'])) {
    $data = exportData();
    $filename = 'association_data_' . date('Y-m-d_H-i-s') . '.json';
    
    header('Content-Type: application/json');
    header('Content-Disposition: attachment; filename="' . $filename . '"');
    echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    exit;
}

// معالجة طلب الاستيراد
if (isset($_POST['import']) && isset($_FILES['import_file'])) {
    if ($_FILES['import_file']['error'] === UPLOAD_ERR_OK) {
        $jsonData = file_get_contents($_FILES['import_file']['tmp_name']);
        $results = importData($jsonData);
        
        if ($results['success']) {
            setAlert('success', $results['message'] . ': تم استيراد ' . count($results['imported_tables']) . ' جدول بنجاح.');
        } else {
            setAlert('danger', $results['message']);
        }
    } else {
        setAlert('danger', 'حدث خطأ أثناء رفع الملف: ' . $_FILES['import_file']['error']);
    }
}

// معالجة طلب إعادة التهيئة
if (isset($_POST['reset']) && isset($_POST['confirm_reset']) && $_POST['confirm_reset'] === 'confirm') {
    $results = resetDatabase();
    
    if ($results['success']) {
        setAlert('success', $results['message'] . ': تم إعادة تهيئة ' . count($results['deleted_tables']) . ' جدول بنجاح.');
    } else {
        setAlert('danger', $results['message']);
    }
}

// عنوان الصفحة
$pageTitle = 'استيراد وتصدير البيانات';

// تضمين ملف الهيدر
include '../includes/header.php';
?>

<div class="container py-4">
    <div class="d-flex justify-content-between align-items-center mb-4">
        <h1 class="h3 mb-0"><i class="fas fa-exchange-alt me-2"></i> استيراد وتصدير البيانات</h1>
        <a href="<?php echo SITE_URL; ?>/settings/index.php" class="btn btn-secondary">
            <i class="fas fa-arrow-right"></i> العودة إلى الإعدادات
        </a>
    </div>
    
    <?php displayAlert(); ?>
    
    <div class="row">
        <!-- قسم التصدير -->
        <div class="col-md-6">
            <div class="card mb-4">
                <div class="card-header bg-primary text-white">
                    <h5 class="card-title mb-0"><i class="fas fa-download me-2"></i> تصدير البيانات</h5>
                </div>
                <div class="card-body">
                    <p class="card-text">
                        يمكنك تصدير جميع بيانات النظام إلى ملف JSON للنسخ الاحتياطي أو النقل إلى نظام آخر.
                    </p>
                    <p class="card-text">
                        <strong>البيانات التي سيتم تصديرها:</strong>
                    </p>
                    <ul class="list-group mb-3">
                        <li class="list-group-item">بيانات المنخرطين والاشتراكات</li>
                        <li class="list-group-item">بيانات المؤطرين والفئات</li>
                        <li class="list-group-item">سجلات الحضور وحصص التدريب</li>
                        <li class="list-group-item">الأنشطة والفعاليات</li>
                        <li class="list-group-item">البيانات المالية (الإيرادات والمصروفات)</li>
                        <li class="list-group-item">الاشتراكات الشهرية</li>
                        <li class="list-group-item">إعدادات النظام</li>
                    </ul>
                    <form action="" method="post">
                        <button type="submit" name="export" class="btn btn-primary">
                            <i class="fas fa-download me-1"></i> تصدير البيانات
                        </button>
                    </form>
                </div>
            </div>
        </div>
        
        <!-- قسم الاستيراد -->
        <div class="col-md-6">
            <div class="card mb-4">
                <div class="card-header bg-success text-white">
                    <h5 class="card-title mb-0"><i class="fas fa-upload me-2"></i> استيراد البيانات</h5>
                </div>
                <div class="card-body">
                    <p class="card-text">
                        يمكنك استيراد بيانات من ملف JSON تم تصديره مسبقًا.
                    </p>
                    <div class="alert alert-warning">
                        <i class="fas fa-exclamation-triangle me-2"></i>
                        <strong>تحذير:</strong> سيؤدي استيراد البيانات إلى حذف البيانات الحالية واستبدالها بالبيانات المستوردة.
                        يرجى التأكد من عمل نسخة احتياطية قبل المتابعة.
                    </div>
                    <form action="" method="post" enctype="multipart/form-data">
                        <div class="mb-3">
                            <label for="import_file" class="form-label">اختر ملف JSON للاستيراد</label>
                            <input type="file" class="form-control" id="import_file" name="import_file" accept=".json" required>
                        </div>
                        <div class="form-check mb-3">
                            <input class="form-check-input" type="checkbox" id="confirm_import" required>
                            <label class="form-check-label" for="confirm_import">
                                أؤكد أنني أريد استيراد هذه البيانات واستبدال البيانات الحالية
                            </label>
                        </div>
                        <button type="submit" name="import" class="btn btn-success" id="import_btn" disabled>
                            <i class="fas fa-upload me-1"></i> استيراد البيانات
                        </button>
                    </form>
                </div>
            </div>
        </div>
    </div>
    
    <!-- قسم إعادة تهيئة البيانات -->
    <div class="card mb-4 border-danger">
        <div class="card-header bg-danger text-white">
            <h5 class="card-title mb-0"><i class="fas fa-trash-alt me-2"></i> إعادة تهيئة قاعدة البيانات</h5>
        </div>
        <div class="card-body">
            <p class="card-text">
                يمكنك إعادة تهيئة قاعدة البيانات وحذف جميع البيانات باستثناء حسابات المستخدمين وإعدادات النظام.
            </p>
            <div class="alert alert-danger">
                <i class="fas fa-exclamation-triangle me-2"></i>
                <strong>تحذير:</strong> سيؤدي هذا الإجراء إلى حذف جميع البيانات التالية بشكل نهائي:
                <ul class="mb-0 mt-2">
                    <li>بيانات المنخرطين والاشتراكات</li>
                    <li>بيانات المؤطرين والفئات</li>
                    <li>سجلات الحضور وحصص التدريب</li>
                    <li>الأنشطة والفعاليات</li>
                    <li>البيانات المالية (الإيرادات والمصروفات)</li>
                    <li>الاشتراكات الشهرية</li>
                </ul>
            </div>
            <form action="" method="post" id="reset_form">
                <div class="mb-3">
                    <label for="reset_confirmation" class="form-label">اكتب "تأكيد" للمتابعة</label>
                    <input type="text" class="form-control" id="reset_confirmation" placeholder="تأكيد" required>
                </div>
                <div class="form-check mb-3">
                    <input class="form-check-input" type="checkbox" id="confirm_reset_checkbox" required>
                    <label class="form-check-label" for="confirm_reset_checkbox">
                        أؤكد أنني أريد حذف جميع البيانات وإعادة تهيئة قاعدة البيانات
                    </label>
                </div>
                <input type="hidden" name="confirm_reset" id="confirm_reset_input" value="">
                <button type="submit" name="reset" class="btn btn-danger" id="reset_btn" disabled>
                    <i class="fas fa-trash-alt me-1"></i> إعادة تهيئة قاعدة البيانات
                </button>
            </form>
        </div>
    </div>
</div>

<?php include '../includes/footer.php'; ?>

<script>
document.addEventListener('DOMContentLoaded', function() {
    // تفعيل زر الاستيراد عند تحديد خانة التأكيد
    const confirmImportCheckbox = document.getElementById('confirm_import');
    const importBtn = document.getElementById('import_btn');
    
    confirmImportCheckbox.addEventListener('change', function() {
        importBtn.disabled = !this.checked;
    });
    
    // التحقق من نموذج إعادة التهيئة
    const resetForm = document.getElementById('reset_form');
    const resetConfirmationInput = document.getElementById('reset_confirmation');
    const confirmResetCheckbox = document.getElementById('confirm_reset_checkbox');
    const confirmResetInput = document.getElementById('confirm_reset_input');
    const resetBtn = document.getElementById('reset_btn');
    
    function validateResetForm() {
        if (resetConfirmationInput.value === 'تأكيد' && confirmResetCheckbox.checked) {
            resetBtn.disabled = false;
            confirmResetInput.value = 'confirm';
        } else {
            resetBtn.disabled = true;
            confirmResetInput.value = '';
        }
    }
    
    resetConfirmationInput.addEventListener('input', validateResetForm);
    confirmResetCheckbox.addEventListener('change', validateResetForm);
    
    resetForm.addEventListener('submit', function(e) {
        if (resetConfirmationInput.value !== 'تأكيد' || !confirmResetCheckbox.checked) {
            e.preventDefault();
            alert('يرجى تأكيد رغبتك في إعادة تهيئة قاعدة البيانات');
        }
    });
});
</script>
