#!/usr/bin/env node

/**
 * Script zur automatischen Korrektur aller Index-Felder - Version 2
 * Konvertiert camelCase zu snake_case für underscored: true Models
 */

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

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// Funktion zur Konvertierung von camelCase zu snake_case
function camelToSnakeCase(str) {
    return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
}

// Funktion zur Korrektur einer Model-Datei
function fixModelFile(filePath) {
    try {
        let content = fs.readFileSync(filePath, 'utf8');
        let modified = false;
        
        // Prüfe ob die Datei Indexe enthält
        const hasIndexes = content.includes('indexes:') || content.includes('fields:');
        
        if (hasIndexes) {
            console.log(`\n🔍 Prüfe: ${path.basename(filePath)} (enthält Indexe)`);
            
            // Suche nach verschiedenen Index-Formaten
            const patterns = [
                // Standard-Format: fields: ['field1', 'field2']
                {
                    regex: /fields:\s*\[([^\]]+)\]/g,
                    name: 'Standard fields'
                },
                // Mit Leerzeichen: fields: [ 'field1', 'field2' ]
                {
                    regex: /fields:\s*\[\s*([^\]]+)\s*\]/g,
                    name: 'Fields mit Leerzeichen'
                }
            ];
            
            let foundIndexes = false;
            
            for (const pattern of patterns) {
                let match;
                while ((match = pattern.regex.exec(content)) !== null) {
                    foundIndexes = true;
                    const fieldsString = match[1];
                    console.log(`  📍 ${pattern.name}: ${fieldsString}`);
                    
                    // Extrahiere Felder
                    const fields = fieldsString.split(',').map(f => {
                        const cleaned = f.trim().replace(/['"]/g, '');
                        return cleaned;
                    }).filter(f => f.length > 0);
                    
                    console.log(`  📋 Gefundene Felder: [${fields.join(', ')}]`);
                    
                    // Konvertiere Felder
                    const correctedFields = fields.map(field => {
                        if (field.includes('_')) {
                            console.log(`    ✅ ${field} (bereits snake_case)`);
                            return field;
                        }
                        const corrected = camelToSnakeCase(field);
                        if (corrected !== field) {
                            console.log(`    🔄 ${field} → ${corrected}`);
                            modified = true;
                        }
                        return corrected;
                    });
                    
                    // Ersetze in der Datei
                    const oldFieldsString = `fields: [${fields.map(f => `'${f}'`).join(', ')}]`;
                    const newFieldsString = `fields: [${correctedFields.map(f => `'${f}'`).join(', ')}]`;
                    
                    if (oldFieldsString !== newFieldsString) {
                        console.log(`    📝 Ersetze: ${oldFieldsString}`);
                        console.log(`    📝 Durch:   ${newFieldsString}`);
                        content = content.replace(oldFieldsString, newFieldsString);
                    }
                }
            }
            
            if (!foundIndexes) {
                console.log(`  ⚠️  Datei enthält 'indexes:' aber keine 'fields:' Definitionen`);
            }
            
            if (modified) {
                fs.writeFileSync(filePath, content, 'utf8');
                console.log(`  ✅ Datei korrigiert und gespeichert`);
            } else {
                console.log(`  ℹ️  Keine Änderungen nötig`);
            }
        } else {
            console.log(`\n🔍 Prüfe: ${path.basename(filePath)} (keine Indexe)`);
        }
        
        return modified;
    } catch (error) {
        console.error(`❌ Fehler bei ${filePath}:`, error.message);
        return false;
    }
}

// Hauptfunktion
async function main() {
    console.log('🔧 Starte automatische Korrektur aller Index-Felder (Version 2)...');
    
    const modelsDir = path.join(__dirname, 'models');
    let totalFiles = 0;
    let modifiedFiles = 0;
    
    // Rekursiv alle .js-Dateien im models-Verzeichnis durchsuchen
    function processDirectory(dir) {
        const items = fs.readdirSync(dir);
        
        for (const item of items) {
            const fullPath = path.join(dir, item);
            const stat = fs.statSync(fullPath);
            
            if (stat.isDirectory()) {
                processDirectory(fullPath);
            } else if (item.endsWith('.js')) {
                totalFiles++;
                if (fixModelFile(fullPath)) {
                    modifiedFiles++;
                }
            }
        }
    }
    
    processDirectory(modelsDir);
    
    console.log('\n🎉 Korrektur abgeschlossen!');
    console.log(`📊 Gesamt: ${totalFiles} Dateien geprüft`);
    console.log(`✅ Geändert: ${modifiedFiles} Dateien`);
    
    if (modifiedFiles > 0) {
        console.log('\n💡 Führen Sie jetzt das Deployment erneut aus:');
        console.log('   sudo ./deploy-backend.sh');
    }
}

main().catch(console.error);
