<?php
/**
 * Script pour diagnostiquer les erreurs d'import des départements
 */

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

echo "Diagnostic des erreurs d'import\n";
echo "==============================\n\n";

try {
    $appConfig = AppConfig::getInstance();
    Database::init($appConfig->getDatabaseConfig());
    $db = Database::getInstance();
    
    // 1. Lister les départements importés
    echo "1. Départements importés avec succès:\n";
    $sql = "SELECT code_dept, nom_dept FROM x_departements_contours ORDER BY code_dept";
    $stmt = $db->query($sql);
    $imported = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
    
    echo "   Total : " . count($imported) . " départements\n";
    
    // 2. Vérifier spécifiquement le 06
    if (!isset($imported['06'])) {
        echo "\n   ⚠️  Le département 06 n'est pas dans la base\n";
    }
    
    // 3. Lire le fichier GeoJSON pour voir tous les départements
    $filePath = __DIR__ . '/docs/contour-des-departements.geojson';
    
    if (!file_exists($filePath)) {
        echo "\n✗ Fichier non trouvé : $filePath\n";
        exit(1);
    }
    
    echo "\n2. Analyse du fichier GeoJSON:\n";
    $json = json_decode(file_get_contents($filePath), true);
    
    if (!$json || !isset($json['features'])) {
        echo "   ✗ Erreur de lecture du fichier\n";
        exit(1);
    }
    
    $totalInFile = count($json['features']);
    echo "   Total dans le fichier : $totalInFile départements\n";
    
    // 4. Identifier les départements manquants
    $missingDepts = [];
    $dept06Found = false;
    
    foreach ($json['features'] as $feature) {
        $code = $feature['properties']['code'] ?? null;
        $nom = $feature['properties']['nom'] ?? null;
        
        if ($code === '06') {
            $dept06Found = true;
            echo "\n3. Analyse du département 06:\n";
            echo "   - Code : $code\n";
            echo "   - Nom : $nom\n";
            echo "   - Type de géométrie : " . ($feature['geometry']['type'] ?? 'inconnu') . "\n";
            
            // Tester la conversion
            if (isset($feature['geometry'])) {
                $geometry = $feature['geometry'];
                $type = $geometry['type'] ?? null;
                
                if ($type === 'MultiPolygon') {
                    echo "   - C'est un MultiPolygon avec " . count($geometry['coordinates']) . " polygones\n";
                    
                    // Créer le WKT pour test
                    $polygons = [];
                    $totalPoints = 0;
                    foreach ($geometry['coordinates'] as $i => $polygon) {
                        $ring = $polygon[0];
                        $totalPoints += count($ring);
                        if ($i < 2) { // Afficher info des 2 premiers polygones
                            echo "     * Polygone " . ($i+1) . " : " . count($ring) . " points\n";
                        }
                    }
                    echo "   - Total de points : $totalPoints\n";
                    
                    // Tester l'insertion
                    echo "\n   Test d'insertion du département 06...\n";
                    try {
                        // Construire le WKT MultiPolygon
                        $polygons = [];
                        $allPoints = [];
                        
                        foreach ($geometry['coordinates'] as $polygon) {
                            $ring = $polygon[0];
                            $points = [];
                            foreach ($ring as $point) {
                                $points[] = $point[0] . ' ' . $point[1];
                                $allPoints[] = $point;
                            }
                            $polygons[] = '((' . implode(',', $points) . '))';
                        }
                        
                        $wkt = 'MULTIPOLYGON(' . implode(',', $polygons) . ')';
                        
                        // Calculer bbox
                        $lats = array_map(function($p) { return $p[1]; }, $allPoints);
                        $lngs = array_map(function($p) { return $p[0]; }, $allPoints);
                        
                        // Tester si le polygone est valide
                        $testSql = "SELECT ST_IsValid(ST_GeomFromText(:wkt, 4326)) as is_valid, 
                                           ST_AsText(ST_GeomFromText(:wkt, 4326)) as geom_text";
                        $testStmt = $db->prepare($testSql);
                        $testStmt->execute(['wkt' => $wkt]);
                        $result = $testStmt->fetch();
                        
                        if ($result['is_valid']) {
                            echo "   ✓ Géométrie valide\n";
                            
                            // Essayer l'insertion
                            $insertSql = "INSERT INTO x_departements_contours 
                                         (code_dept, nom_dept, contour, bbox_min_lat, bbox_max_lat, bbox_min_lng, bbox_max_lng) 
                                         VALUES 
                                         (:code, :nom, ST_GeomFromText(:polygon, 4326), :min_lat, :max_lat, :min_lng, :max_lng)";
                            
                            $insertStmt = $db->prepare($insertSql);
                            $insertStmt->execute([
                                'code' => '06',
                                'nom' => $nom,
                                'polygon' => $wkt,
                                'min_lat' => min($lats),
                                'max_lat' => max($lats),
                                'min_lng' => min($lngs),
                                'max_lng' => max($lngs)
                            ]);
                            
                            echo "   ✓ Insertion réussie!\n";
                            
                        } else {
                            echo "   ✗ Géométrie invalide\n";
                        }
                        
                    } catch (Exception $e) {
                        echo "   ✗ Erreur : " . $e->getMessage() . "\n";
                    }
                    
                } elseif ($type === 'Polygon') {
                    echo "   - C'est un Polygon simple\n";
                }
            }
        }
        
        if ($code && !isset($imported[$code])) {
            $missingDepts[$code] = $nom;
        }
    }
    
    if (!$dept06Found) {
        echo "\n⚠️  Le département 06 n'est pas dans le fichier GeoJSON!\n";
    }
    
    // 5. Lister tous les départements manquants
    echo "\n4. Départements manquants:\n";
    ksort($missingDepts);
    foreach ($missingDepts as $code => $nom) {
        echo "   - $code : $nom\n";
    }
    
    echo "\n5. Résumé:\n";
    echo "   - Dans le fichier : $totalInFile départements\n";
    echo "   - Importés : " . count($imported) . " départements\n";
    echo "   - Manquants : " . count($missingDepts) . " départements\n";
    
} catch (Exception $e) {
    echo "✗ Erreur : " . $e->getMessage() . "\n";
}