import fs from 'fs';
import path from 'path';
import { fileURLToPath } from '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 COPY_LOG = path.join(__dirname, 'copy-new-scripts.log');

/**
 * Récupère la liste des fichiers .js dans un dossier
 * @param {string} dir - Le chemin du dossier
 * @returns {string[]} - Liste des noms de fichiers
 */
function getScriptFiles(dir) {
  try {
    return fs.readdirSync(dir).filter(f => f.endsWith('.js'));
  } catch (error) {
    console.error(`Erreur lors de la lecture du dossier ${dir}:`, error.message);
    return [];
  }
}

/**
 * Copie les nouveaux scripts du système WFRP4E vers le module FR
 * @param {boolean} dryRun - Si true, affiche ce qui serait fait sans copier
 * @returns {object} - Résultats de l'opération
 */
function copyNewScripts(dryRun = false) {
  console.log('Analyse des scripts...\n');

  const wfrp4eFiles = getScriptFiles(WFRP4E_SCRIPTS);
  const frFiles = getScriptFiles(FR_SCRIPTS);

  // Fichiers présents dans WFRP4E mais pas dans le module FR
  const newFiles = wfrp4eFiles.filter(file => !frFiles.includes(file));

  const results = {
    total: wfrp4eFiles.length,
    existingInFR: frFiles.length,
    newFiles: newFiles.length,
    copied: [],
    errors: []
  };

  console.log(`📊 Statistiques:`);
  console.log(`  - Scripts dans WFRP4E: ${results.total}`);
  console.log(`  - Scripts dans FR: ${results.existingInFR}`);
  console.log(`  - Nouveaux scripts à copier: ${results.newFiles}\n`);

  if (newFiles.length === 0) {
    console.log('✅ Aucun nouveau script à copier.');
    return results;
  }

  if (dryRun) {
    console.log('🔍 Mode simulation (dry-run) - Aucun fichier ne sera copié\n');
    console.log('Nouveaux scripts qui seraient copiés:');
    newFiles.forEach((file, index) => {
      console.log(`  ${index + 1}. ${file}`);
    });
    return results;
  }

  // Copie des nouveaux fichiers
  console.log('📋 Copie des nouveaux scripts...\n');

  newFiles.forEach((file, index) => {
    const sourcePath = path.join(WFRP4E_SCRIPTS, file);
    const destPath = path.join(FR_SCRIPTS, file);

    try {
      fs.copyFileSync(sourcePath, destPath);
      results.copied.push(file);
      console.log(`  ✓ [${index + 1}/${newFiles.length}] ${file}`);
    } catch (error) {
      results.errors.push({ file, error: error.message });
      console.error(`  ✗ [${index + 1}/${newFiles.length}] ${file} - Erreur: ${error.message}`);
    }
  });

  // Sauvegarde du log
  const logContent = {
    date: new Date().toISOString(),
    results,
    files: results.copied
  };

  fs.writeFileSync(COPY_LOG, JSON.stringify(logContent, null, 2), 'utf-8');

  // Résumé
  console.log('\n' + '='.repeat(60));
  console.log('📝 Résumé de l\'opération:');
  console.log('='.repeat(60));
  console.log(`  ✅ Fichiers copiés avec succès: ${results.copied.length}`);
  if (results.errors.length > 0) {
    console.log(`  ❌ Erreurs: ${results.errors.length}`);
    results.errors.forEach(err => {
      console.log(`     - ${err.file}: ${err.error}`);
    });
  }
  console.log(`  📄 Log sauvegardé dans: ${COPY_LOG}`);
  console.log('='.repeat(60) + '\n');

  return results;
}

/**
 * Affiche la liste des nouveaux scripts sans les copier
 * @returns {object} - Résultats de l'analyse
 */
function listNewScripts() {
  const wfrp4eFiles = getScriptFiles(WFRP4E_SCRIPTS);
  const frFiles = getScriptFiles(FR_SCRIPTS);
  const newFiles = wfrp4eFiles.filter(file => !frFiles.includes(file));

  console.log(`📊 Total scripts WFRP4E: ${wfrp4eFiles.length}`);
  console.log(`📊 Total scripts FR: ${frFiles.length}`);
  console.log(`📊 Nouveaux scripts: ${newFiles.length}\n`);

  if (newFiles.length > 0) {
    console.log('Nouveaux scripts:');
    newFiles.forEach((file, index) => {
      console.log(`  ${index + 1}. ${file}`);
    });
  } else {
    console.log('✅ Aucun nouveau script trouvé.');
  }

  return {
    total: wfrp4eFiles.length,
    existingInFR: frFiles.length,
    newFiles: newFiles.length,
    files: newFiles
  };
}

// --- Exécution du script ---

const args = process.argv.slice(2);
const command = args[0];

switch (command) {
  case '--list':
  case '-l':
    listNewScripts();
    break;

  case '--dry-run':
  case '-d':
    copyNewScripts(true);
    break;

  case '--copy':
  case '-c':
    copyNewScripts(false);
    break;

  case '--help':
  case '-h':
  default:
    console.log(`
📚 Script de copie des nouveaux scripts WFRP4E vers le module FR

Usage:
  node copy-new-scripts.js [commande]

Commandes:
  --list, -l        Liste les nouveaux scripts sans les copier
  --dry-run, -d     Simule la copie (affiche ce qui serait fait)
  --copy, -c        Copie les nouveaux scripts dans le module FR
  --help, -h        Affiche cette aide

Exemples:
  node copy-new-scripts.js --list          # Liste les nouveaux fichiers
  node copy-new-scripts.js --dry-run       # Simulation
  node copy-new-scripts.js --copy          # Copie les fichiers
        `);
    break;
}
