// scripts/remove-inline-scripts.js
const {resolve} = require('path');
const {createHash} = require('crypto');
const {readFileSync, writeFileSync} = require('fs');
const glob = require('glob');

// Configuration - ajuste selon ton setup
const OUTPUT_DIR = 'out'; // Pour Next.js static export
const BASE_PATH = ''; // Ton basePath si tu en as un

const MAGIC_STRING = '__this_is_a_placeholder_for_the_inline_scripts__';

console.log('🔍 Recherche des fichiers HTML...');
const baseDir = resolve(OUTPUT_DIR);
const htmlFiles = glob.sync(`${baseDir}/**/*.html`);

console.log(`📄 Traitement de ${htmlFiles.length} fichiers HTML`);

htmlFiles.forEach((file) => {
    console.log(`\n🔧 Traitement de ${file}`);

    // Lire le fichier HTML
    const contents = readFileSync(file).toString();
    const scripts = [];

    // Extraire tous les scripts inline (spécialement ceux avec self.__next_f)
    const newFile = contents.replace(/<script>(.+?)<\/script>/gs, (match, scriptContent) => {
        // Ne traiter que les scripts Next.js (self.__next_f)
        if (scriptContent.includes('self.__next_f')) {
            const addMagicString = scripts.length === 0;
            scripts.push(`${scriptContent}${scriptContent.endsWith(';') ? '' : ';'}`);
            return addMagicString ? MAGIC_STRING : '';
        }
        // Garder les autres scripts tels quels
        return match;
    });

    // Si aucun script inline Next.js trouvé, passer au suivant
    if (!scripts.length) {
        console.log('  ✅ Aucun script inline Next.js trouvé');
        return;
    }

    console.log(`  📦 ${scripts.length} scripts inline extraits`);

    // Combiner tous les scripts et créer un hash
    const combinedScript = scripts.join('\n');
    const hash = createHash('md5').update(combinedScript).digest('hex').substring(0, 8);

    // Créer le fichier JS externe
    const jsFileName = `_next/static/chunks/inline-scripts.${hash}.js`;
    const jsFilePath = resolve(baseDir, jsFileName);

    // Créer le dossier si nécessaire
    const {dirname} = require('path');
    const {mkdirSync} = require('fs');
    mkdirSync(dirname(jsFilePath), {recursive: true});

    writeFileSync(jsFilePath, combinedScript);
    console.log(`  💾 Script externe créé: ${jsFileName}`);

    // Réécrire le fichier HTML avec la référence au script externe
    const finalHtml = newFile.replace(
        MAGIC_STRING,
        `<script src="${BASE_PATH}${BASE_PATH.endsWith('/') ? '' : '/'}${jsFileName}" crossorigin=""></script>`
    );

    writeFileSync(file, finalHtml);
    console.log('  ✅ HTML réécrit avec succès');
});

console.log('\n🎉 Traitement terminé ! Tous les scripts inline ont été externalisés.');
console.log('💡 Tu peux maintenant utiliser une CSP stricte sans \'unsafe-inline\'');