// === File: sector-frontend/scripts/generate-spritesheets.js ===
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import texturePacker from 'free-tex-packer-core';

// ES-Modul Workaround für __dirname
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// ----------------------------------------------------------------------
// Pfad-Konfiguration
// ----------------------------------------------------------------------
// Der Hauptordner, in dem wir Unterordner für die verschiedenen Kategorien anlegen.
const RAW_ASSETS_DIR = path.resolve(__dirname, '../src/raw-assets');
// Zielordner für die fertigen Atlanten, die dann in der App geladen werden.
const OUTPUT_DIR = path.resolve(__dirname, '../src/assets');

/**
 * Durchsucht den RAW_ASSETS_DIR nach Unterordnern und generiert 
 * für jeden gefundenen Ordner ein separates Sprite-Sheet.
 */
async function buildAllSpriteSheets() {
    console.log(`[Packer] Prüfe Hauptverzeichnis: ${RAW_ASSETS_DIR}`);

    // Hauptordner erstellen, falls er nicht existiert
    if (!fs.existsSync(RAW_ASSETS_DIR)) {
        fs.mkdirSync(RAW_ASSETS_DIR, { recursive: true });
        console.log('[Packer] Quellordner existierte nicht und wurde erstellt. Bitte Unterordner (z.B. "icons") anlegen und Bilder einfügen.');
        return;
    }

    // Lese alle Einträge im Hauptordner aus
    const entries = fs.readdirSync(RAW_ASSETS_DIR, { withFileTypes: true });
    
    // Filtere nur die Verzeichnisse (Unterordner) heraus
    const directories = entries.filter(entry => entry.isDirectory()).map(dir => dir.name);

    if (directories.length === 0) {
        console.log('[Packer] Keine Unterordner in raw-assets gefunden. Bitte lege Ordner wie "icons" oder "frames" an.');
        return;
    }

    // Zielordner erstellen, falls nicht vorhanden
    if (!fs.existsSync(OUTPUT_DIR)) {
        fs.mkdirSync(OUTPUT_DIR, { recursive: true });
    }

    // Schleife durch alle gefundenen Unterordner
    for (const folderName of directories) {
        const currentDirPath = path.join(RAW_ASSETS_DIR, folderName);
        const files = fs.readdirSync(currentDirPath);
        
        const images = [];

        // Suche nach PNG-Dateien im aktuellen Unterordner
        for (const file of files) {
            if (file.endsWith('.png')) {
                const filePath = path.join(currentDirPath, file);
                images.push({
                    path: file,
                    contents: fs.readFileSync(filePath)
                });
            }
        }

        if (images.length === 0) {
            console.log(`[Packer] Überspringe Ordner '${folderName}' (keine PNG-Dateien gefunden).`);
            continue; // Zum nächsten Ordner springen
        }

        // Konfiguration für DIESEN spezifischen Atlas
        const options = {
            textureName: folderName, // Der Name des Ordners wird zum Namen der generierten Dateien
            width: 4096,
            height: 4096,
            padding: 2,
            allowRotation: false,
            exporter: 'Pixi',
            removeFileExtension: true
        };

        console.log(`[Packer] Verpacke ${images.length} Bilder aus dem Ordner '${folderName}'...`);

        // Packer-Aufruf in ein Promise wickeln, um asynchrones Verarbeiten sauber abzuarbeiten
        await new Promise((resolve, reject) => {
            texturePacker(images, options, (packedFiles, error) => {
                if (error) {
                    console.error(`[Packer] Fehler beim Erstellen des Atlases für '${folderName}':`, error);
                    reject(error);
                    return;
                }

                // Generierte Dateien speichern (.png und .json)
                for (const item of packedFiles) {
                    const outPath = path.join(OUTPUT_DIR, item.name);
                    fs.writeFileSync(outPath, item.buffer);
                    console.log(`[Packer] Gespeichert: ${outPath}`);
                }
                resolve();
            });
        });
    }

    console.log('[Packer] Alle Sprite-Sheets wurden erfolgreich generiert!');
}

// Skript ausführen
buildAllSpriteSheets();