<?php
/**
 * Script final pour corriger le calcul des revenus totaux en incluant les paiements mensuels
 * Ce script modifie directement la fonction calculateTotalIncome dans le fichier functions.php
 */

require_once 'config.php';
require_once 'database/init.php';

// Vérifier la structure de la table monthly_payments
try {
    $mpStructure = fetchAll("PRAGMA table_info(monthly_payments)");
    echo "<h2>Structure de la table monthly_payments</h2>";
    echo "<pre>";
    print_r($mpStructure);
    echo "</pre>";
} catch (Exception $e) {
    echo "<p>Erreur lors de la vérification de la structure de la table monthly_payments: " . $e->getMessage() . "</p>";
}

// Vérifier les données de la table monthly_payments
try {
    $mpData = fetchAll("SELECT * FROM monthly_payments LIMIT 5");
    echo "<h2>Données de la table monthly_payments (5 premiers enregistrements)</h2>";
    echo "<pre>";
    print_r($mpData);
    echo "</pre>";
} catch (Exception $e) {
    echo "<p>Erreur lors de la récupération des données de la table monthly_payments: " . $e->getMessage() . "</p>";
}

// Modifier directement le fichier functions.php pour inclure les paiements mensuels dans le calcul des revenus
$functionsFile = 'includes/functions.php';
$functionsContent = file_get_contents($functionsFile);

// Créer la nouvelle fonction calculateTotalIncome
$newFunction = <<<'EOT'
// حساب إجمالي المداخيل لفترة معينة
function calculateTotalIncome($startDate = null, $endDate = null) {
    global $db;
    
    // 1. حساب المداخيل من جدول 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. حساب المداخيل من الدفعات الشهرية
    $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. إجمالي المداخيل = المداخيل من جدول income + المداخيل من الدفعات الشهرية
    return $incomeTotal + $monthlyPaymentsTotal;
}
EOT;

// Remplacer la fonction existante
$pattern = '/\/\/ حساب إجمالي المداخيل لفترة معينة\s*function calculateTotalIncome\([^\)]*\)\s*\{[^}]*\}/s';
$updatedContent = preg_replace($pattern, $newFunction, $functionsContent);

// Sauvegarder le fichier mis à jour
file_put_contents($functionsFile, $updatedContent);
echo "<h2>Mise à jour de la fonction calculateTotalIncome</h2>";
echo "<p>La fonction a été mise à jour pour inclure les paiements mensuels dans le calcul des revenus totaux.</p>";

// Tester la nouvelle fonction
require_once 'includes/functions.php';

$currentMonth = date('Y-m-01');
$nextMonth = date('Y-m-01', strtotime('+1 month'));
$endOfMonth = date('Y-m-d', strtotime($nextMonth) - 1);

// Calcul des revenus avec la nouvelle fonction
$totalIncome = calculateTotalIncome($currentMonth, $endOfMonth);

// Calcul séparé des revenus de la table income
try {
    $incomeQuery = "SELECT SUM(amount) as total FROM income WHERE payment_date BETWEEN ? AND ?";
    $stmt = $db->prepare($incomeQuery);
    $stmt->execute([$currentMonth, $endOfMonth]);
    $incomeResult = $stmt->fetch(PDO::FETCH_ASSOC);
    $incomeTotal = $incomeResult && $incomeResult['total'] ? (float)$incomeResult['total'] : 0;
} catch (Exception $e) {
    echo "<p>Erreur lors du calcul des revenus de la table income: " . $e->getMessage() . "</p>";
    $incomeTotal = 0;
}

// Calcul séparé des revenus des paiements mensuels
try {
    $mpQuery = "SELECT SUM(amount_paid) as total FROM monthly_payments WHERE payment_status = 'paid' AND payment_date BETWEEN ? AND ?";
    $stmt = $db->prepare($mpQuery);
    $stmt->execute([$currentMonth, $endOfMonth]);
    $mpResult = $stmt->fetch(PDO::FETCH_ASSOC);
    $monthlyPaymentsTotal = $mpResult && $mpResult['total'] ? (float)$mpResult['total'] : 0;
} catch (Exception $e) {
    echo "<p>Erreur lors du calcul des revenus des paiements mensuels: " . $e->getMessage() . "</p>";
    $monthlyPaymentsTotal = 0;
}

echo "<h2>Résultats pour le mois en cours (" . date('m/Y') . ")</h2>";
echo "<ul>";
echo "<li>Revenus de la table income: " . number_format($incomeTotal, 2) . " د.م.</li>";
echo "<li>Revenus des paiements mensuels: " . number_format($monthlyPaymentsTotal, 2) . " د.م.</li>";
echo "<li>Total des revenus (calculé séparément): " . number_format($incomeTotal + $monthlyPaymentsTotal, 2) . " د.م.</li>";
echo "<li>Total des revenus (fonction calculateTotalIncome): " . number_format($totalIncome, 2) . " د.م.</li>";
echo "</ul>";

if ($totalIncome == ($incomeTotal + $monthlyPaymentsTotal)) {
    echo "<p style='color:green;font-weight:bold;'>✓ La fonction calculateTotalIncome fonctionne correctement!</p>";
} else {
    echo "<p style='color:red;font-weight:bold;'>✗ La fonction calculateTotalIncome ne calcule pas correctement le total des revenus.</p>";
}

// Créer une fonction pour afficher les sources de revenus dans les rapports
$reportsIncomeSection = <<<'EOT'
<?php
/**
 * قسم المداخيل في التقارير
 */

/**
 * عرض تفاصيل المداخيل في التقارير
 *
 * @param string $startDate تاريخ البداية
 * @param string $endDate تاريخ النهاية
 */
function displayIncomeSection($startDate, $endDate) {
    global $db;
    
    // الحصول على المداخيل من جدول income
    $incomeQuery = "SELECT source, SUM(amount) as total FROM income 
                    WHERE payment_date BETWEEN ? AND ? 
                    GROUP BY source";
    $stmt = $db->prepare($incomeQuery);
    $stmt->execute([$startDate, $endDate]);
    $incomeResult = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    // الحصول على المداخيل من الدفعات الشهرية
    $mpQuery = "SELECT SUM(amount_paid) as total FROM monthly_payments 
                WHERE payment_status = 'paid' AND payment_date BETWEEN ? AND ?";
    $stmt = $db->prepare($mpQuery);
    $stmt->execute([$startDate, $endDate]);
    $mpResult = $stmt->fetch(PDO::FETCH_ASSOC);
    $monthlyPaymentsTotal = $mpResult && $mpResult['total'] ? (float)$mpResult['total'] : 0;
    
    // تجميع المداخيل حسب المصدر
    $incomeBySource = [];
    foreach ($incomeResult as $row) {
        $incomeBySource[$row['source']] = (float)$row['total'];
    }
    
    // إضافة المداخيل من الدفعات الشهرية
    if ($monthlyPaymentsTotal > 0) {
        if (isset($incomeBySource['monthly_subscription'])) {
            $incomeBySource['monthly_subscription'] += $monthlyPaymentsTotal;
        } else {
            $incomeBySource['monthly_subscription'] = $monthlyPaymentsTotal;
        }
    }
    
    // حساب إجمالي المداخيل
    $totalIncome = array_sum($incomeBySource);
    
    // عرض جدول المداخيل
    ?>
    <div class="card mb-4">
        <div class="card-header bg-success text-white">
            <h5 class="mb-0"><i class="fas fa-money-bill-wave me-2"></i> المداخيل حسب المصدر</h5>
        </div>
        <div class="card-body">
            <div class="table-responsive">
                <table class="table table-striped table-hover">
                    <thead class="table-light">
                        <tr>
                            <th>المصدر</th>
                            <th>المبلغ</th>
                            <th>النسبة</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ($incomeBySource as $source => $amount): ?>
                        <tr>
                            <td>
                                <?php 
                                switch ($source) {
                                    case 'subscription':
                                        echo 'اشتراكات سنوية';
                                        break;
                                    case 'monthly_subscription':
                                        echo 'اشتراكات شهرية';
                                        break;
                                    case 'donation':
                                        echo 'تبرعات';
                                        break;
                                    case 'event':
                                        echo 'فعاليات';
                                        break;
                                    case 'other':
                                        echo 'أخرى';
                                        break;
                                    default:
                                        echo $source;
                                }
                                ?>
                            </td>
                            <td><?php echo number_format($amount, 2) . ' د.م.'; ?></td>
                            <td><?php echo number_format(($amount / $totalIncome) * 100, 1) . '%'; ?></td>
                        </tr>
                        <?php endforeach; ?>
                    </tbody>
                    <tfoot class="table-light">
                        <tr>
                            <th>المجموع</th>
                            <th><?php echo number_format($totalIncome, 2) . ' د.م.'; ?></th>
                            <th>100%</th>
                        </tr>
                    </tfoot>
                </table>
            </div>
        </div>
    </div>
    <?php
}
?>
EOT;

// Enregistrer le fichier de section des revenus pour les rapports
$reportsSectionFile = 'reports/income_section.php';
file_put_contents($reportsSectionFile, $reportsIncomeSection);
echo "<p>Un nouveau fichier <code>reports/income_section.php</code> a été créé pour afficher les détails des revenus dans les rapports, y compris les paiements mensuels.</p>";

// Modifier le fichier de rapport global pour inclure la section des revenus
$globalReportFile = 'reports/global_report.php';
if (file_exists($globalReportFile)) {
    $globalReportContent = file_get_contents($globalReportFile);
    
    // Vérifier si la section des revenus est déjà incluse
    if (strpos($globalReportContent, 'require_once \'income_section.php\';') === false) {
        // Ajouter l'inclusion du fichier income_section.php
        $includeStatement = "require_once 'income_section.php';";
        $globalReportContent = str_replace("<?php", "<?php\n" . $includeStatement, $globalReportContent);
        
        // Ajouter l'appel à la fonction displayIncomeSection
        $sectionCall = "<!-- قسم تفاصيل المداخيل -->\n<?php displayIncomeSection(\$startDate, \$endDate); ?>";
        
        // Chercher la section des revenus existante et ajouter la nouvelle section après
        $incomeSection = "<!-- قسم الإيرادات -->";
        $position = strpos($globalReportContent, $incomeSection);
        
        if ($position !== false) {
            // Trouver la fin de la section des revenus
            $endPosition = strpos($globalReportContent, "<!-- قسم المصاريف -->", $position);
            if ($endPosition !== false) {
                // Insérer la nouvelle section avant la section des dépenses
                $globalReportContent = substr($globalReportContent, 0, $endPosition) . "\n" . $sectionCall . "\n\n" . substr($globalReportContent, $endPosition);
                
                // Enregistrer le fichier mis à jour
                file_put_contents($globalReportFile, $globalReportContent);
                echo "<p>Le fichier <code>reports/global_report.php</code> a été mis à jour pour inclure la section détaillée des revenus.</p>";
            } else {
                echo "<p>Impossible de trouver la fin de la section des revenus dans le fichier <code>reports/global_report.php</code>.</p>";
            }
        } else {
            echo "<p>Impossible de trouver la section des revenus dans le fichier <code>reports/global_report.php</code>.</p>";
        }
    } else {
        echo "<p>La section des revenus est déjà incluse dans le fichier <code>reports/global_report.php</code>.</p>";
    }
} else {
    echo "<p>Le fichier <code>reports/global_report.php</code> n'existe pas.</p>";
}

echo "<h2>Conclusion</h2>";
echo "<p>Le problème a été résolu. Les paiements mensuels sont maintenant inclus dans le calcul des revenus totaux.</p>";
echo "<p>Vous pouvez maintenant vérifier le tableau de bord et les rapports pour vous assurer que les paiements mensuels sont correctement comptabilisés dans les revenus.</p>";
?>
