<?php
/**
 * Script de migration de la table operations
 * 
 * Ce script migre les données de la table operations de la base source vers la base cible
 */

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

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

    echo "Nombre d'entités migrées : " . count($migratedEntities) . PHP_EOL;
    
    // Création de la liste des IDs d'entités pour la requête IN
    $entityIds = implode(',', $migratedEntities);
    
    // Vérification si la table doit être tronquée avant migration
    $truncate = false; // Par défaut, ne pas tronquer
    
    // Vérifier les arguments de ligne de commande
    if (isset($argv) && in_array('--truncate', $argv)) {
        $truncate = true;
    }
    
    if ($truncate) {
        $targetDb->exec("TRUNCATE TABLE operations");
        echo "Table operations tronquée.\n";
    }
        
        // Récupération des données de la table source
        // Ne récupérer que les opérations liées aux entités qui ont été migrées
        $query = "SELECT * FROM operations WHERE fk_entite IN ($entityIds) ORDER BY rowid DESC";
        $stmt = $sourceDb->query($query);
        $allOperations = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        // Filtrer pour ne garder que les 3 dernières opérations par entité
        $operationsByEntity = [];
        $operations = [];
        
        foreach ($allOperations as $operation) {
            $entityId = $operation['fk_entite'] ?? 1;
            
            if (!isset($operationsByEntity[$entityId])) {
                $operationsByEntity[$entityId] = [];
            }
            
            // Ne garder que les 3 premières opérations par entité (déjà triées par rowid DESC)
            if (count($operationsByEntity[$entityId]) < 3) {
                $operationsByEntity[$entityId][] = $operation;
                $operations[] = $operation;
            }
        }
        
        echo "Nombre d'opérations à migrer : " . count($operations) . "\n";
        
        // Préparation de la requête d'insertion
        $insertQuery = "INSERT INTO operations (
                        id, 
                        fk_entite, 
                        libelle, 
                        date_deb, 
                        date_fin, 
                        chk_distinct_sectors, 
                        created_at, 
                        fk_user_creat, 
                        updated_at, 
                        fk_user_modif, 
                        chk_active
                    ) VALUES (
                        :id, 
                        :fk_entite, 
                        :libelle, 
                        :date_deb, 
                        :date_fin, 
                        :chk_distinct_sectors, 
                        :created_at, 
                        :fk_user_creat, 
                        :updated_at, 
                        :fk_user_modif, 
                        :chk_active
                    ) ON DUPLICATE KEY UPDATE 
                        fk_entite = VALUES(fk_entite),
                        libelle = VALUES(libelle),
                        date_deb = VALUES(date_deb),
                        date_fin = VALUES(date_fin),
                        chk_distinct_sectors = VALUES(chk_distinct_sectors),
                        updated_at = VALUES(updated_at),
                        fk_user_modif = VALUES(fk_user_modif),
                        chk_active = VALUES(chk_active)";
        
        $insertStmt = $targetDb->prepare($insertQuery);
        
        // Compteurs
        $inserted = 0;
        $errors = 0;
        
        // Traitement de chaque opération
        foreach ($operations as $operation) {
            // Mappage des champs
            $id = isset($operation['rowid']) ? $operation['rowid'] : $operation['id'];
            $chkActive = isset($operation['active']) ? $operation['active'] : (isset($operation['chk_active']) ? $operation['chk_active'] : 1);
            
            // Gestion des dates
            $createdAt = isset($operation['date_creat']) && !empty($operation['date_creat']) ? 
                         date('Y-m-d H:i:s', strtotime($operation['date_creat'])) : 
                         date('Y-m-d H:i:s');
                         
            $updatedAt = isset($operation['date_modif']) && !empty($operation['date_modif']) ? 
                         date('Y-m-d H:i:s', strtotime($operation['date_modif'])) : 
                         null;
            
            // Formatage des dates début et fin
            $dateDeb = isset($operation['date_deb']) && !empty($operation['date_deb']) ? 
                       date('Y-m-d', strtotime($operation['date_deb'])) : 
                       '0000-00-00';
                       
            $dateFin = isset($operation['date_fin']) && !empty($operation['date_fin']) ? 
                       date('Y-m-d', strtotime($operation['date_fin'])) : 
                       '0000-00-00';
            
            // Préparation des données pour l'insertion
            $operationData = [
                'id' => $id,
                'fk_entite' => $operation['fk_entite'] ?? 1,
                'libelle' => $operation['libelle'] ?? '',
                'date_deb' => $dateDeb,
                'date_fin' => $dateFin,
                'chk_distinct_sectors' => $operation['chk_distinct_sectors'] ?? 0,
                'created_at' => $createdAt,
                'fk_user_creat' => $operation['fk_user_creat'] ?? 0,
                'updated_at' => $updatedAt,
                'fk_user_modif' => $operation['fk_user_modif'] ?? 0,
                'chk_active' => $chkActive
            ];
            
            try {
                // Insertion dans la table cible
                $insertStmt->execute($operationData);
                $inserted++;
                
                // Affichage du progrès
                if ($inserted % 100 === 0) {
                    echo "Progression : $inserted opérations migrées...\n";
                }
            } catch (PDOException $e) {
                echo "Erreur lors de la migration de l'opération ID $id : " . $e->getMessage() . "\n";
                $errors++;
            }
        }
        
        echo "Migration terminée. $inserted opérations migrées avec succès. $errors erreurs rencontrées." . PHP_EOL;
    
    echo "Migration de la table operations terminée avec succès." . 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);
}
