<?php

namespace App\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

/**
 * При редиректе на /login до загрузки JS query-параметр sessionId теряется.
 * Ставим session-cookie на том же HTTP-ответе (в т.ч. 302), что и редирект.
 */
class SessionIdQueryCookieListener implements EventSubscriberInterface
{
    private const PARAM = 'sessionId';

    private const MAX_LEN = 128;

    public static function getSubscribedEvents(): array
    {
        return [KernelEvents::RESPONSE => 'onKernelResponse'];
    }

    public function onKernelResponse(ResponseEvent $event): void
    {
        if (!$event->isMainRequest()) {
            return;
        }

        $request = $event->getRequest();
        if (!$request->query->has(self::PARAM)) {
            return;
        }

        $value = trim((string) $request->query->get(self::PARAM));
        if ($value === '' || \strlen($value) > self::MAX_LEN) {
            return;
        }

        $cookie = Cookie::create(
            self::PARAM,
            $value,
            0,
            '/',
            null,
            $request->isSecure(),
            false,
            false,
            Cookie::SAMESITE_LAX
        );

        $event->getResponse()->headers->setCookie($cookie);
    }
}
