<?php
declare(strict_types=1);

namespace ROITheme\Public\CriticalCSS\Application\UseCases;

use ROITheme\Public\CriticalCSS\Domain\Contracts\CriticalCSSCacheInterface;
use ROITheme\Public\CriticalCSS\Domain\Contracts\CriticalCSSExtractorInterface;

/**
 * Caso de uso para obtener/generar CSS critico
 *
 * Cumple DIP: depende de interfaces, no de clases concretas
 *
 * @package ROITheme\Public\CriticalCSS\Application\UseCases
 */
final class GetCriticalCSSUseCase
{
    public function __construct(
        private readonly CriticalCSSCacheInterface $cache,
        private readonly CriticalCSSExtractorInterface $extractor
    ) {}

    /**
     * Obtiene CSS critico, regenerando si es necesario
     *
     * @param string $type Tipo de CSS critico ('variables', 'responsive')
     * @return string CSS critico o vacio si no existe
     */
    public function execute(string $type): string
    {
        // Si no existe en cache, generar
        if (!$this->cache->has($type)) {
            $this->extractor->generateAll();
        }

        return $this->cache->get($type) ?? '';
    }

    /**
     * Fuerza regeneracion de todo el CSS critico
     *
     * @return array<string, int> Mapa de tipo => bytes generados
     */
    public function regenerate(): array
    {
        $this->cache->clear();
        return $this->extractor->generateAll();
    }
}
