#!/usr/bin/env node

const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');

// Configuración
const CONFIG = {
    WEBFONTS_DIR: path.join(__dirname, '..', 'assets', 'fontawesome', 'webfonts'),
    PROCESSED_DIR: path.join(__dirname, '..', 'assets', 'processed'),
    OUTPUT_REPORT: path.join(__dirname, '..', 'assets', 'processed', 'validation-report.json'),
    VERSION: '2.0.0'
};

console.log('🔍 Validando estilos FontAwesome Pro...\n');

/**
 * Validar archivos de fuentes
 */
function validateFontFiles() {
    console.log('🎨 Validando archivos de fuentes...');

    const expectedFiles = [
        'fa-solid-900.woff2',
        'fa-regular-400.woff2',
        'fa-light-300.woff2',
        'fa-thin-100.woff2',
        'fa-duotone-900.woff2',
        'fa-sharp-solid-900.woff2',
        'fa-sharp-regular-400.woff2',
        'fa-sharp-light-300.woff2',
        'fa-sharp-thin-100.woff2',
        'fa-sharp-duotone-900.woff2',
        'fa-brands-400.woff2'
    ];

    const results = {
        total: expectedFiles.length,
        found: 0,
        missing: [],
        details: {}
    };

    expectedFiles.forEach(file => {
        const filePath = path.join(CONFIG.WEBFONTS_DIR, file);
        const exists = fs.existsSync(filePath);

        results.details[file] = {
            exists: exists,
            path: filePath,
            size: exists ? fs.statSync(filePath).size : 0
        };

        if (exists) {
            results.found++;
            console.log(`  ✅ ${file}`);
        } else {
            results.missing.push(file);
            console.log(`  ❌ ${file} (FALTANTE)`);
        }
    });

    console.log(`\n📊 Resumen: ${results.found}/${results.total} archivos encontrados`);

    if (results.missing.length > 0) {
        console.log('\n⚠️  Archivos faltantes:');
        results.missing.forEach(file => {
            console.log(`   • ${file}`);
        });
    }

    return results;
}

/**
 * Validar metadata procesado
 */
function validateProcessedMetadata() {
    console.log('\n📊 Validando metadata procesado...');

    const metadataPath = path.join(CONFIG.PROCESSED_DIR, 'metadata.json');
    const stylesPath = path.join(CONFIG.PROCESSED_DIR, 'styles.json');
    const categoriesPath = path.join(CONFIG.PROCESSED_DIR, 'categories.json');

    const results = {
        metadata: { valid: false, error: null, data: null },
        styles: { valid: false, error: null, data: null },
        categories: { valid: false, error: null, data: null }
    };

    // Validar metadata.json
    try {
        if (fs.existsSync(metadataPath)) {
            const content = fs.readFileSync(metadataPath, 'utf8');
            const data = JSON.parse(content);

            if (data.meta && data.icons && data.statistics) {
                results.metadata = {
                    valid: true,
                    data: {
                        totalIcons: data.meta.totalIcons || 0,
                        totalStyles: data.statistics.styles?.length || 0,
                        totalCategories: data.statistics.categories?.length || 0
                    }
                };
                console.log(`  ✅ metadata.json: ${results.metadata.data.totalIcons} íconos`);
            } else {
                results.metadata.error = 'Estructura inválida';
                console.log(`  ❌ metadata.json: Estructura inválida`);
            }
        } else {
            results.metadata.error = 'Archivo no encontrado';
            console.log(`  ❌ metadata.json: No encontrado`);
        }
    } catch (error) {
        results.metadata.error = error.message;
        console.log(`  ❌ metadata.json: Error - ${error.message}`);
    }

    // Validar styles.json
    try {
        if (fs.existsSync(stylesPath)) {
            const content = fs.readFileSync(stylesPath, 'utf8');
            const data = JSON.parse(content);

            if (data.meta && data.styles) {
                const stylesWithIcons = Object.values(data.styles).filter(s => s.count > 0).length;
                results.styles = {
                    valid: true,
                    data: {
                        totalStyles: data.meta.totalStyles || 0,
                        stylesWithIcons: stylesWithIcons
                    }
                };
                console.log(`  ✅ styles.json: ${stylesWithIcons}/${data.meta.totalStyles} estilos con íconos`);
            } else {
                results.styles.error = 'Estructura inválida';
                console.log(`  ❌ styles.json: Estructura inválida`);
            }
        } else {
            results.styles.error = 'Archivo no encontrado';
            console.log(`  ❌ styles.json: No encontrado`);
        }
    } catch (error) {
        results.styles.error = error.message;
        console.log(`  ❌ styles.json: Error - ${error.message}`);
    }

    // Validar categories.json
    try {
        if (fs.existsSync(categoriesPath)) {
            const content = fs.readFileSync(categoriesPath, 'utf8');
            const data = JSON.parse(content);

            if (data.meta && data.categories) {
                const fontawesomeCategories = data.categories.filter(c => c.type === 'fontawesome').length;
                results.categories = {
                    valid: true,
                    data: {
                        totalCategories: data.meta.totalCategories || 0,
                        fontawesomeCategories: fontawesomeCategories
                    }
                };
                console.log(`  ✅ categories.json: ${data.meta.totalCategories} categorías totales`);
            } else {
                results.categories.error = 'Estructura inválida';
                console.log(`  ❌ categories.json: Estructura inválida`);
            }
        } else {
            results.categories.error = 'Archivo no encontrado';
            console.log(`  ❌ categories.json: No encontrado`);
        }
    } catch (error) {
        results.categories.error = error.message;
        console.log(`  ❌ categories.json: Error - ${error.message}`);
    }

    return results;
}

/**
 * Validar compatibilidad
 */
function validateCompatibility(fontResults, metadataResults) {
    console.log('\n🔗 Validando compatibilidad...');

    const issues = [];

    // Verificar si hay estilos en metadata pero no en archivos
    if (metadataResults.styles.valid && metadataResults.styles.data) {
        const stylesWithIcons = metadataResults.styles.data.stylesWithIcons;

        if (stylesWithIcons > fontResults.found) {
            issues.push({
                type: 'warning',
                message: `Hay ${stylesWithIcons} estilos en metadata pero solo ${fontResults.found} archivos de fuentes`
            });
            console.log(`  ⚠️  Posible falta de archivos de fuentes`);
        }
    }

    // Verificar si hay muchos archivos faltantes
    if (fontResults.missing.length > 5) {
        issues.push({
            type: 'error',
            message: `Faltan ${fontResults.missing.length} archivos de fuentes esenciales`
        });
        console.log(`  ❌ Faltan muchos archivos de fuentes`);
    }

    return issues;
}

/**
 * Generar reporte de validación
 */
function generateValidationReport(fontResults, metadataResults, compatibilityIssues) {
    const report = {
        meta: {
            generated: new Date().toISOString(),
            version: CONFIG.VERSION
        },
        fontFiles: fontResults,
        metadata: metadataResults,
        compatibility: {
            issues: compatibilityIssues,
            status: compatibilityIssues.length === 0 ? 'OK' : 'ISSUES'
        },
        recommendations: []
    };

    // Generar recomendaciones
    if (fontResults.missing.length > 0) {
        report.recommendations.push({
            priority: 'high',
            action: 'download_missing_fonts',
            message: 'Descarga los archivos de fuentes faltantes de FontAwesome Pro'
        });
    }

    if (!metadataResults.metadata.valid) {
        report.recommendations.push({
            priority: 'high',
            action: 'run_extract_metadata',
            message: 'Ejecuta scripts/extract-metadata.js primero'
        });
    }

    if (compatibilityIssues.length > 0) {
        report.recommendations.push({
            priority: 'medium',
            action: 'verify_fontawesome_version',
            message: 'Verifica que tengas la versión correcta de FontAwesome Pro'
        });
    }

    // Guardar reporte
    fs.writeFileSync(CONFIG.OUTPUT_REPORT, JSON.stringify(report, null, 2), 'utf8');
    console.log(`\n📋 Reporte de validación guardado: ${CONFIG.OUTPUT_REPORT}`);

    return report;
}

/**
 * Función principal
 */
function main() {
    try {
        console.log('='.repeat(60));
        console.log('   VALIDACIÓN DE ESTILOS FONTAWESOME PRO');
        console.log('='.repeat(60));

        // 1. Validar archivos de fuentes
        const fontResults = validateFontFiles();

        // 2. Validar metadata procesado
        const metadataResults = validateProcessedMetadata();

        // 3. Validar compatibilidad
        const compatibilityIssues = validateCompatibility(fontResults, metadataResults);

        // 4. Generar reporte
        const report = generateValidationReport(fontResults, metadataResults, compatibilityIssues);

        // 5. Mostrar resumen
        console.log('\n' + '='.repeat(60));
        console.log('   RESUMEN DE VALIDACIÓN');
        console.log('='.repeat(60));

        console.log(`\n🎨 Archivos de fuentes: ${fontResults.found}/${fontResults.total}`);
        console.log(`📊 Metadata procesado: ${metadataResults.metadata.valid ? '✅ Válido' : '❌ Inválido'}`);
        console.log(`🔗 Compatibilidad: ${compatibilityIssues.length === 0 ? '✅ OK' : '⚠️  Issues'}`);

        if (report.recommendations.length > 0) {
            console.log('\n🚀 RECOMENDACIONES:');
            report.recommendations.forEach((rec, index) => {
                console.log(`   ${index + 1}. [${rec.priority.toUpperCase()}] ${rec.message}`);
            });
        }

        console.log('\n' + '='.repeat(60));

        // Retornar código de salida apropiado
        if (fontResults.found === 0 || !metadataResults.metadata.valid) {
            console.log('\n❌ Validación fallida. Revisa las recomendaciones.');
            process.exit(1);
        } else if (compatibilityIssues.length > 0) {
            console.log('\n⚠️  Validación con advertencias. El plugin puede funcionar con limitaciones.');
            process.exit(0);
        } else {
            console.log('\n✅ Validación exitosa. Listo para construir la base de datos.');
            process.exit(0);
        }

    } catch (error) {
        console.error(`\n❌ Error durante la validación: ${error.message}`);
        process.exit(1);
    }
}

// Ejecutar
if (require.main === module) {
    main();
}

module.exports = {
    validateFontFiles,
    validateProcessedMetadata,
    validateCompatibility,
    generateValidationReport
};
