<?php

namespace App\EntityListener;

use App\Entity\Campaign\Keyword;
use App\Integrations\Semrush\Client;
use App\Integrations\Semrush\Requests\CreateKeywordRequest;
use App\Integrations\Semrush\Requests\DeleteKeywordRequest;

final class SemrushKeywordListener
{
    /**
     * @var Client
     */
    private $client;
    /**
     * @var CreateKeywordRequest
     */
    private $createKeywordRequest;
    /**
     * @var DeleteKeywordRequest
     */
    private $deleteKeywordRequest;

    /**
     * SemrushKeywordListener constructor.
     *
     * @param Client               $client
     * @param CreateKeywordRequest $createKeywordRequest
     * @param DeleteKeywordRequest $deleteKeywordRequest
     */
    public function __construct(Client $client, CreateKeywordRequest $createKeywordRequest, DeleteKeywordRequest $deleteKeywordRequest)
    {
        $this->client = $client;
        $this->createKeywordRequest = $createKeywordRequest;
        $this->deleteKeywordRequest = $deleteKeywordRequest;
    }

    public function postPersist(Keyword $keyword)
    {
        $body = new \stdClass();
        $body->keyword = $keyword->getTitle();
        if (null !== $keyword->getTags()) {
            $body->tags = array_map(function ($tag) {
                return $tag->getTitle();
            }, $keyword->getTags()->toArray());
        }

        $keywords = [];
        $keywords[] = $body;

        $this->createKeywordRequest->setProjectId($keyword->getCampaign()->getSemrushId());
        $this->createKeywordRequest->setBody(['keywords' => $keywords]);

        $this->client->execute($this->createKeywordRequest);
    }

    public function postRemove(Keyword $keyword)
    {
        if ($keyword->getCampaign()->getSemrushId()) {
            $body = new \stdClass();
            $body->keyword = $keyword->getTitle();

            $keywords = [];
            $keywords[] = $body;

            $this->deleteKeywordRequest->setProjectId($keyword->getCampaign()->getSemrushId());
            $this->deleteKeywordRequest->setBody(['keywords' => $keywords]);

            $this->client->execute($this->deleteKeywordRequest);
        }
    }
}
