<?php
/**
 * Script pour mettre à jour le calcul des revenus totaux en incluant les paiements mensuels
 */

// 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) . ' د.م.';
}

// Mise à jour de la fonction calculateTotalIncome
$functionsFile = 'includes/functions.php';
$backupFile = 'includes/functions.php.bak.' . date('YmdHis');

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

// Lecture du contenu du fichier
$content = file_get_contents($functionsFile);

// Nouvelle fonction calculateTotalIncome qui inclut les paiements mensuels
$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
$pattern = '/\/\/ حساب إجمالي المداخيل لفترة معينة\s*function calculateTotalIncome\([^\)]*\)\s*\{[^}]*\}/s';
$updatedContent = preg_replace($pattern, $newFunction, $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>";

// Vérification de la structure de la table monthly_payments
echo "<h2>Structure de la table monthly_payments</h2>";
try {
    $query = "PRAGMA table_info(monthly_payments)";
    $stmt = $db->prepare($query);
    $stmt->execute();
    $columns = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    echo "<table border='1' cellpadding='5'>";
    echo "<tr><th>Nom</th><th>Type</th><th>Nullable</th><th>Default</th><th>Primary Key</th></tr>";
    
    foreach ($columns as $column) {
        echo "<tr>";
        echo "<td>" . $column['name'] . "</td>";
        echo "<td>" . $column['type'] . "</td>";
        echo "<td>" . ($column['notnull'] ? 'Non' : 'Oui') . "</td>";
        echo "<td>" . $column['dflt_value'] . "</td>";
        echo "<td>" . ($column['pk'] ? 'Oui' : 'Non') . "</td>";
        echo "</tr>";
    }
    
    echo "</table>";
} catch (Exception $e) {
    echo "<p>Erreur lors de la récupération de la structure de la table : " . $e->getMessage() . "</p>";
}

// Test de la fonction calculateTotalIncome mise à jour
echo "<h2>Test de la fonction calculateTotalIncome</h2>";

// Recharger le fichier functions.php pour utiliser la nouvelle fonction
require_once 'includes/functions.php';

// 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 "<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>";
}

// Création d'une fonction pour vérifier si un paiement mensuel a déjà été ajouté comme revenu
$functionsFinanceFile = 'includes/functions_finance.php';
$functionsFinanceContent = file_get_contents($functionsFinanceFile);

// Vérification de l'existence de la fonction checkMonthlyPaymentIncome
if (strpos($functionsFinanceContent, 'function checkMonthlyPaymentIncome') === false) {
    // Ajout de la fonction checkMonthlyPaymentIncome
    $newFunction = <<<'EOT'

/**
 * Vérifie si un paiement mensuel a déjà été ajouté comme revenu
 * 
 * @param int $memberId ID du membre
 * @param string $paymentMonth Mois du paiement (format YYYY-MM)
 * @return bool True si le paiement a déjà été ajouté comme revenu, false sinon
 */
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;
}
EOT;
    
    // Ajout de la fonction à la fin du fichier
    $functionsFinanceContent .= $newFunction;
    file_put_contents($functionsFinanceFile, $functionsFinanceContent);
    
    echo "<p>La fonction checkMonthlyPaymentIncome a été ajoutée au fichier functions_finance.php.</p>";
}

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

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) . ' د.م.';
}

// 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 = 1; // Administrateur par défaut
        $result = addMonthlyPaymentAsIncome($memberId, $paymentMonth, $amount, $paymentMethod, $paymentDate, $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>";
        }
    }
    
    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;

// Sauvegarde du script de synchronisation
file_put_contents('sync_monthly_payments.php', $syncScript);
echo "<p>Un script de synchronisation des paiements mensuels avec la table income a été créé : <a href='sync_monthly_payments.php'>sync_monthly_payments.php</a></p>";

// Ajout 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>";
?>
