<?php

declare(strict_types=1);

namespace App\MessageHandler;

use App\Entity\Domain\MajesticTopic;
use App\Entity\Domain\TopicTrustFlow;
use App\Message\MajesticReportFetched;
use App\Service\Domain\MajesticTopicService;
use App\Service\Domain\TopicTrustFlowService;
use App\Service\DomainService;
use Doctrine\ORM\EntityNotFoundException;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;

final class MajesticReportFetchedHandler implements MessageHandlerInterface
{
    /**
     * @var MajesticTopicService
     */
    private $majesticTopicService;
    /**
     * @var DomainService
     */
    private $domainService;
    /**
     * @var TopicTrustFlowService
     */
    private $topicTrustFlowService;

    public function __construct(DomainService $domainService, TopicTrustFlowService $topicTrustFlowService, MajesticTopicService $majesticTopicService)
    {
        $this->majesticTopicService = $majesticTopicService;
        $this->domainService = $domainService;
        $this->topicTrustFlowService = $topicTrustFlowService;
    }

    public function __invoke(MajesticReportFetched $message)
    {
        try {
            $domain = $this->domainService->getByUrl($message->getDomain());
        } catch (EntityNotFoundException $e) {
            return;
        }
        $domain = $this->domainService->saveDomain($domain->resetTopicTrustFlows());

        $report = $message->getReport();
        $data = json_decode($report);
        $topicsCount = $data->DataTables->Results->Headers->TopicsCount;

        $result = $data->DataTables->Results->Data[0];
        for ($i = 0; $i < $topicsCount; ++$i) {
            $topic = sprintf('TopicalTrustFlow_Topic_%s', $i);
            $value = sprintf('TopicalTrustFlow_Value_%s', $i);
            if ($result->$topic) {
                $majesticTopic = $this->majesticTopicService->getByTitle($result->$topic);

                if (null === $majesticTopic) {
                    $majesticTopic = (new MajesticTopic())->setTitle($result->$topic);
                    $majesticTopic = $this->majesticTopicService->save($majesticTopic);
                }

                $topicTrustFlow = (new TopicTrustFlow())
                    ->setTopic($majesticTopic)
                    ->setValue((int) $result->$value)
                    ->setDomain($domain);

                $this->topicTrustFlowService->save($topicTrustFlow);
            }
        }
    }
}
