<?php
declare(strict_types=1);

namespace Celena\Core\Support;

/**
 * Превращает URL исходного изображения в URL нужного варианта:
 *   /public/uploads/2026/04/abc.jpg + 'thumb' → /public/uploads/2026/04/abc@thumb.jpg
 *
 * Если файл-вариант физически отсутствует (например, загружен ДО того, как включили
 * генерацию вариантов, или это SVG без вариантов) — возвращаем оригинальный URL.
 *
 * Сами варианты создаёт ImageProcessor при upload'е медиа. Размеры можно настроить
 * в Настройки → Медиа.
 */
final class ImageVariant
{
    /** @var array<string, string> кеш результатов в пределах запроса */
    private static array $cache = [];

    public static function url(string $url, string $size = 'thumb'): string
    {
        $url = trim($url);
        if ($url === '') return '';
        if (!in_array($size, ['thumb', 'medium', 'large'], true)) return $url;
        if (!str_starts_with($url, '/public/uploads/')) return $url;

        $key = $url . '|' . $size;
        if (isset(self::$cache[$key])) return self::$cache[$key];

        $ext = pathinfo($url, PATHINFO_EXTENSION);
        if ($ext === '') return self::$cache[$key] = $url;
        // SVG / не-растровые — вариантов не делали
        if (strtolower($ext) === 'svg') return self::$cache[$key] = $url;

        $base = substr($url, 0, -(strlen($ext) + 1));
        $variant = $base . '@' . $size . '.' . $ext;

        $root = \Celena\Core\Kernel::rootPath();
        $absPath = $root . $variant;
        if (is_file($absPath)) {
            return self::$cache[$key] = $variant;
        }
        return self::$cache[$key] = $url;
    }
}
