<?php

namespace App\MessageHandler;

use App\Event\StatCheckedEvent;
use App\Integrations\MozApi\Client as MozClient;
use App\Message\ProspectCreated;
use App\Service\NewDomainAuthorityChecker;
use App\Service\ProspectService;
use App\Service\StatResponse;
use App\Service\StatsProcessor;
use Doctrine\ORM\EntityNotFoundException;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;

final class GetDomainAuthorityMessageHandler implements MessageHandlerInterface
{
    /**
     * @var ProspectService
     */
    private $prospectService;
    /**
     * @var NewDomainAuthorityChecker
     */
    private $domainAuthorityChecker;
    /**
     * @var LoggerInterface
     */
    private $logger;
    /**
     * @var EventDispatcherInterface
     */
    private $dispatcher;
    /**
     * @var StatsProcessor
     */
    private $statsProcessor;
    /**
     * @var MozClient
     */
    private $mozClient;

    public function __construct(MozClient $client, ProspectService $prospectService,
                                EventDispatcherInterface $dispatcher, LoggerInterface $logger)
    {
        $this->prospectService = $prospectService;
        $this->logger = $logger;
        $this->dispatcher = $dispatcher;
        $this->mozClient = $client;
    }

    public function __invoke(ProspectCreated $message)
    {
        try {
            $prospect = $this->prospectService->get($message->getProspectId());
        } catch (EntityNotFoundException $e) {
            return;
        }

        $domain = $prospect->getDomain();
        $domainAuthority = $this->mozClient->getDomainAuthority($domain->getUrl());

        $this->dispatchEvent(new StatResponse($domain->getUrl(), "DA", $domainAuthority), $domain->getId());

    }

    /**
     * @param int|null $domainId
     */
    private function dispatchEvent(StatResponse $response, ?int $domainId)
    {
        $event = new StatCheckedEvent($response, $domainId);
        $this->dispatcher->dispatch('event.stat_checked', $event);
    }
}