<?php
/**
 * Script de migration de la table x_devises de geosector vers geosector_app
 * 
 * Ce script transfère les données de la table x_devises de geosector vers la nouvelle
 * structure de la table x_devises dans geosector_app, en adaptant les noms de champs.
 */

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

// Création du dossier de logs si nécessaire
if (!is_dir(dirname(__DIR__) . '/logs')) {
    mkdir(dirname(__DIR__) . '/logs', 0755, true);
}

logOperation("Démarrage de la migration de la table x_devises");

try {
    // Connexion aux bases de données
    $sourceDb = getSourceConnection();
    $targetDb = getTargetConnection();
    
    // Récupération des devises de la source
    $stmt = $sourceDb->query("SELECT * FROM x_devises");
    $devises = $stmt->fetchAll();
    
    logOperation("Nombre de devises à migrer: " . count($devises));
    
    // Vérifier si la table existe dans la cible
    try {
        $targetDb->query("SELECT 1 FROM x_devises LIMIT 1");
        $tableExists = true;
    } catch (PDOException $e) {
        $tableExists = false;
    }
    
    // Créer la table si elle n'existe pas
    if (!$tableExists) {
        logOperation("La table x_devises n'existe pas dans la base cible. Création de la table...");
        
        $createTableSql = "CREATE TABLE `x_devises` (
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `code` varchar(10) NOT NULL,
            `libelle` varchar(50) NOT NULL,
            `symbole` varchar(10) DEFAULT NULL,
            `chk_active` tinyint(1) UNSIGNED NOT NULL DEFAULT '1',
            PRIMARY KEY (`id`),
            UNIQUE KEY `code` (`code`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;";
        
        $targetDb->exec($createTableSql);
        logOperation("Table x_devises créée avec succès");
    }
    
    // Préparation de la requête d'insertion
    $insertQuery = "INSERT INTO x_devises (
                        id, 
                        code, 
                        libelle, 
                        symbole, 
                        chk_active
                    ) VALUES (
                        :id, 
                        :code, 
                        :libelle, 
                        :symbole, 
                        :chk_active
                    ) ON DUPLICATE KEY UPDATE
                        code = VALUES(code),
                        libelle = VALUES(libelle),
                        symbole = VALUES(symbole),
                        chk_active = VALUES(chk_active)";
    
    $insertStmt = $targetDb->prepare($insertQuery);
    
    // Compteurs
    $successCount = 0;
    $errorCount = 0;
    
    // Traitement de chaque devise
    foreach ($devises as $devise) {
        try {
            // Mappage des champs entre les deux structures
            $id = isset($devise['rowid']) ? $devise['rowid'] : $devise['id'];
            $chkActive = isset($devise['active']) ? $devise['active'] : 
                       (isset($devise['chk_active']) ? $devise['chk_active'] : 1);
            
            // Préparation des données pour l'insertion
            $deviseData = [
                'id' => $id,
                'code' => $devise['code'],
                'libelle' => $devise['libelle'],
                'symbole' => $devise['symbole'] ?? null,
                'chk_active' => $chkActive
            ];
            
            // Insertion dans la base cible
            $insertStmt->execute($deviseData);
            $successCount++;
            
            logOperation("Devise ID {$id} ({$devise['code']}) migrée avec succès", "INFO");
        } catch (Exception $e) {
            $errorCount++;
            logOperation("Erreur lors de la migration de la devise ID {$id} ({$devise['code']}): " . $e->getMessage(), "ERROR");
        }
    }
    
    logOperation("Migration terminée. Succès: $successCount, Erreurs: $errorCount");
    
    // Fermer le tunnel SSH
    closeSshTunnel();
    
} catch (Exception $e) {
    logOperation("Erreur critique: " . $e->getMessage(), "ERROR");
    
    // Fermer le tunnel SSH en cas d'erreur
    closeSshTunnel();
    
    exit(1);
}
