<?php

namespace App\EventListener;

use App\Entity\BroadcastableInterface;
use App\Message\BroadcastMessage;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
use Symfony\Component\Messenger\MessageBusInterface;

class BroadcastListener
{
    /**
     * @var MessageBusInterface
     */
    private $messageBus;

    public function __construct(MessageBusInterface $messageBus)
    {
        $this->messageBus = $messageBus;
    }

    public function postPersist(LifecycleEventArgs $args)
    {
        if (!$this->supportsBroadcast($args->getObject())) {
            return null;
        }

        $object = $args->getObject();
        $this->broadcast($object->getDataType(), $object, 'create');
    }

    private function supportsBroadcast(object $object)
    {
        return in_array(BroadcastableInterface::class, class_implements(get_class($object)));
    }

    /**
     * @param string $dataType
     * @param        $data
     * @param string $action
     */
    private function broadcast(string $dataType, object $data, string $action): void
    {
        $this->messageBus->dispatch(new BroadcastMessage($dataType, $action, $data));
    }

    public function postUpdate(LifecycleEventArgs $args)
    {
        if (!$this->supportsBroadcast($args->getObject())) {
            return null;
        }

        $object = $args->getObject();
        $this->broadcast($object->getDataType(), $object, 'update');
    }

    /**
     * @ORM\PreRemove()
     */
    public function preRemove(LifecycleEventArgs $args)
    {
        if (!$this->supportsBroadcast($args->getObject())) {
            return null;
        }

        $object = $args->getObject();
        $this->broadcast($object->getDataType(), $object, 'delete');
    }
}
