<?php
declare(strict_types=1);

namespace ROITheme\Shared\Infrastructure\Services;

use ROITheme\Shared\Application\UseCases\CheckWrapperVisibilityUseCase;
use ROITheme\Shared\Infrastructure\Di\DIContainer;

/**
 * Servicio facade para verificar visibilidad de wrappers desde templates
 *
 * Responsabilidad: Proveer acceso simplificado (singleton/static) al
 * CheckWrapperVisibilityUseCase para uso en templates PHP.
 *
 * USO EN TEMPLATES:
 * ```php
 * if (WrapperVisibilityService::shouldRenderWrapper('navbar')) {
 *     // Renderizar wrapper y componente
 * }
 * ```
 *
 * @package ROITheme\Shared\Infrastructure\Services
 * @see Plan 99.15 - Fix Empty Layout Wrappers
 */
final class WrapperVisibilityService
{
    private static ?CheckWrapperVisibilityUseCase $useCase = null;

    /**
     * Verifica si el wrapper de un componente debe renderizarse
     *
     * @param string $componentName Nombre del componente (kebab-case)
     * @return bool True si el wrapper debe renderizarse
     */
    public static function shouldRenderWrapper(string $componentName): bool
    {
        $useCase = self::getUseCase();
        $isMobile = self::detectMobile();

        return $useCase->execute($componentName, $isMobile);
    }

    /**
     * Verifica visibilidad para múltiples componentes
     *
     * Útil para determinar si renderizar un contenedor que agrupa varios componentes
     *
     * @param array<string> $componentNames Lista de nombres de componentes
     * @return bool True si AL MENOS UNO de los componentes debe mostrarse
     */
    public static function shouldRenderAnyWrapper(array $componentNames): bool
    {
        foreach ($componentNames as $componentName) {
            if (self::shouldRenderWrapper($componentName)) {
                return true;
            }
        }

        return false;
    }

    /**
     * Obtiene o crea el UseCase
     *
     * @return CheckWrapperVisibilityUseCase
     */
    private static function getUseCase(): CheckWrapperVisibilityUseCase
    {
        if (self::$useCase === null) {
            $container = DIContainer::getInstance();
            self::$useCase = $container->getCheckWrapperVisibilityUseCase();
        }

        return self::$useCase;
    }

    /**
     * Detecta si el dispositivo actual es móvil
     *
     * Usa wp_is_mobile() de WordPress
     *
     * @return bool
     */
    private static function detectMobile(): bool
    {
        if (function_exists('wp_is_mobile')) {
            return wp_is_mobile();
        }

        return false;
    }

    /**
     * Limpia la instancia del UseCase (útil para tests)
     */
    public static function reset(): void
    {
        self::$useCase = null;
    }
}
