<?php

namespace App\Service\Prospect;

use App\Entity\Domain;
use App\Service\CitationFlowChecker;
use App\Service\DomainAuthorityChecker;
use App\Service\DomainService;
use App\Service\StatsProcessor;
use App\Service\TrustFlowChecker;
use Throwable;

class DomainStatsProvider
{
    /**
     * @var TrustFlowChecker
     */
    private $trustFlowChecker;
    /**
     * @var CitationFlowChecker
     */
    private $citationFlowChecker;
    /**
     * @var StatsProcessor
     */
    private $statsProcessor;
    /**
     * @var DomainAuthorityChecker
     */
    private $domainAuthorityChecker;

    public function __construct(StatsProcessor $statsProcessor, DomainService $domainService,
                                DomainAuthorityChecker $domainAuthorityChecker, TrustFlowChecker $trustFlowChecker,
                                CitationFlowChecker $citationFlowChecker)
    {
        $this->trustFlowChecker = $trustFlowChecker;
        $this->citationFlowChecker = $citationFlowChecker;
        $this->statsProcessor = $statsProcessor;
        $this->domainAuthorityChecker = $domainAuthorityChecker;
    }

    public function get(Domain $domain)
    {
        $this->configure($domain);

        try {
            $this->statsProcessor->process();
        } catch (Throwable $e) {
            dd($e);
        }

    }

    private function configure(Domain $domain)
    {
        $this->statsProcessor->setDomain($domain->getUrl());
        $this->statsProcessor->setDomainId($domain->getId());

        foreach ($domain->getStats() as $stat) {
            switch ($stat->getStat()->getSymbol()) {
                case 'DA':
                    $this->statsProcessor->addChecker($this->checker);

                    break;
                case 'TF':
                    $this->statsProcessor->addChecker($this->trustFlowChecker);

                    break;
                case 'CF':
                    $this->statsProcessor->addChecker($this->citationFlowChecker);

                    break;
                default:
                    break;
            }
        }

    }
}