<?php

declare(strict_types=1);

namespace App\MessageHandler;

use App\Message\BroadcastMessage;
use App\Service\BroadcasterInterface;
use JMS\Serializer\SerializationContext;
use JMS\Serializer\Serializer;
use JMS\Serializer\SerializerInterface;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
use Symfony\Component\Security\Core\Security;

final class BroadcastMessageHandler implements MessageHandlerInterface
{
    private $user;
    /**
     * @var Serializer
     */
    private $serializer;
    /**
     * @var BroadcasterInterface
     */
    private $broadcaster;

    public function __construct(Security $security, SerializerInterface $serializer, BroadcasterInterface $broadcaster)
    {
        $this->user = $security->getUser() ?: ['firstName' => 'System', 'lastName' => 'User', 'id' => 1];
        $this->serializer = $serializer;
        $this->broadcaster = $broadcaster;
    }

    public function __invoke(BroadcastMessage $message)
    {
        $user = 'tasklistitemactivity' === $message->getDataType() ? ['firstName' => 'System', 'lastName' => 'User', 'id' => 1] : $this->user;
        $data = [
            'dataType' => $message->getDataType(),
            'action' => $message->getAction(),
            'user' => $user,
            'data' => $message->getData(),
        ];

        /** @var SerializationContext $context */
        $context = SerializationContext::create()
            ->setGroups('broadcast')
            ->enableMaxDepthChecks();

        try {
            $data = $this->serializer->serialize($data, 'json', $context);
        } catch (\Exception $e) {
            return;
        }
        $this->broadcaster->broadcast($data);
    }
}
