
import fs from 'fs';
import path from 'path';
import sharp from 'sharp';

// Configuration
const ROOT_DIR = process.cwd();
const IMAGE_DIRS = [
    path.join(ROOT_DIR, 'client', 'public'),
    path.join(ROOT_DIR, 'uploads')
];
const SRC_DIR = path.join(ROOT_DIR, 'client', 'src');
const QUALITY = 80; // Qualité WebP (0-100)

// Extensions à traiter
const IMAGE_EXTS = ['.jpg', '.jpeg', '.png'];
// Fichiers source à mettre à jour
const SOURCE_EXTS = ['.tsx', '.ts', '.js', '.jsx', '.css', '.html'];

// Fonction pour scanner récursivement un dossier
function getFiles(dir: string, extFilter: string[] = []): string[] {
    let results: string[] = [];
    const list = fs.readdirSync(dir);

    list.forEach((file) => {
        const fullPath = path.join(dir, file);
        const stat = fs.statSync(fullPath);

        if (stat && stat.isDirectory()) {
            results = results.concat(getFiles(fullPath, extFilter));
        } else {
            const ext = path.extname(file).toLowerCase();
            if (extFilter.length === 0 || extFilter.includes(ext)) {
                results.push(fullPath);
            }
        }
    });

    return results;
}

async function convertImages() {
    console.log('🚀 Démarrage de la migration vers WebP...');

    // 1. Lister les images
    console.log('📂 Scan des dossiers :', IMAGE_DIRS.map(d => path.relative(ROOT_DIR, d)).join(', '));

    let images: string[] = [];
    for (const dir of IMAGE_DIRS) {
        if (fs.existsSync(dir)) {
            images = images.concat(getFiles(dir, IMAGE_EXTS));
        }
    }
    const replacements: Record<string, string> = {};

    if (images.length === 0) {
        console.log('Aucune image à convertir trouvée.');
        return;
    }

    console.log(`📸 ${images.length} images trouvées. Conversion en cours...`);

    // 2. Convertir les images
    for (const imgPath of images) {
        const ext = path.extname(imgPath);
        const dir = path.dirname(imgPath);
        const name = path.basename(imgPath, ext);
        const webpName = `${name}.webp`;
        const newPath = path.join(dir, webpName);

        try {
            await sharp(imgPath)
                .webp({ quality: QUALITY })
                .toFile(newPath);

            const relativeOldName = path.basename(imgPath);
            const relativeNewName = webpName;

            replacements[relativeOldName] = relativeNewName;
            console.log(`✅ Converti : ${relativeOldName} -> ${relativeNewName}`);

            // Optionnel : Supprimer l'original ? Pour la sécurité on garde les originaux pour l'instant
            // fs.unlinkSync(imgPath); 
        } catch (err) {
            console.error(`❌ Erreur sur ${imgPath}:`, err);
        }
    }

    // 3. Mettre à jour le code source
    console.log('📝 Mise à jour des références dans le code...');

    // On inclut aussi index.html à la racine du client
    const sourceFiles = [
        ...getFiles(SRC_DIR, SOURCE_EXTS),
        path.join(ROOT_DIR, 'client', 'index.html')
    ];

    let filesUpdated = 0;

    for (const srcFile of sourceFiles) {
        if (!fs.existsSync(srcFile)) continue;

        let content = fs.readFileSync(srcFile, 'utf-8');
        let hasChanges = false;

        for (const [oldName, newName] of Object.entries(replacements)) {
            // On cherche le nom de fichier exact. 
            // Attention : cela remplacera "image.jpg" mais pas "image.jpg.backup" grâce aux quotes souvent utilisées ou fin de ligne
            // On fait un replace global simple pour commencer, c'est généralement suffisant pour les assets
            if (content.includes(oldName)) {
                // Regex pour remplacer globalement
                const regex = new RegExp(oldName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g');
                content = content.replace(regex, newName);
                hasChanges = true;
            }
        }

        if (hasChanges) {
            fs.writeFileSync(srcFile, content, 'utf-8');
            filesUpdated++;
            console.log(`Updated: ${path.relative(ROOT_DIR, srcFile)}`);
        }
    }

    console.log(`\n✨ Terminé !`);
    console.log(`- Images converties : ${Object.keys(replacements).length}`);
    console.log(`- Fichiers mis à jour : ${filesUpdated}`);
    console.log(`\n👉 Vous pouvez maintenant lancer le build ou le serveur de dev.`);
}

convertImages().catch(console.error);
