<?php

namespace App\EventSubscriber;

use App\Entity\Campaign\Keyword;
use App\Entity\Campaign\Keyword\Check;
use App\Event\KeywordPositionUpdatedEvent;
use App\Service\Campaign\Keyword\CheckService;
use App\Service\Campaign\KeywordService;

final class KeywordPositionUpdatedSubscriber
{
    private $checkService;
    /**
     * @var KeywordService
     */
    private $keywordService;

    public function __construct(CheckService $checkService, KeywordService $keywordService)
    {
        $this->checkService = $checkService;
        $this->keywordService = $keywordService;
    }

    public function onUpdate(KeywordPositionUpdatedEvent $event)
    {
        $keywordPosition = $event->getKeywordPosition();

        $campaign = $keywordPosition->getCampaign();
        $keyword = $keywordPosition->getKeyword();

        $keywords = $campaign->getKeywords()->filter(function ($keywordEntity) use ($keyword) {
            return $keywordEntity->getTitle() === $keyword;
        });

        if ($keywords->count() > 0) {
            $keywordEntity = $keywords->first();
            if (!$this->checkService->existsByKeywordAndDate($keywordEntity, $keywordPosition->getDate())) {
                $check = (new Check())
                    ->setKeyword($keywordEntity)
                    ->setDay($keywordPosition->getDate())
                    ->setPosition($keywordPosition->getPosition())
                    ->setGoogleAdWordsCPC($keywordPosition->getGoogleAdWordsCPC())
                    ->setLandingUrl($keywordPosition->getLandingUrl())
                    ->setMonthlySearches($keywordPosition->getMonthlySearches())
                    ->setDiff($keywordPosition->getDiff())
                    ->setDiff1($keywordPosition->getDiff1())
                    ->setDiff7($keywordPosition->getDiff7())
                    ->setDiff30($keywordPosition->getDiff30());
                $this->checkService->save($check);
            }
        } else {
            $keyword = (new Keyword())->setCampaign($campaign)->setTitle($keyword);
            $keyword = $this->keywordService->save($keyword);
            $check = (new Check())
                ->setKeyword($keyword)
                ->setDay($keywordPosition->getDate())
                ->setPosition($keywordPosition->getPosition())
                ->setGoogleAdWordsCPC($keywordPosition->getGoogleAdWordsCPC())
                ->setLandingUrl($keywordPosition->getLandingUrl())
                ->setMonthlySearches($keywordPosition->getMonthlySearches())
                ->setDiff($keywordPosition->getDiff())
                ->setDiff1($keywordPosition->getDiff1())
                ->setDiff7($keywordPosition->getDiff7())
                ->setDiff30($keywordPosition->getDiff30());
            $this->checkService->save($check);
        }
    }
}
