<?php

namespace App\MessageHandler;

use App\Event\StatCheckedEvent;
use App\Integrations\Majestic\ReportHandler as MajesticReportHandler;
use App\Integrations\Majestic\Request as MajesticRequest;
use App\Message\ProspectCreated;
use App\Service\CitationFlowChecker;
use App\Service\NewDomainAuthorityChecker;
use App\Service\ProspectService;
use App\Service\StatResponse;
use App\Service\StatsProcessor;
use App\Service\TrustFlowChecker;
use Doctrine\ORM\EntityNotFoundException;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;

final class GetMajesticReportMessageHandler implements MessageHandlerInterface
{
    /**
     * @var ProspectService
     */
    private $prospectService;
    /**
     * @var NewDomainAuthorityChecker
     */
    private $domainAuthorityChecker;
    /**
     * @var TrustFlowChecker
     */
    private $trustFlowChecker;
    /**
     * @var CitationFlowChecker
     */
    private $citationFlowChecker;
    /**
     * @var StatsProcessor
     */
    private $statsProcessor;
    /**
     * @var LoggerInterface
     */
    private $logger;
    /**
     * @var MajesticReportHandler
     */
    private $majesticReportHandler;
    /**
     * @var EventDispatcherInterface
     */
    private $dispatcher;

    public function __construct(ProspectService $prospectService, MajesticReportHandler $handler, EventDispatcherInterface $dispatcher, LoggerInterface $logger)
    {
        $this->prospectService = $prospectService;
        $this->logger = $logger;
        $this->majesticReportHandler = $handler;
        $this->dispatcher = $dispatcher;
    }

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

        $domain = $prospect->getDomain();

        $request = MajesticRequest::from($domain->getUrl());
        $response = $this->majesticReportHandler->report($request);

        $this->dispatchEvent(new StatResponse($domain->getUrl(), "TF", $response->getTf()), $domain->getId());
        $this->dispatchEvent(new StatResponse($domain->getUrl(), "CF", $response->getCf()), $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);
    }
}