import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';

const __dirname = path.dirname(fileURLToPath(import.meta.url));
const WFRP4E_SCRIPTS = '/home/morr/work/foundryvtt/WFRP4e-FoundryVTT/scripts';
const FR_SCRIPTS = '/home/morr/work/foundryvtt/foundryvtt-wh4-lang-fr-fr/scripts';
const REVIEW_FILE = path.join(__dirname, 'scripts-to-review.json');

const scriptsToReview = JSON.parse(fs.readFileSync(REVIEW_FILE, 'utf-8'));

// Dictionnaire de traductions courantes
const translations = {
    'Loading Spells': 'Chargement des sorts',
    'Loading': 'Chargement',
    'Could not find': 'Impossible de trouver',
    'Try Again': 'Essayez à nouveau',
    'Error': 'Erreur',
    'Success': 'Succès',
    'Warning': 'Avertissement',
    'Created': 'Créé',
    'Modified': 'Modifié',
    'Deleted': 'Supprimé',
    'Are you sure': 'Êtes-vous sûr',
    'Do you want': 'Voulez-vous',
    'Cancel': 'Annuler',
    'Confirm': 'Confirmer',
    'Yes': 'Oui',
    'No': 'Non'
};

function translateText(text) {
    // Remplacer les traductions connues
    let translated = text;
    for (const [en, fr] of Object.entries(translations)) {
        translated = translated.replace(new RegExp(en, 'g'), fr);
    }
    return translated;
}

function mergeScript(wfrp4eContent, frContent) {
    // Commence avec la version WFRP4E (à jour)
    let merged = wfrp4eContent;

    // Extraire les textes traduits du script FR
    const frTexts = new Map();
    const textPattern = /["'`]([^"'`]+)["'`]/g;

    let match;
    while ((match = textPattern.exec(frContent)) !== null) {
        const text = match[1];
        // Si le texte contient des mots français caractéristiques
        if (/Chargement|Impossible|Êtes-vous|Voulez-vous|créé|modifié|supprimé|Erreur/i.test(text)) {
            // Chercher le texte anglais correspondant dans WFRP4E
            const enMatch = wfrp4eContent.match(new RegExp(`["'\`]([^"'\`]*${text.split(' ')[0]}[^"'\`]*)["'\`]`));
            if (enMatch) {
                frTexts.set(enMatch[1], text);
            }
        }
    }

    // Appliquer les traductions connues
    for (const [en, fr] of frTexts.entries()) {
        merged = merged.replace(new RegExp(`["'\`]${en.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}["'\`]`, 'g'), `"${fr}"`);
    }

    // Appliquer le dictionnaire de traductions
    for (const [en, fr] of Object.entries(translations)) {
        merged = merged.replace(new RegExp(`["'\`]${en}["'\`]`, 'g'), `"${fr}"`);
    }

    // Cas spéciaux pour les template literals
    merged = merged.replace(/`Could not find \$\{([^}]+)\} spell\. Try Again`/g, '`Impossible de trouver le sort ${$1}. Essayez à nouveau`');

    return merged;
}

console.log('Révision semi-automatique des scripts...\n');

let updated = 0;
let skipped = 0;

scriptsToReview.forEach(({file}) => {
    const wfrp4ePath = path.join(WFRP4E_SCRIPTS, file);
    const frPath = path.join(FR_SCRIPTS, file);
    const backupPath = frPath + '.backup';

    const wfrp4eContent = fs.readFileSync(wfrp4ePath, 'utf-8');
    const frContent = fs.readFileSync(frPath, 'utf-8');

    // Sauvegarder l'original
    fs.copyFileSync(frPath, backupPath);

    // Tenter la fusion
    const merged = mergeScript(wfrp4eContent, frContent);

    // Vérifier si des traductions ont été préservées
    const hasTranslations = /Chargement|Impossible|Êtes-vous|Voulez-vous|créé|modifié|supprimé|Erreur/i.test(merged);

    if (hasTranslations) {
        fs.writeFileSync(frPath, merged, 'utf-8');
        updated++;
        console.log(`✓ Mis à jour avec traductions: ${file}`);
    } else {
        // Restaurer l'original si aucune traduction n'a été préservée
        fs.copyFileSync(backupPath, frPath);
        skipped++;
        console.log(`⚠ Révision manuelle requise: ${file}`);
    }
});

console.log(`\n=== Résumé ===`);
console.log(`Scripts mis à jour automatiquement: ${updated}`);
console.log(`Scripts nécessitant révision manuelle: ${skipped}`);
console.log(`\nNOTE: Les fichiers .backup contiennent les versions originales.`);
console.log(`Vérifiez les fichiers mis à jour avant de supprimer les backups.`);
