<?php
/**
 * Générateur automatique de fichier .mo
 */

// Prevent direct access
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

/**
 * Génère un fichier .mo à partir d'un fichier .po
 */
function flowdino_generate_mo_file($po_file, $mo_file) {
    if (!file_exists($po_file)) {
        return false;
    }
    
    return flowdino_po_to_mo($po_file, $mo_file);
}

/**
 * Fonction de conversion PO vers MO
 */
function flowdino_po_to_mo($po_file, $mo_file) {
    try {
        $po_content = file_get_contents($po_file);
        if ($po_content === false) {
            return false;
        }
        
        // Parser le fichier PO
        $translations = array();
        $lines = explode("\n", $po_content);
        $current_msgid = '';
        $current_msgstr = '';
        $in_msgid = false;
        $in_msgstr = false;
        
        foreach ($lines as $line) {
            $line = trim($line);
            
            if (strpos($line, 'msgid ') === 0) {
                // Sauvegarder la traduction précédente
                if (!empty($current_msgid) && !empty($current_msgstr)) {
                    $translations[$current_msgid] = $current_msgstr;
                }
                
                $current_msgid = substr($line, 7, -1); // Enlever 'msgid "' et '"'
                $current_msgstr = '';
                $in_msgid = true;
                $in_msgstr = false;
            } elseif (strpos($line, 'msgstr ') === 0) {
                $current_msgstr = substr($line, 8, -1); // Enlever 'msgstr "' et '"'
                $in_msgid = false;
                $in_msgstr = true;
            } elseif ($line === '') {
                // Ligne vide - fin d'une entrée
                if (!empty($current_msgid) && !empty($current_msgstr)) {
                    $translations[$current_msgid] = $current_msgstr;
                }
                $current_msgid = '';
                $current_msgstr = '';
                $in_msgid = false;
                $in_msgstr = false;
            } elseif (strpos($line, '"') === 0 && substr($line, -1) === '"') {
                // Ligne de continuation
                $content = substr($line, 1, -1);
                if ($in_msgid) {
                    $current_msgid .= $content;
                } elseif ($in_msgstr) {
                    $current_msgstr .= $content;
                }
            }
        }
        
        // Sauvegarder la dernière traduction
        if (!empty($current_msgid) && !empty($current_msgstr)) {
            $translations[$current_msgid] = $current_msgstr;
        }
        
        if (empty($translations)) {
            return false;
        }
        
        // Génération simple du fichier MO
        $keys = array_keys($translations);
        $values = array_values($translations);
        $count = count($translations);
        
        $mo_data = pack('L', 0x950412de) . pack('L', 0) . pack('L', $count) . 
                   pack('L', 28) . pack('L', 28 + $count * 8) . pack('L', 0) . pack('L', 0);
        
        $offset = 28 + $count * 16;
        $key_offsets = array();
        foreach ($keys as $key) {
            $key_offsets[] = array($offset, strlen($key));
            $offset += strlen($key) + 1;
        }
        
        $value_offsets = array();
        foreach ($values as $value) {
            $value_offsets[] = array($offset, strlen($value));
            $offset += strlen($value) + 1;
        }
        
        foreach ($key_offsets as $ko) {
            $mo_data .= pack('L', $ko[1]) . pack('L', $ko[0]);
        }
        
        foreach ($value_offsets as $vo) {
            $mo_data .= pack('L', $vo[1]) . pack('L', $vo[0]);
        }
        
        foreach ($keys as $key) {
            $mo_data .= $key . "\0";
        }
        
        foreach ($values as $value) {
            $mo_data .= $value . "\0";
        }
        
        return file_put_contents($mo_file, $mo_data) !== false;
        
    } catch (Exception $e) {
        return false;
    }
}

// Fonction pour forcer la génération du .mo
function flowdino_force_generate_mo() {
    $po_file = dirname(__FILE__) . '/flowdino-fr_FR.po';
    $mo_file = dirname(__FILE__) . '/flowdino-fr_FR.mo';
    
    if (file_exists($po_file)) {
        return flowdino_generate_mo_file($po_file, $mo_file);
    }
    return false;
}

// Si exécuté directement, générer le .mo
$flowdino_php_self = '';
if (isset($_SERVER['PHP_SELF'])) {
    // Si WordPress est chargé, utiliser les fonctions de sécurité WordPress
    if (function_exists('sanitize_text_field') && function_exists('wp_unslash')) {
        $flowdino_php_self = sanitize_text_field(wp_unslash($_SERVER['PHP_SELF']));
    } else {
        // Sinon, utiliser une sanitisation moderne pour l'exécution CLI
        // Stocker d'abord la valeur pour éviter les accès multiples non sécurisés
        // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash -- wp_unslash() unavailable in non-WordPress CLI context; filter_var provides equivalent sanitisation
        $flowdino_raw_php_self = filter_var($_SERVER['PHP_SELF'], FILTER_SANITIZE_URL);
        // Remplacer les caractères dangereux et ne garder que le basename
        $flowdino_safe_path = preg_replace('/[^a-zA-Z0-9\/_.-]/', '', $flowdino_raw_php_self);
        $flowdino_php_self = basename($flowdino_safe_path);
    }
}

if (basename($flowdino_php_self) === 'generate-mo.php') {
    echo "🔄 Génération du fichier .mo...\n";
    
    if (flowdino_force_generate_mo()) {
        echo "✅ Fichier .mo généré avec succès !\n";
    } else {
        echo "❌ Erreur lors de la génération du fichier .mo\n";
    }
}
?>
