<?php
/**
 * Script de migration pour la table ope_sectors
 * Transfert les données depuis les tables sectors et ope_users_sectors de la base source vers la table ope_sectors de la base cible
 * Ne migre que les secteurs liés aux opérations qui ont été migrées
 */

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 ope_sectors...\n";
    
    // Récupération des IDs des opérations qui ont été migrées
    $stmt = $targetDb->query("SELECT id FROM operations");
    $migratedOperations = $stmt->fetchAll(PDO::FETCH_COLUMN);

    if (empty($migratedOperations)) {
        echo "Aucune opération n'a été migrée. Veuillez d'abord migrer la table operations." . PHP_EOL;
        closeSshTunnel();
        exit(1);
    }

    echo "Nombre d'opérations migrées : " . count($migratedOperations) . PHP_EOL;
    
    // Création de la liste des IDs d'opérations pour la requête IN
    $operationIds = implode(',', $migratedOperations);
    
    // Récupération des secteurs distincts liés aux opérations migrées
    $query = "
        SELECT DISTINCT ous.fk_operation, ous.fk_sector, s.libelle, s.sector, s.color
        FROM ope_users_sectors ous
        JOIN sectors s ON ous.fk_sector = s.rowid
        WHERE ous.fk_operation IN ($operationIds)
        AND ous.active = 1
        AND s.active = 1
    ";
    
    $stmt = $sourceDb->query($query);
    $sectors = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    echo "Nombre de secteurs distincts à migrer : " . count($sectors) . PHP_EOL;
    
    // Préparation de la requête d'insertion
    $insertQuery = "INSERT INTO ope_sectors (
                    fk_operation, 
                    fk_old_sector,
                    libelle, 
                    sector, 
                    color, 
                    created_at, 
                    fk_user_creat, 
                    updated_at, 
                    fk_user_modif, 
                    chk_active
                ) VALUES (
                    :fk_operation, 
                    :fk_old_sector,
                    :libelle, 
                    :sector, 
                    :color, 
                    :created_at, 
                    :fk_user_creat, 
                    :updated_at, 
                    :fk_user_modif, 
                    :chk_active
                ) ON DUPLICATE KEY UPDATE 
                    libelle = VALUES(libelle),
                    sector = VALUES(sector),
                    color = VALUES(color),
                    updated_at = VALUES(updated_at),
                    fk_user_modif = VALUES(fk_user_modif)";
    
    $insertStmt = $targetDb->prepare($insertQuery);
    
    // Compteurs
    $inserted = 0;
    $errors = 0;
    
    // Traitement de chaque secteur
    foreach ($sectors as $sector) {
        // Récupération des informations du secteur source
        $fkOperation = $sector['fk_operation'];
        $fkOldSector = $sector['fk_sector'];
        $libelle = $sector['libelle'] ?? '';
        $sectorData = $sector['sector'] ?? '';
        $color = $sector['color'] ?? '#4B77BE';
        
        // Vérification si le secteur existe déjà pour cette opération
        $checkQuery = "SELECT id FROM ope_sectors WHERE fk_operation = :fk_operation AND fk_old_sector = :fk_old_sector";
        $checkStmt = $targetDb->prepare($checkQuery);
        $checkStmt->execute([
            'fk_operation' => $fkOperation,
            'fk_old_sector' => $fkOldSector
        ]);
        
        $exists = $checkStmt->fetch(PDO::FETCH_ASSOC);
        
        // Si le secteur existe déjà, passer au suivant
        if ($exists) {
            echo "Le secteur avec fk_operation=$fkOperation et fk_old_sector=$fkOldSector existe déjà. Mise à jour...\n";
        }
        
        // Préparation des données pour l'insertion
        $sectorData = [
            'fk_operation' => $fkOperation,
            'fk_old_sector' => $fkOldSector,
            'libelle' => $libelle,
            'sector' => $sectorData,
            'color' => $color,
            'created_at' => date('Y-m-d H:i:s'),
            'fk_user_creat' => 1, // Utilisateur par défaut
            'updated_at' => date('Y-m-d H:i:s'),
            'fk_user_modif' => 1, // Utilisateur par défaut
            'chk_active' => 1
        ];
        
        try {
            // Insertion dans la table cible
            $insertStmt->execute($sectorData);
            $inserted++;
            
            // Affichage du progrès
            if ($inserted % 10 === 0) {
                echo "Progression : $inserted secteurs migrés...\n";
            }
        } catch (PDOException $e) {
            echo "Erreur lors de la migration du secteur (opération $fkOperation, secteur $fkOldSector) : " . $e->getMessage() . "\n";
            $errors++;
        }
    }
    
    echo "Migration terminée. $inserted secteurs migrés avec succès. $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);
}
