<?php
declare(strict_types=1);

namespace ROITheme\Shared\Application\UseCases\EvaluateComponentVisibility;

use ROITheme\Shared\Application\UseCases\EvaluatePageVisibility\EvaluatePageVisibilityUseCase;
use ROITheme\Shared\Application\UseCases\EvaluateExclusions\EvaluateExclusionsUseCase;

/**
 * Caso de uso: Evaluar visibilidad completa de un componente
 *
 * Orquesta la evaluacion de:
 * 1. Visibilidad por tipo de pagina (Plan 99.10)
 * 2. Reglas de exclusion (Plan 99.11)
 *
 * El componente se muestra SOLO si:
 * - Pasa la verificacion de tipo de pagina
 * - NO esta excluido por ninguna regla
 *
 * PATRON: Facade/Orchestrator - combina dos UseCases
 *
 * @package ROITheme\Shared\Application\UseCases\EvaluateComponentVisibility
 */
final class EvaluateComponentVisibilityUseCase
{
    public function __construct(
        private readonly EvaluatePageVisibilityUseCase $pageVisibilityUseCase,
        private readonly EvaluateExclusionsUseCase $exclusionsUseCase
    ) {}

    /**
     * Evalua si el componente debe mostrarse en la pagina actual
     *
     * @param string $componentName Nombre del componente (kebab-case)
     * @return bool True si debe mostrarse
     */
    public function execute(string $componentName): bool
    {
        // Paso 1: Verificar visibilidad por tipo de pagina
        $visibleByPageType = $this->pageVisibilityUseCase->execute($componentName);

        if (!$visibleByPageType) {
            return false;
        }

        // Paso 2: Verificar exclusiones
        $isExcluded = $this->exclusionsUseCase->execute($componentName);

        // Mostrar si NO esta excluido
        return !$isExcluded;
    }
}
