<?php
/**
 * Script d'exécution des améliorations du système de caisse
 * StayManager - Amélioration du système financier
 */

// Configuration de base
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Inclure la configuration de la base de données
require_once __DIR__ . '/config/config.php';

try {
    // Initialiser la connexion à la base de données
    $db = new Database();
    $pdo = $db->getConnection();
    
    echo "<h2>Améliorations du Système de Caisse</h2>\n";
    echo "<p>Début de l'exécution : " . date('Y-m-d H:i:s') . "</p>\n";
    
    // 1. Exécuter la mise à jour des soldes des factures restaurant
    echo "<h3>1. Mise à jour des soldes des factures restaurant</h3>\n";
    $balanceUpdateFile = __DIR__ . '/update_restaurant_invoices_balance.sql';
    if (file_exists($balanceUpdateFile)) {
        $sql = file_get_contents($balanceUpdateFile);
        $queries = array_filter(array_map('trim', explode(';', $sql)));
        
        $successCount = 0;
        $errorCount = 0;
        
        foreach ($queries as $query) {
            if (empty($query) || strpos($query, '--') === 0) {
                continue;
            }
            
            try {
                $pdo->exec($query);
                $successCount++;
            } catch (PDOException $e) {
                $errorCount++;
                echo "<p style='color: red;'>✗ Erreur : " . $e->getMessage() . "</p>\n";
            }
        }
        
        echo "<p>Requêtes exécutées : <strong>$successCount</strong> | Erreurs : <strong>$errorCount</strong></p>\n";
    } else {
        echo "<p style='color: orange;'>⚠ Fichier de mise à jour des soldes non trouvé</p>\n";
    }
    
    // 2. Exécuter les améliorations du système de caisse
    echo "<h3>2. Améliorations du système de caisse</h3>\n";
    $cashUpdateFile = __DIR__ . '/enhanced_cash_register_updates.sql';
    if (file_exists($cashUpdateFile)) {
        $sql = file_get_contents($cashUpdateFile);
        $queries = array_filter(array_map('trim', explode(';', $sql)));
        
        $successCount = 0;
        $errorCount = 0;
        
        foreach ($queries as $query) {
            if (empty($query) || strpos($query, '--') === 0) {
                continue;
            }
            
            try {
                $pdo->exec($query);
                $successCount++;
                
                // Afficher le progrès pour les requêtes importantes
                if (stripos($query, 'ALTER TABLE') !== false) {
                    echo "<p>✓ Table modifiée avec succès</p>\n";
                } elseif (stripos($query, 'CREATE TABLE') !== false) {
                    echo "<p>✓ Table créée avec succès</p>\n";
                } elseif (stripos($query, 'CREATE TRIGGER') !== false) {
                    echo "<p>✓ Trigger créé avec succès</p>\n";
                } elseif (stripos($query, 'CREATE VIEW') !== false) {
                    echo "<p>✓ Vue créée avec succès</p>\n";
                } elseif (stripos($query, 'CREATE FUNCTION') !== false) {
                    echo "<p>✓ Fonction créée avec succès</p>\n";
                } elseif (stripos($query, 'CREATE PROCEDURE') !== false) {
                    echo "<p>✓ Procédure créée avec succès</p>\n";
                } elseif (stripos($query, 'INSERT INTO') !== false) {
                    echo "<p>✓ Données insérées avec succès</p>\n";
                }
                
            } catch (PDOException $e) {
                $errorCount++;
                echo "<p style='color: red;'>✗ Erreur : " . $e->getMessage() . "</p>\n";
            }
        }
        
        echo "<p>Requêtes exécutées : <strong>$successCount</strong> | Erreurs : <strong>$errorCount</strong></p>\n";
    } else {
        echo "<p style='color: orange;'>⚠ Fichier d'améliorations de caisse non trouvé</p>\n";
    }
    
    // 3. Vérifier les nouvelles tables créées
    echo "<h3>3. Vérification des nouvelles tables</h3>\n";
    
    $newTables = [
        'cash_receipts' => 'Reçus de caisse',
        'cash_session_closures' => 'Lignes de clôture de caisse',
        'disbursement_approvals' => 'Autorisations de décaissement',
        'disbursement_categories' => 'Catégories de décaissement'
    ];
    
    echo "<table border='1' style='border-collapse: collapse; margin: 10px 0;'>\n";
    echo "<tr><th>Table</th><th>Description</th><th>Statut</th><th>Lignes</th></tr>\n";
    
    foreach ($newTables as $table => $description) {
        try {
            $stmt = $pdo->query("SELECT COUNT(*) as count FROM $table");
            $count = $stmt->fetch(PDO::FETCH_ASSOC)['count'];
            echo "<tr><td>$table</td><td>$description</td><td style='color: green;'>✓ Créée</td><td>$count</td></tr>\n";
        } catch (PDOException $e) {
            echo "<tr><td>$table</td><td>$description</td><td style='color: red;'>✗ Erreur</td><td>-</td></tr>\n";
        }
    }
    echo "</table>\n";
    
    // 4. Vérifier les colonnes ajoutées
    echo "<h3>4. Vérification des colonnes ajoutées</h3>\n";
    
    $columnsToCheck = [
        'restaurant_invoices' => ['balance'],
        'cash_transactions' => ['receipt_number', 'disbursement_reason', 'disbursement_category', 'approval_required']
    ];
    
    echo "<table border='1' style='border-collapse: collapse; margin: 10px 0;'>\n";
    echo "<tr><th>Table</th><th>Colonne</th><th>Statut</th></tr>\n";
    
    foreach ($columnsToCheck as $table => $columns) {
        foreach ($columns as $column) {
            try {
                $stmt = $pdo->query("SHOW COLUMNS FROM $table LIKE '$column'");
                if ($stmt->rowCount() > 0) {
                    echo "<tr><td>$table</td><td>$column</td><td style='color: green;'>✓ Ajoutée</td></tr>\n";
                } else {
                    echo "<tr><td>$table</td><td>$column</td><td style='color: red;'>✗ Manquante</td></tr>\n";
                }
            } catch (PDOException $e) {
                echo "<tr><td>$table</td><td>$column</td><td style='color: red;'>✗ Erreur</td></tr>\n";
            }
        }
    }
    echo "</table>\n";
    
    // 5. Tester les nouvelles fonctionnalités
    echo "<h3>5. Test des nouvelles fonctionnalités</h3>\n";
    
    // Test de la fonction de calcul de solde
    try {
        $stmt = $pdo->query("SELECT get_client_restaurant_balance(1) as balance");
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        echo "<p>✓ Fonction get_client_restaurant_balance() : " . $result['balance'] . " FCFA</p>\n";
    } catch (PDOException $e) {
        echo "<p style='color: red;'>✗ Erreur fonction get_client_restaurant_balance() : " . $e->getMessage() . "</p>\n";
    }
    
    // Test de la vue des factures avec solde
    try {
        $stmt = $pdo->query("SELECT COUNT(*) as count FROM v_restaurant_invoices_with_balance");
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        echo "<p>✓ Vue v_restaurant_invoices_with_balance : " . $result['count'] . " factures</p>\n";
    } catch (PDOException $e) {
        echo "<p style='color: red;'>✗ Erreur vue v_restaurant_invoices_with_balance() : " . $e->getMessage() . "</p>\n";
    }
    
    // 6. Statistiques finales
    echo "<h3>6. Statistiques finales</h3>\n";
    
    // Compter les factures avec solde
    $stmt = $pdo->query("
        SELECT 
            COUNT(*) as total_invoices,
            SUM(balance) as total_balance,
            COUNT(CASE WHEN balance > 0 THEN 1 END) as unpaid_invoices,
            COUNT(CASE WHEN balance = 0 AND payment_status = 'paid' THEN 1 END) as paid_invoices
        FROM restaurant_invoices
    ");
    $stats = $stmt->fetch(PDO::FETCH_ASSOC);
    
    echo "<table border='1' style='border-collapse: collapse; margin: 10px 0;'>\n";
    echo "<tr><th>Statistique</th><th>Valeur</th></tr>\n";
    echo "<tr><td>Total des factures restaurant</td><td>" . $stats['total_invoices'] . "</td></tr>\n";
    echo "<tr><td>Factures avec solde</td><td>" . $stats['unpaid_invoices'] . "</td></tr>\n";
    echo "<tr><td>Factures payées</td><td>" . $stats['paid_invoices'] . "</td></tr>\n";
    echo "<tr><td>Solde total à recouvrer</td><td>" . number_format($stats['total_balance'], 2) . " FCFA</td></tr>\n";
    echo "</table>\n";
    
    // Compter les sessions de caisse
    try {
        $stmt = $pdo->query("SELECT COUNT(*) as count FROM cash_sessions");
        $sessionCount = $stmt->fetch(PDO::FETCH_ASSOC)['count'];
        echo "<p>Total des sessions de caisse : <strong>$sessionCount</strong></p>\n";
    } catch (PDOException $e) {
        echo "<p style='color: red;'>Erreur lors du comptage des sessions : " . $e->getMessage() . "</p>\n";
    }
    
    echo "<div style='background-color: #d4edda; border: 1px solid #c3e6cb; border-radius: 5px; padding: 15px; margin: 20px 0;'>\n";
    echo "<h4 style='color: #155724; margin-top: 0;'>✅ Mise à jour terminée avec succès !</h4>\n";
    echo "<p style='color: #155724; margin-bottom: 0;'>\n";
    echo "Le système de caisse a été amélioré avec les fonctionnalités suivantes :<br>\n";
    echo "• Gestion des soldes des factures restaurant<br>\n";
    echo "• Interface de sélection client et factures<br>\n";
    echo "• Système de reçus avec édition et impression<br>\n";
    echo "• Fonctionnalités de décaissement avec approbation<br>\n";
    echo "• Clôture de session avec ligne de clôture<br>\n";
    echo "• États et rapports des transactions<br>\n";
    echo "</p>\n";
    echo "</div>\n";
    
    echo "<p>Fin de l'exécution : " . date('Y-m-d H:i:s') . "</p>\n";
    
} catch (Exception $e) {
    echo "<h3 style='color: red;'>Erreur fatale :</h3>\n";
    echo "<p style='color: red;'>" . htmlspecialchars($e->getMessage()) . "</p>\n";
    echo "<p>Veuillez vérifier la configuration de la base de données et réessayer.</p>\n";
}

// Bouton pour retourner au dashboard
echo "<br><a href='dashboard.php' style='background: #007cba; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px;'>Retour au Dashboard</a>\n";
echo "<br><br><a href='cash_register.php' style='background: #28a745; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px;'>Accéder à la Caisse</a>\n";
?>






