// Boomermania - Sistema de Logros

// Verificar y desbloquear logros basados en el estado actual
function verificarLogros() {
    if (!gameState) return [];

    const logrosNuevos = [];
    const logrosObtenidos = getLogrosObtenidos();

    for (const [id, logro] of Object.entries(logrosData)) {
        // Saltar si ya se tiene
        if (logrosObtenidos.includes(id)) continue;

        // Verificar condición
        try {
            if (logro.condicion(gameState)) {
                desbloquearLogro(id);
                logrosNuevos.push(logro);
            }
        } catch (e) {
            console.warn(`Error verificando logro ${id}:`, e);
        }
    }

    return logrosNuevos;
}

// Verificar logros al final de la partida
function verificarLogrosFinales() {
    const nuevos = verificarLogros();

    if (nuevos.length > 0) {
        // Mostrar notificación de logros desbloqueados
        mostrarLogrosDesbloqueados(nuevos);
    }

    // Guardar metaprogresión
    guardarMetaprogresion();
}

// Desbloquear un logro específico
function desbloquearLogro(logroId) {
    const metaprogresion = cargarMetaprogresion();

    if (!metaprogresion.logros.includes(logroId)) {
        metaprogresion.logros.push(logroId);

        // Si el logro desbloquea algo, registrarlo
        const logro = logrosData[logroId];
        if (logro && logro.desbloquea) {
            if (!metaprogresion.desbloqueos.includes(logro.desbloquea)) {
                metaprogresion.desbloqueos.push(logro.desbloquea);
            }
        }

        guardarMetaprogresionData(metaprogresion);
    }
}

// Obtener logros obtenidos (desde metaprogresión)
function getLogrosObtenidos() {
    const metaprogresion = cargarMetaprogresion();
    return metaprogresion.logros || [];
}

// Verificar si se tiene un logro
function tieneLogro(logroId) {
    return getLogrosObtenidos().includes(logroId);
}

// Calcular bonus activos por logros
function calcularBonusLogros() {
    const bonus = {
        descuentos: {},    // categoria -> porcentaje
        sueldoExtra: 0,    // porcentaje extra de sueldo
        pensionExtra: 0,   // porcentaje extra de pensión
        dineroInicial: 0,  // dinero extra inicial
        puntosExtra: 0     // puntos extra
    };

    const logrosObtenidos = getLogrosObtenidos();

    for (const logroId of logrosObtenidos) {
        const logro = logrosData[logroId];
        if (!logro || !logro.bonus) continue;

        switch (logro.bonus.tipo) {
            case 'descuento':
                if (logro.bonus.categoria) {
                    bonus.descuentos[logro.bonus.categoria] =
                        (bonus.descuentos[logro.bonus.categoria] || 0) + logro.bonus.valor;
                }
                break;
            case 'sueldo':
                bonus.sueldoExtra += logro.bonus.valor;
                break;
            case 'pension':
                bonus.pensionExtra += logro.bonus.valor;
                break;
            case 'dineroInicial':
                bonus.dineroInicial += logro.bonus.valor;
                break;
            case 'puntos':
                bonus.puntosExtra += logro.bonus.valor;
                break;
            case 'ingresos':
                // Bonus de ingresos por categoría (similar a descuentos)
                if (logro.bonus.categoria) {
                    const key = `ingresos_${logro.bonus.categoria}`;
                    bonus[key] = (bonus[key] || 0) + logro.bonus.valor;
                }
                break;
        }
    }

    return bonus;
}

// Obtener progreso de logros (para UI)
function getProgresoLogros() {
    const total = Object.keys(logrosData).length;
    const obtenidos = getLogrosObtenidos().length;
    const secretos = Object.values(logrosData).filter(l => l.secreto).length;

    return {
        total,
        obtenidos,
        porcentaje: Math.round((obtenidos / total) * 100),
        secretos,
        secretosObtenidos: getLogrosObtenidos().filter(id => logrosData[id]?.secreto).length
    };
}

// Obtener lista de logros para mostrar (con estado)
function getLogrosConEstado() {
    const obtenidos = getLogrosObtenidos();

    return Object.values(logrosData).map(logro => ({
        ...logro,
        obtenido: obtenidos.includes(logro.id),
        visible: !logro.secreto || obtenidos.includes(logro.id)
    }));
}

// Mostrar notificación de logros desbloqueados
function mostrarLogrosDesbloqueados(logros) {
    if (logros.length === 0) return;

    if (typeof audioSystem !== 'undefined') audioSystem.playUnlock();

    // Anunciar para screen readers
    logros.forEach(logro => {
        if (typeof announceAchievement === 'function') {
            announceAchievement(`${logro.icono} ${logro.nombre}`);
        }
    });

    // Crear o actualizar el contenedor de notificaciones
    let container = document.getElementById('logros-notification');
    if (!container) {
        container = document.createElement('div');
        container.id = 'logros-notification';
        container.className = 'logros-notification';
        document.body.appendChild(container);
    }

    // Añadir cada logro
    logros.forEach((logro, index) => {
        setTimeout(() => {
            const notif = document.createElement('div');
            notif.className = 'logro-notif';
            notif.innerHTML = `
                <span class="logro-notif-icon">${logro.icono}</span>
                <div class="logro-notif-info">
                    <span class="logro-notif-title">¡Logro Desbloqueado!</span>
                    <span class="logro-notif-name">${logro.nombre}</span>
                    ${logro.bonusTexto ? `<span class="logro-notif-bonus">${logro.bonusTexto}</span>` : ''}
                </div>
            `;

            container.appendChild(notif);

            // Animar entrada
            requestAnimationFrame(() => {
                notif.classList.add('show');
            });

            // Eliminar después de unos segundos
            setTimeout(() => {
                notif.classList.remove('show');
                setTimeout(() => notif.remove(), 500);
            }, 4000);
        }, index * 1000); // Escalonar notificaciones
    });
}
