<?php

namespace App\Command;

use App\Entity\Campaign\OrganicOverviewCheck;
use App\Integrations\Semrush\Client;
use App\Integrations\Semrush\Requests\GetOrganicOverviewRequest;
use App\Service\Campaign\OrganicOverviewCheckService;
use App\Service\CampaignService;
use Exception;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

class CrmCheckOrganicOverviewCommand extends Command
{
    protected static $defaultName = 'crm:check:organic';
    /**
     * @var CampaignService
     */
    private $campaignService;
    /**
     * @var Client
     */
    private $semrushClient;
    /**
     * @var OrganicOverviewCheckService
     */
    private $organicOverviewCheckService;

    public function __construct(CampaignService $campaignService, Client $semrushClient, OrganicOverviewCheckService $organicOverviewCheckService, ?string $name = null)
    {
        parent::__construct($name);
        $this->campaignService = $campaignService;
        $this->semrushClient = $semrushClient;
        $this->organicOverviewCheckService = $organicOverviewCheckService;
    }

    protected function configure()
    {
        $this
            ->setDescription('Get SEMrush organic overview report')
            ->addArgument('campaign', InputArgument::REQUIRED, 'Campaign ID');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $io = new SymfonyStyle($input, $output);
        $campaign = $input->getArgument('campaign');

        try {
            $campaign = $this->campaignService->getCampaign($campaign);
        } catch (Exception $exception) {
            $io->error('Campaign not found ('.$exception->getMessage().')');
        }

        if (null === $campaign->getSemrushId()) {
            $io->error('Campaign is not connected to SEMrush project!');

            return 1;
        }

        $request = (new GetOrganicOverviewRequest())
            ->setProjectId($campaign->getSemrushId())
            ->setReportUrl($campaign->getDomain()->getUrl());

        $response = $this->semrushClient->execute($request);

        try {
            $check = OrganicOverviewCheck::fromArray($response->getBody());
            $check->setCampaign($campaign);
        } catch (Exception $e) {
            $io->error($e->getMessage());

            return 1;
        }

        $this->organicOverviewCheckService->save($check);

        $io->success('Job finished');

        return 0;
    }
}
