<?php
/**
 * Script pour corriger la fonction calculateTotalIncome
 */

// Inclusion des fichiers nécessaires
require_once 'config.php';
require_once 'database/init.php';

// Fonction pour formater les montants
function formatAmount($amount) {
    return number_format($amount, 2) . ' د.م.';
}

// Sauvegarde du fichier functions.php original
$functionsFile = 'includes/functions.php';
$backupFile = 'includes/functions.php.bak.' . date('YmdHis');
copy($functionsFile, $backupFile);
echo "<p>Sauvegarde du fichier functions.php créée : " . basename($backupFile) . "</p>";

// Contenu complet du fichier functions.php
$content = file_get_contents($functionsFile);

// Recherche de la fonction calculateTotalIncome
$pattern = '/\/\/ حساب إجمالي المداخيل لفترة معينة\s*function calculateTotalIncome.*?\}/s';
preg_match($pattern, $content, $matches);

if (!empty($matches[0])) {
    echo "<p>Fonction calculateTotalIncome trouvée dans le fichier functions.php.</p>";
    
    // Nouvelle fonction calculateTotalIncome
    $newFunction = <<<'EOT'
// حساب إجمالي المداخيل لفترة معينة
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;
}
EOT;
    
    // Remplacement de la fonction existante
    $updatedContent = preg_replace($pattern, $newFunction, $content);
    
    // Vérification si le contenu a été modifié
    if ($updatedContent !== $content) {
        // Sauvegarde du fichier mis à jour
        file_put_contents($functionsFile, $updatedContent);
        echo "<p>La fonction calculateTotalIncome a été mise à jour pour inclure les paiements mensuels dans le calcul des revenus totaux.</p>";
    } else {
        echo "<p>Aucune modification n'a été apportée au fichier functions.php.</p>";
    }
} else {
    echo "<p>Fonction calculateTotalIncome non trouvée dans le fichier functions.php.</p>";
    
    // Création d'une nouvelle fonction calculateTotalIncome
    $newFunction = <<<'EOT'

// حساب إجمالي المداخيل لفترة معينة
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;
}
EOT;
    
    // Ajout de la fonction à la fin du fichier
    file_put_contents($functionsFile, $content . $newFunction);
    echo "<p>Une nouvelle fonction calculateTotalIncome a été ajoutée au fichier functions.php.</p>";
}

// Création d'un fichier de test pour la fonction calculateTotalIncome
$testFile = 'test_income_calculation.php';
$testContent = <<<'EOT'
<?php
/**
 * Script de test pour la fonction calculateTotalIncome
 */

// Inclusion des fichiers nécessaires
require_once 'config.php';
require_once 'database/init.php';
require_once 'includes/functions.php';

// Fonction pour formater les montants
function formatAmount($amount) {
    return number_format($amount, 2) . ' د.م.';
}

// Calcul des revenus pour le mois en cours
$currentMonth = date('Y-m-01');
$endOfMonth = date('Y-m-t');

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

// Calcul séparé des revenus de la table income
$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;

// Calcul séparé des revenus des paiements mensuels
$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;

// Affichage des résultats
echo "<h1>Test de la fonction calculateTotalIncome</h1>";
echo "<p>Période : du " . date('d/m/Y', strtotime($currentMonth)) . " au " . date('d/m/Y', strtotime($endOfMonth)) . "</p>";
echo "<ul>";
echo "<li>Revenus de la table income : " . formatAmount($incomeTotal) . "</li>";
echo "<li>Revenus des paiements mensuels : " . formatAmount($monthlyPaymentsTotal) . "</li>";
echo "<li>Total des revenus (calculé séparément) : " . formatAmount($incomeTotal + $monthlyPaymentsTotal) . "</li>";
echo "<li>Total des revenus (fonction calculateTotalIncome) : " . formatAmount($totalIncome) . "</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>";
    echo "<p>Différence : " . formatAmount($totalIncome - ($incomeTotal + $monthlyPaymentsTotal)) . "</p>";
}

// Affichage du code de la fonction calculateTotalIncome
echo "<h2>Code de la fonction calculateTotalIncome</h2>";
echo "<pre>";
$pattern = '/\/\/ حساب إجمالي المداخيل لفترة معينة\s*function calculateTotalIncome.*?\}/s';
preg_match($pattern, file_get_contents('includes/functions.php'), $matches);
if (!empty($matches[0])) {
    echo htmlspecialchars($matches[0]);
} else {
    echo "Fonction non trouvée dans le fichier functions.php.";
}
echo "</pre>";

// Affichage d'un lien vers le tableau de bord
echo "<p><a href='dashboard.php' class='btn btn-primary'>Retour au tableau de bord</a></p>";
?>
EOT;

file_put_contents($testFile, $testContent);
echo "<p>Un fichier de test a été créé : <a href='{$testFile}'>{$testFile}</a></p>";

// Création d'un script pour synchroniser les paiements mensuels avec la table income
$syncFile = 'sync_monthly_payments.php';
$syncContent = <<<'EOT'
<?php
/**
 * Script pour synchroniser les paiements mensuels avec la table income
 */

// Inclusion des fichiers nécessaires
require_once 'config.php';
require_once 'database/init.php';
require_once 'includes/functions.php';
require_once 'includes/functions_finance.php';

// Fonction pour formater les montants
function formatAmount($amount) {
    return number_format($amount, 2) . ' د.م.';
}

// Fonction pour vérifier si un paiement mensuel a déjà été ajouté comme revenu
function checkMonthlyPaymentIncome($memberId, $paymentMonth) {
    global $db;
    
    $query = "SELECT COUNT(*) as count FROM income 
              WHERE source = 'monthly_subscription' 
              AND member_id = ? 
              AND notes LIKE ?";
    
    $stmt = $db->prepare($query);
    $stmt->execute([$memberId, "%Paiement mensuel pour $paymentMonth%"]);
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    
    return $result && $result['count'] > 0;
}

// Récupération de tous les paiements mensuels avec le statut "paid"
$query = "SELECT mp.*, m.first_name, m.last_name 
          FROM monthly_payments mp
          JOIN members m ON mp.member_id = m.id
          WHERE mp.payment_status = 'paid'";

$stmt = $db->prepare($query);
$stmt->execute();
$payments = $stmt->fetchAll(PDO::FETCH_ASSOC);

echo "<h1>Synchronisation des paiements mensuels avec la table income</h1>";
echo "<p>Nombre de paiements mensuels à traiter : " . count($payments) . "</p>";

$addedCount = 0;
$skippedCount = 0;

echo "<table border='1' cellpadding='5'>";
echo "<tr><th>ID</th><th>Membre</th><th>Mois</th><th>Montant</th><th>Statut</th><th>Action</th></tr>";

foreach ($payments as $payment) {
    $memberId = $payment['member_id'];
    $memberName = $payment['first_name'] . ' ' . $payment['last_name'];
    $paymentMonth = $payment['payment_month'];
    $amount = $payment['amount_paid'];
    $paymentMethod = $payment['payment_method'];
    $paymentDate = $payment['payment_date'];
    
    // Vérification si le paiement a déjà été ajouté comme revenu
    $alreadyAdded = checkMonthlyPaymentIncome($memberId, $paymentMonth);
    
    echo "<tr>";
    echo "<td>" . $payment['id'] . "</td>";
    echo "<td>" . $memberName . "</td>";
    echo "<td>" . $paymentMonth . "</td>";
    echo "<td>" . formatAmount($amount) . "</td>";
    echo "<td>" . $payment['payment_status'] . "</td>";
    
    if ($alreadyAdded) {
        echo "<td>Déjà ajouté comme revenu</td>";
        $skippedCount++;
    } else {
        // Ajout du paiement comme revenu
        $userId = isset($_SESSION['user_id']) ? $_SESSION['user_id'] : 1; // Administrateur par défaut
        
        try {
            $query = "INSERT INTO income (member_id, amount, source, payment_date, payment_method, notes, created_by) 
                      VALUES (?, ?, 'monthly_subscription', ?, ?, ?, ?)";
            $stmt = $db->prepare($query);
            $notes = "Paiement mensuel pour $paymentMonth";
            $result = $stmt->execute([$memberId, $amount, $paymentDate, $paymentMethod, $notes, $userId]);
            
            if ($result) {
                echo "<td style='color:green;'>Ajouté comme revenu</td>";
                $addedCount++;
            } else {
                echo "<td style='color:red;'>Erreur lors de l'ajout comme revenu</td>";
            }
        } catch (Exception $e) {
            echo "<td style='color:red;'>Erreur : " . $e->getMessage() . "</td>";
        }
    }
    
    echo "</tr>";
}

echo "</table>";

echo "<h2>Résumé</h2>";
echo "<ul>";
echo "<li>Paiements traités : " . count($payments) . "</li>";
echo "<li>Paiements ajoutés comme revenus : " . $addedCount . "</li>";
echo "<li>Paiements déjà ajoutés (ignorés) : " . $skippedCount . "</li>";
echo "</ul>";

echo "<p><a href='dashboard.php' class='btn btn-primary'>Retour au tableau de bord</a></p>";
?>
EOT;

file_put_contents($syncFile, $syncContent);
echo "<p>Un script de synchronisation des paiements mensuels a été créé : <a href='{$syncFile}'>{$syncFile}</a></p>";

// Exécution du script de test
echo "<h2>Exécution du script de test</h2>";
echo "<iframe src='{$testFile}' style='width:100%;height:400px;border:1px solid #ccc;'></iframe>";
?>
