<?php

namespace App\Command\Crm\LandingPage;

use App\Service\BacklinksChecker;
use App\Service\BacklinksFakeChecker;
use App\Service\Campaign\LandingPageService;
use App\Service\LandingPageProcessor;
use App\Service\PageAuthorityChecker;
use Exception;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

class CheckCommand extends Command
{
    protected static $defaultName = 'crm:landing:check';
    /**
     * @var LandingPageProcessor
     */
    private $landingPageProcessor;
    /**
     * @var LandingPageService
     */
    private $landingPageService;
    /**
     * @var PageAuthorityChecker
     */
    private $pageAuthorityChecker;
    /**
     * @var BacklinksChecker
     */
    private $backlinksChecker;
    /**
     * @var BacklinksFakeChecker
     */
    private $backlinksFakeChecker;

    public function __construct(LandingPageProcessor $landingPageProcessor, LandingPageService $landingPageService,
                                PageAuthorityChecker $pageAuthorityChecker, BacklinksChecker $backlinksChecker,
                                BacklinksFakeChecker $backlinksFakeChecker,
                                ?string $name = null)
    {
        parent::__construct($name);
        $this->landingPageProcessor = $landingPageProcessor;
        $this->landingPageService = $landingPageService;
        $this->pageAuthorityChecker = $pageAuthorityChecker;
        $this->backlinksChecker = $backlinksChecker;
        $this->backlinksFakeChecker = $backlinksFakeChecker;
    }

    protected function configure()
    {
        $this
            ->setDescription('Run some checks for Landing Page')
            ->addArgument('landingPageId', InputArgument::REQUIRED, 'Id of a LandingPage to check')
            ->addOption('test', 'T', InputOption::VALUE_NONE);
    }

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

        $test = $input->getOption('test');

        if ($test) {
            $io->note(sprintf('Running in test mode (not using Semrush API units)'));
        }

        try {
            $landingPageEntity = $this->landingPageService->get($landingPageId);
        } catch (Exception $exception) {
            $io->error('Landing Page not found ('.$exception->getMessage().')');

            return null;
        }

        $this->landingPageProcessor->setUrl($landingPageEntity->getUrl());
        $this->landingPageProcessor->setLandingPageId($landingPageEntity->getId());

        $this->landingPageProcessor->addChecker($this->pageAuthorityChecker);
        if ($test) {
            $this->landingPageProcessor->addChecker($this->backlinksFakeChecker);
        } else {
            $this->landingPageProcessor->addChecker($this->backlinksChecker);
        }

        try {
            $this->landingPageProcessor->process();
        } catch (Exception $e) {
            $io->getErrorStyle()->warning($e->getMessage());

            return 1;
        }

        $io->success('Finished');

        return 0;
    }
}
