<?php
/**
 * Script de test de la connexion à la base de données des adresses
 * Adapté pour la structure par département
 */

require_once __DIR__ . '/src/Config/AppConfig.php';
require_once __DIR__ . '/src/Core/Database.php';
require_once __DIR__ . '/src/Core/AddressesDatabase.php';

echo "Test de connexion à la base de données des adresses par département\n";
echo "==================================================================\n\n";

try {
    // Initialiser la configuration
    $appConfig = AppConfig::getInstance();
    $addressesConfig = $appConfig->getAddressesDatabaseConfig();
    
    echo "Configuration:\n";
    echo "- Environnement: " . $appConfig->getEnvironment() . "\n";
    echo "- Host: " . $addressesConfig['host'] . "\n";
    echo "- Database: " . $addressesConfig['name'] . "\n";
    echo "- Username: " . $addressesConfig['username'] . "\n\n";
    
    // Initialiser les connexions
    Database::init($appConfig->getDatabaseConfig());
    AddressesDatabase::init($addressesConfig);
    
    $mainDb = Database::getInstance();
    $addressesDb = AddressesDatabase::getInstance();
    
    echo "✓ Connexion réussie aux deux bases!\n\n";
    
    // Lister les tables cp* disponibles
    echo "Tables d'adresses disponibles:\n";
    $stmt = $addressesDb->query("SHOW TABLES LIKE 'cp%'");
    $tables = $stmt->fetchAll(PDO::FETCH_COLUMN);
    
    foreach ($tables as $table) {
        // Extraire le numéro de département
        $dept = str_replace('cp', '', $table);
        
        // Compter les lignes
        $countStmt = $addressesDb->query("SELECT COUNT(*) as total FROM `$table`");
        $count = $countStmt->fetch()['total'];
        
        echo "- $table (département $dept): " . number_format($count) . " adresses\n";
    }
    
    echo "\n";
    
    // Tester avec une entité
    echo "Test de récupération du département d'une entité:\n";
    $testEntityId = 1; // Changez selon votre base
    
    $stmt = $mainDb->prepare("SELECT id, nom, departement FROM entites WHERE id = :id");
    $stmt->execute(['id' => $testEntityId]);
    $entity = $stmt->fetch();
    
    if ($entity) {
        echo "- Entité #{$entity['id']}: {$entity['nom']} (département {$entity['departement']})\n";
        $tableName = "cp" . $entity['departement'];
        
        // Vérifier si la table existe
        if (in_array($tableName, $tables)) {
            echo "✓ Table $tableName existe\n";
            
            // Tester une requête sur cette table
            $stmt = $addressesDb->query("SELECT numero, rue, cp, ville, gps_lat, gps_lng 
                                        FROM `$tableName` 
                                        WHERE gps_lat != '' AND gps_lng != '' 
                                        LIMIT 3");
            $addresses = $stmt->fetchAll();
            
            echo "\nExemples d'adresses dans le département {$entity['departement']}:\n";
            foreach ($addresses as $addr) {
                echo "- {$addr['numero']} {$addr['rue']}, {$addr['cp']} {$addr['ville']} ";
                echo "(lat: {$addr['gps_lat']}, lng: {$addr['gps_lng']})\n";
            }
            
            // Tester une requête géospatiale
            echo "\nTest de requête géospatiale:\n";
            $testLat = $addresses[0]['gps_lat'] ?? 48.8566;
            $testLng = $addresses[0]['gps_lng'] ?? 2.3522;
            
            $sql = "SELECT COUNT(*) as total 
                    FROM `$tableName` 
                    WHERE ST_Distance_Sphere(
                        POINT(CAST(gps_lng AS DECIMAL(10,8)), CAST(gps_lat AS DECIMAL(10,8))),
                        POINT(:lng, :lat)
                    ) <= 1000
                    AND gps_lat != '' AND gps_lng != ''";
            
            $stmt = $addressesDb->prepare($sql);
            $stmt->execute(['lat' => $testLat, 'lng' => $testLng]);
            $result = $stmt->fetch();
            
            echo "✓ Adresses dans un rayon de 1km autour de ($testLat, $testLng): " . $result['total'] . "\n";
            
        } else {
            echo "✗ Table $tableName n'existe pas dans la base adresses\n";
        }
    }
    
} catch (Exception $e) {
    echo "✗ Erreur: " . $e->getMessage() . "\n";
    echo "Trace:\n" . $e->getTraceAsString() . "\n";
}

echo "\n";