<?php
// ملف الدوال المساعدة

// تنظيف المدخلات
function sanitizeInput($input) {
    if (is_array($input)) {
        foreach ($input as $key => $value) {
            $input[$key] = sanitizeInput($value);
        }
    } else {
        $input = trim($input);
        $input = stripslashes($input);
        $input = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
    }
    return $input;
}

// التحقق من صحة البريد الإلكتروني
function isValidEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL);
}

// التحقق من صحة رقم الهاتف
function isValidPhone($phone) {
    // يمكن تعديل هذا النمط حسب تنسيق أرقام الهاتف في بلدك
    return preg_match('/^[0-9]{10}$/', $phone);
}

// حساب العمر بناءً على تاريخ الميلاد
function calculateAge($birthDate) {
    $today = new DateTime();
    $birth = new DateTime($birthDate);
    $age = $today->diff($birth);
    return $age->y;
}

// تحديد الفئة العمرية المناسبة
function getAppropriateCategory($birthDate) {
    $age = calculateAge($birthDate);
    
    $query = "SELECT id FROM categories WHERE :age BETWEEN age_min AND age_max LIMIT 1";
    $result = fetchOne($query, [':age' => $age]);
    
    return $result ? $result['id'] : null;
}

// تحميل صورة
function uploadImage($file, $targetDir) {
    // التحقق من وجود خطأ في التحميل
    if ($file['error'] !== UPLOAD_ERR_OK) {
        return ['success' => false, 'message' => 'حدث خطأ أثناء تحميل الملف.'];
    }
    
    // التحقق من حجم الملف
    if ($file['size'] > MAX_UPLOAD_SIZE) {
        return ['success' => false, 'message' => 'حجم الملف كبير جدًا. الحد الأقصى هو 5 ميجابايت.'];
    }
    
    // التحقق من نوع الملف
    $fileType = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
    if (!in_array($fileType, ALLOWED_EXTENSIONS)) {
        return ['success' => false, 'message' => 'نوع الملف غير مسموح به. الأنواع المسموح بها هي: ' . implode(', ', ALLOWED_EXTENSIONS)];
    }
    
    // إنشاء اسم فريد للملف
    $fileName = uniqid() . '.' . $fileType;
    $targetPath = $targetDir . '/' . $fileName;
    
    // نقل الملف إلى المجلد المستهدف
    if (move_uploaded_file($file['tmp_name'], $targetPath)) {
        return ['success' => true, 'file_name' => $fileName];
    } else {
        return ['success' => false, 'message' => 'حدث خطأ أثناء حفظ الملف.'];
    }
}

// تنسيق التاريخ
function formatDate($date, $format = 'd/m/Y') {
    if (empty($date)) return '';
    $dateObj = new DateTime($date);
    return $dateObj->format($format);
}

// تحويل التاريخ من التنسيق المحلي إلى تنسيق قاعدة البيانات
function dateToDatabase($date) {
    if (empty($date)) return null;
    
    // تحويل من تنسيق dd/mm/yyyy إلى yyyy-mm-dd
    $parts = explode('/', $date);
    if (count($parts) === 3) {
        return $parts[2] . '-' . $parts[1] . '-' . $parts[0];
    }
    
    return $date;
}

// تحويل رقم اليوم إلى اسم اليوم بالعربية
function getArabicDayName($dayNumber) {
    $days = [
        0 => 'الأحد',
        1 => 'الاثنين',
        2 => 'الثلاثاء',
        3 => 'الأربعاء',
        4 => 'الخميس',
        5 => 'الجمعة',
        6 => 'السبت'
    ];
    
    return $days[$dayNumber] ?? 'غير معروف';
}

// تنسيق الوقت
function formatTime($time, $format = 'H:i') {
    if (empty($time)) return '';
    $timeObj = new DateTime($time);
    return $timeObj->format($format);
}

// تنسيق الوقت بصيغة 12 ساعة
function formatTime12($time) {
    return date('h:i A', strtotime($time));
}

// تنسيق المبلغ المالي
function formatCurrency($amount, $symbol = 'د.م.') {
    return number_format($amount, 2, '.', ',') . ' ' . $symbol;
}

// إنشاء رسالة تنبيه
function setAlert($type, $message) {
    $_SESSION['alert'] = [
        'type' => $type,
        'message' => $message
    ];
}

// عرض رسالة التنبيه
function displayAlert() {
    if (isset($_SESSION['alert'])) {
        $alert = $_SESSION['alert'];
        $type = $alert['type'];
        $message = $alert['message'];
        
        echo "<div class='alert alert-{$type} alert-dismissible fade show' role='alert'>
                {$message}
                <button type='button' class='btn-close' data-bs-dismiss='alert' aria-label='Close'></button>
              </div>";
        
        unset($_SESSION['alert']);
    }
}

// توليد رقم إيصال فريد
function generateReceiptNumber($prefix = 'REC') {
    return $prefix . date('Ymd') . rand(1000, 9999);
}

// الحصول على إعدادات الجمعية
function getAssociationSettings() {
    $query = "SELECT * FROM association_settings ORDER BY id DESC LIMIT 1";
    return fetchOne($query);
}

// حساب المبلغ الإجمالي للاشتراك
function calculateSubscriptionTotal($categoryId) {
    $query = "SELECT subscription_fee, insurance_fee FROM categories WHERE id = :id";
    $category = fetchOne($query, [':id' => $categoryId]);
    
    if (!$category) return 0;
    
    return $category['subscription_fee'] + $category['insurance_fee'];
}

// التحقق من صلاحية الاشتراك
function isSubscriptionValid($memberId) {
    $query = "SELECT end_date FROM subscriptions WHERE member_id = :member_id ORDER BY end_date DESC LIMIT 1";
    $subscription = fetchOne($query, [':member_id' => $memberId]);
    
    if (!$subscription) {
        return false;
    }
    
    return strtotime($subscription['end_date']) >= strtotime(date('Y-m-d'));
}

// الحصول على تاريخ انتهاء الاشتراك
function getSubscriptionEndDate($memberId) {
    $query = "SELECT end_date FROM subscriptions WHERE member_id = :member_id ORDER BY end_date DESC LIMIT 1";
    $subscription = fetchOne($query, [':member_id' => $memberId]);
    
    if (!$subscription) {
        return 'غير مشترك';
    }
    
    return formatDate($subscription['end_date']);
}

// الحصول على المنخرطين الذين تنتهي اشتراكاتهم قريبًا
function getExpiringSubscriptions($daysThreshold = 30) {
    $query = "SELECT m.id as member_id, m.first_name, m.last_name, m.email, m.phone, 
                c.name as category_name, s.end_date 
              FROM members m 
              JOIN subscriptions s ON m.id = s.member_id 
              JOIN categories c ON m.category_id = c.id 
              WHERE s.end_date BETWEEN CURRENT_DATE AND date(CURRENT_DATE, '+{$daysThreshold} days') 
              AND s.end_date = (SELECT MAX(end_date) FROM subscriptions WHERE member_id = m.id)
              ORDER BY s.end_date ASC";
    
    return fetchAll($query);
}

// حساب إجمالي المداخيل لفترة معينة
function calculateTotalIncome($startDate = null, $endDate = null) {
    global $db;
    
    // 1. Calcul des revenus à partir de la table income
    $incomeParams = [];
    $incomeWhereClause = '';
    
    if ($startDate && $endDate) {
        $incomeWhereClause = "WHERE payment_date BETWEEN ? AND ?";
        $incomeParams = [$startDate, $endDate];
    } elseif ($startDate) {
        $incomeWhereClause = "WHERE payment_date >= ?";
        $incomeParams = [$startDate];
    } elseif ($endDate) {
        $incomeWhereClause = "WHERE payment_date <= ?";
        $incomeParams = [$endDate];
    }
    
    $incomeQuery = "SELECT SUM(amount) as total FROM income {$incomeWhereClause}";
    $stmt = $db->prepare($incomeQuery);
    $stmt->execute($incomeParams);
    $incomeResult = $stmt->fetch(PDO::FETCH_ASSOC);
    $incomeTotal = $incomeResult && $incomeResult['total'] ? (float)$incomeResult['total'] : 0;
    
    // 2. Calcul des revenus à partir des paiements mensuels
    $mpParams = [];
    $mpWhereClause = "WHERE payment_status = 'paid'";
    
    if ($startDate && $endDate) {
        $mpWhereClause .= " AND payment_date BETWEEN ? AND ?";
        $mpParams = [$startDate, $endDate];
    } elseif ($startDate) {
        $mpWhereClause .= " AND payment_date >= ?";
        $mpParams = [$startDate];
    } elseif ($endDate) {
        $mpWhereClause .= " AND payment_date <= ?";
        $mpParams = [$endDate];
    }
    
    $mpQuery = "SELECT SUM(amount_paid) as total FROM monthly_payments {$mpWhereClause}";
    $stmt = $db->prepare($mpQuery);
    $stmt->execute($mpParams);
    $mpResult = $stmt->fetch(PDO::FETCH_ASSOC);
    $monthlyPaymentsTotal = $mpResult && $mpResult['total'] ? (float)$mpResult['total'] : 0;
    
    // 3. Total des revenus = revenus de la table income + revenus des paiements mensuels
    return $incomeTotal + $monthlyPaymentsTotal;
}
// حساب إجمالي المصاريف لفترة معينة
function calculateTotalExpenses($startDate = null, $endDate = null) {
    $params = [];
    $whereClause = '';
    
    if ($startDate && $endDate) {
        $whereClause = "WHERE payment_date BETWEEN :start_date AND :end_date";
        $params[':start_date'] = $startDate;
        $params[':end_date'] = $endDate;
    } elseif ($startDate) {
        $whereClause = "WHERE payment_date >= :start_date";
        $params[':start_date'] = $startDate;
    } elseif ($endDate) {
        $whereClause = "WHERE payment_date <= :end_date";
        $params[':end_date'] = $endDate;
    }
    
    $query = "SELECT SUM(amount) as total FROM expenses {$whereClause}";
    $result = fetchOne($query, $params);
    
    return $result ? $result['total'] : 0;
}

// حساب الرصيد (المداخيل - المصاريف)
function calculateBalance($startDate = null, $endDate = null) {
    $income = calculateTotalIncome($startDate, $endDate);
    $expenses = calculateTotalExpenses($startDate, $endDate);
    
    return $income - $expenses;
}

// الحصول على إحصائيات عامة للوحة التحكم
function getDashboardStats() {
    $stats = [];
    
    // عدد المنخرطين
    $query = "SELECT COUNT(*) as total FROM members WHERE status = 'active'";
    $result = fetchOne($query);
    $stats['total_members'] = $result['total'];
    
    // عدد المؤطرين
    $query = "SELECT COUNT(*) as total FROM coaches WHERE status = 'active'";
    $result = fetchOne($query);
    $stats['total_coaches'] = $result['total'];
    
    // عدد الاشتراكات السارية
    $query = "SELECT COUNT(DISTINCT member_id) as total FROM subscriptions WHERE end_date >= CURRENT_DATE";
    $result = fetchOne($query);
    $stats['active_subscriptions'] = $result['total'];
    
    // إجمالي المداخيل للشهر الحالي
    $currentMonth = date('Y-m-01');
    $nextMonth = date('Y-m-01', strtotime('+1 month'));
    $stats['monthly_income'] = calculateTotalIncome($currentMonth, date('Y-m-d', strtotime($nextMonth) - 1));
    
    // إجمالي المصاريف للشهر الحالي
    $stats['monthly_expenses'] = calculateTotalExpenses($currentMonth, date('Y-m-d', strtotime($nextMonth) - 1));
    
    // الرصيد الحالي
    $stats['current_balance'] = calculateBalance();
    
    return $stats;
}

/**
 * الحصول على اسم طريقة الدفع بالعربية
 * 
 * @param string $method كود طريقة الدفع
 * @return string اسم طريقة الدفع بالعربية
 */
function getPaymentMethodName($method) {
    switch($method) {
        case 'cash':
            return 'نقدا';
        case 'bank_transfer':
            return 'تحويل بنكي';
        case 'check':
            return 'شيك';
        default:
            return '-';
    }
}

/**
 * تحميل صورة المنخرط
 * 
 * @param array $file ملف الصورة المرفوعة
 * @return string|false اسم الملف في حالة النجاح، false في حالة الفشل
 */
function uploadMemberPhoto($file) {
    $result = uploadImage($file, MEMBERS_PHOTOS_PATH);
    if ($result['success']) {
        return $result['file_name'];
    }
    return false;
}

?>
