<?php
declare(strict_types=1);

/**
 * Глобальные хелперы Celena. Файл подключается из Kernel один раз.
 * Никаких бизнес-вещей здесь — только тонкие обёртки.
 */

if (!function_exists('e')) {
    /** Экранирование значения для вывода в HTML. */
    function e(mixed $value): string
    {
        return htmlspecialchars((string) $value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
    }
}

if (!function_exists('e_js')) {
    /**
     * Экранирование значения для вставки внутрь JS-строкового литерала
     * (между " или ' внутри <script>). Безопасно для произвольных значений
     * настроек (валюта, разделители и т.п.), а также защищает от выхода
     * из <script> через "</script>" в данных.
     */
    function e_js(mixed $value): string
    {
        return str_replace(
            ['\\',   '"',   "'",   "\r",  "\n",  "\t",  '</',   '<!--',   '-->'],
            ['\\\\', '\\"', "\\'", '\\r', '\\n', '\\t', '<\\/', '<\\!--', '--\\>'],
            (string) $value
        );
    }
}

if (!function_exists('env')) {
    function env(string $key, mixed $default = null): mixed
    {
        $v = getenv($key);
        if ($v === false) {
            return $_ENV[$key] ?? $default;
        }
        return match (strtolower($v)) {
            'true', '(true)' => true,
            'false', '(false)' => false,
            'null', '(null)' => null,
            'empty', '(empty)' => '',
            default => $v,
        };
    }
}

if (!function_exists('app')) {
    /** Доступ к контейнеру / резолв сервиса. */
    function app(?string $abstract = null): mixed
    {
        $container = \Celena\Core\Kernel::container();
        if ($abstract === null) {
            return $container;
        }
        return $container->make($abstract);
    }
}

if (!function_exists('config')) {
    function config(string $key, mixed $default = null): mixed
    {
        /** @var \Celena\Core\Config $c */
        $c = app(\Celena\Core\Config::class);
        return $c->get($key, $default);
    }
}

if (!function_exists('url')) {
    function url(string $path = '', bool $absolute = false): string
    {
        $base = (string) (config('app.url') ?? '');
        $path = '/' . ltrim($path, '/');
        if ($absolute || $base !== '') {
            return rtrim($base, '/') . $path;
        }
        return $path;
    }
}

if (!function_exists('asset')) {
    function asset(string $path): string
    {
        return url('/public/assets/' . ltrim($path, '/'));
    }
}

if (!function_exists('csrf_token')) {
    function csrf_token(): string
    {
        return \Celena\Core\Security\Csrf::token();
    }
}

if (!function_exists('csrf_field')) {
    function csrf_field(): string
    {
        return '<input type="hidden" name="_csrf" value="' . e(csrf_token()) . '">';
    }
}

if (!function_exists('__')) {
    function __(string $key, array $params = []): string
    {
        try {
            if (\Celena\Core\Kernel::container_available()
                && \Celena\Core\Kernel::container()->has(\Celena\Core\I18n\Translator::class)) {
                /** @var \Celena\Core\I18n\Translator $t */
                $t = app(\Celena\Core\I18n\Translator::class);
                return $t->translate($key, $params);
            }
        } catch (\Throwable) {
            // fallthrough — возвращаем ключ как есть
        }
        $out = $key;
        foreach ($params as $k => $v) {
            $out = str_replace(':' . $k, (string) $v, $out);
        }
        return $out;
    }
}

if (!function_exists('dd')) {
    function dd(mixed ...$vars): never
    {
        foreach ($vars as $v) {
            echo '<pre style="background:#111;color:#eee;padding:12px;font-family:monospace;font-size:13px;">';
            var_export($v);
            echo "\n</pre>";
        }
        exit(1);
    }
}
