<?php
/**
 * Script de migration pour la table sectors_adresses
 * Transfert les données depuis la table sectors_adresses de la base source vers la table sectors_adresses de la base cible
 * Ne migre que les adresses liées aux secteurs qui ont été migrés
 * Fait la correspondance entre les anciens secteurs (fk_old_sector) et les nouveaux secteurs (id) dans la table ope_sectors
 */

require_once dirname(__DIR__) . '/config.php';
require_once __DIR__ . '/MigrationConfig.php';

try {
    // Création du tunnel SSH si nécessaire
    createSshTunnel();

    // Connexion aux bases de données
    $sourceDb = getSourceConnection();
    $targetDb = getTargetConnection();

    echo "Début de la migration de la table sectors_adresses...\n";
    
    // Récupération de la correspondance entre les anciens secteurs et les nouveaux
    $query = "SELECT id, fk_old_sector FROM ope_sectors WHERE fk_old_sector IS NOT NULL";
    $stmt = $targetDb->query($query);
    $sectorMapping = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    if (empty($sectorMapping)) {
        echo "Aucun secteur n'a été migré. Veuillez d'abord migrer la table ope_sectors." . PHP_EOL;
        closeSshTunnel();
        exit(1);
    }

    echo "Nombre de secteurs migrés : " . count($sectorMapping) . PHP_EOL;
    
    // Création d'un tableau associatif pour faciliter la recherche des correspondances
    $sectorMap = [];
    foreach ($sectorMapping as $mapping) {
        $sectorMap[$mapping['fk_old_sector']] = $mapping['id'];
    }
    
    // Création de la liste des IDs de secteurs pour la requête IN
    $oldSectorIds = array_keys($sectorMap);
    $oldSectorIdsStr = implode(',', $oldSectorIds);
    
    // Récupération des adresses liées aux secteurs migrés
    $query = "
        SELECT * FROM sectors_adresses 
        WHERE fk_sector IN ($oldSectorIdsStr)
    ";
    
    $stmt = $sourceDb->query($query);
    $adresses = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    echo "Nombre d'adresses à migrer : " . count($adresses) . PHP_EOL;
    
    // Préparation de la requête d'insertion
    $insertQuery = "INSERT INTO sectors_adresses (
                    fk_adresse,
                    osm_id,
                    fk_sector,
                    osm_name,
                    numero,
                    rue_bis,
                    rue,
                    cp,
                    ville,
                    gps_lat,
                    gps_lng,
                    osm_date_creat,
                    created_at,
                    updated_at
                ) VALUES (
                    :fk_adresse,
                    :osm_id,
                    :fk_sector,
                    :osm_name,
                    :numero,
                    :rue_bis,
                    :rue,
                    :cp,
                    :ville,
                    :gps_lat,
                    :gps_lng,
                    :osm_date_creat,
                    :created_at,
                    :updated_at
                ) ON DUPLICATE KEY UPDATE 
                    fk_adresse = VALUES(fk_adresse),
                    numero = VALUES(numero),
                    rue_bis = VALUES(rue_bis),
                    rue = VALUES(rue),
                    cp = VALUES(cp),
                    ville = VALUES(ville),
                    gps_lat = VALUES(gps_lat),
                    gps_lng = VALUES(gps_lng),
                    updated_at = VALUES(updated_at)";
    
    $insertStmt = $targetDb->prepare($insertQuery);
    
    // Compteurs
    $inserted = 0;
    $skipped = 0;
    $errors = 0;
    
    // Traitement de chaque adresse
    foreach ($adresses as $adresse) {
        $fkOldSector = $adresse['fk_sector'];
        
        // Recherche du nouvel ID de secteur
        if (!isset($sectorMap[$fkOldSector])) {
            echo "Secteur non trouvé pour l'ID $fkOldSector. Adresse ignorée.\n";
            $skipped++;
            continue;
        }
        
        $fkNewSector = $sectorMap[$fkOldSector];
        
        // Préparation des données pour l'insertion
        $adresseData = [
            'fk_adresse' => $adresse['fk_adresse'] ?? '',
            'osm_id' => 0, // Valeur par défaut
            'fk_sector' => $fkNewSector,
            'osm_name' => '', // Valeur par défaut
            'numero' => $adresse['numero'] ?? '',
            'rue_bis' => $adresse['rue_bis'] ?? '',
            'rue' => $adresse['rue'] ?? '',
            'cp' => $adresse['cp'] ?? '',
            'ville' => $adresse['ville'] ?? '',
            'gps_lat' => $adresse['gps_lat'] ?? '',
            'gps_lng' => $adresse['gps_lng'] ?? '',
            'osm_date_creat' => '0000-00-00 00:00:00', // Valeur par défaut
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s')
        ];
        
        try {
            // Insertion dans la table cible
            $insertStmt->execute($adresseData);
            $inserted++;
            
            // Affichage du progrès
            if ($inserted % 100 === 0) {
                echo "Progression : $inserted adresses migrées...\n";
            }
        } catch (PDOException $e) {
            echo "Erreur lors de la migration de l'adresse (rowid " . $adresse['rowid'] . ", secteur $fkOldSector) : " . $e->getMessage() . "\n";
            $errors++;
        }
    }
    
    echo "Migration terminée. $inserted adresses migrées avec succès, $skipped ignorées. $errors erreurs rencontrées." . PHP_EOL;
    
    // Fermer le tunnel SSH
    closeSshTunnel();
    
} catch (Exception $e) {
    echo "Erreur critique: " . $e->getMessage() . PHP_EOL;

    // Fermer le tunnel SSH en cas d'erreur
    closeSshTunnel();
    
    exit(1);
}
