<?php
declare(strict_types=1);

namespace ROITheme\Shared\Infrastructure\Wordpress;

use ROITheme\Shared\Infrastructure\Services\WrapperVisibilityService;

/**
 * Registra hook body_class para agregar clases CSS de componentes ocultos
 *
 * RESPONSABILIDAD:
 * - Registrar hook body_class
 * - Agregar clases CSS cuando componentes están ocultos
 *
 * FLUJO:
 * 1. body_class filter → addHiddenComponentClasses()
 *    - Verifica visibilidad de componentes clave (navbar, sidebar components)
 *    - Agrega clases: roi-hide-navbar, roi-hide-sidebar, etc.
 *
 * PROPÓSITO:
 * Failsafe CSS: Si los templates no pueden ocultar wrappers completamente,
 * estas clases permiten ocultarlos via CSS.
 *
 * PATRÓN:
 * - SRP: Solo registra hooks, delega lógica a WrapperVisibilityService
 *
 * @package ROITheme\Shared\Infrastructure\Wordpress
 * @see Plan 99.15 - Fix Empty Layout Wrappers
 */
final class BodyClassHooksRegistrar
{
    /**
     * Componentes que afectan el layout principal
     */
    private const LAYOUT_COMPONENTS = [
        'navbar' => 'roi-hide-navbar',
        'table-of-contents' => 'roi-hide-toc',
        'cta-box-sidebar' => 'roi-hide-cta-sidebar',
        'sidebar' => 'roi-hide-sidebar',
    ];

    /**
     * Componentes de sidebar que determinan si mostrar columna lateral
     */
    private const SIDEBAR_COMPONENTS = [
        'table-of-contents',
        'cta-box-sidebar',
    ];

    /**
     * Registrar hooks de WordPress
     */
    public function register(): void
    {
        add_filter('body_class', [$this, 'addHiddenComponentClasses']);
    }

    /**
     * Callback para body_class - agrega clases para componentes ocultos
     *
     * @param array<string> $classes Clases existentes
     * @return array<string> Clases modificadas
     */
    public function addHiddenComponentClasses(array $classes): array
    {
        // Agregar clase por cada componente oculto
        foreach (self::LAYOUT_COMPONENTS as $componentName => $cssClass) {
            if (!WrapperVisibilityService::shouldRenderWrapper($componentName)) {
                $classes[] = $cssClass;
            }
        }

        // Verificar si TODOS los componentes de sidebar están ocultos
        if ($this->allSidebarComponentsHidden()) {
            $classes[] = 'roi-sidebar-empty';
        }

        return $classes;
    }

    /**
     * Verifica si todos los componentes de sidebar están ocultos
     *
     * @return bool True si ningún componente de sidebar debe mostrarse
     */
    private function allSidebarComponentsHidden(): bool
    {
        foreach (self::SIDEBAR_COMPONENTS as $componentName) {
            if (WrapperVisibilityService::shouldRenderWrapper($componentName)) {
                return false;
            }
        }

        return true;
    }
}
