<?php

namespace App\Command;

use App\Entity\Campaign\Report;
use App\Service\Campaign\Report\PresetService;
use App\Service\Campaign\ReportService;
use App\Service\CampaignService;
use App\Service\UserService;
use Doctrine\ORM\EntityNotFoundException;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\ArrayInput;
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 CrmMakeReportCommand extends Command
{
    protected static $defaultName = 'crm:make:report';
    private static $campaignArgument = 'campaign';
    private static $presetArgument = 'preset';

    /**
     * @var ReportService
     */
    private $reportService;
    /**
     * @var CampaignService
     */
    private $campaignService;
    /**
     * @var UserService
     */
    private $userService;
    /**
     * @var PresetService
     */
    private $presetService;

    public function __construct(CampaignService $campaignService, ReportService $reportService, PresetService $presetService, UserService $userService, $name = null)
    {
        parent::__construct($name);
        $this->reportService = $reportService;
        $this->campaignService = $campaignService;
        $this->userService = $userService;
        $this->presetService = $presetService;
    }

    protected function configure()
    {
        $this
            ->setDescription('Add a Report')
            ->addArgument(self::$campaignArgument, InputArgument::REQUIRED, 'Campaign that we are creating report for')
            ->addArgument(self::$presetArgument, InputArgument::OPTIONAL, 'Preset for a report')
            ->addArgument('date', InputArgument::OPTIONAL, 'Current date in format "Y-m-d h:i:s"');
    }

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

        try {
            $campaign = $this->campaignService->getCampaign($input->getArgument(self::$campaignArgument));
        } catch (EntityNotFoundException $e) {
            $io->error($e->getMessage());

            return 1;
        }

        $date = $input->getArgument('date') ?? date('Y-m-d h:i:s', time());
        $dateFrom = \DateTime::createFromFormat('Y-m-d h:i:s', $date)
            ->sub(new \DateInterval('P1M'));
        $dateTo = \DateTime::createFromFormat('Y-m-d h:i:s', $date)
            ->sub(new \DateInterval('P1D'));

        $report = (new Report())
            ->setCampaign($campaign)
            ->setDateFrom($dateFrom)
            ->setDateTo($dateTo)
            ->setClientAvailable(0)
            ->setCreatedBy($this->userService->getUser(1));

        $preset = $input->getArgument(self::$presetArgument);
        if (null !== $preset) {
            try {
                $preset = $this->presetService->get((int) $preset);
            } catch (EntityNotFoundException $e) {
                $io->error($e->getMessage());

                return 1;
            }

            $report->setPreset($preset);
        }

        $this->reportService->save($report);

        $io->success('Report created');

        $command = $this->getApplication()->find('crm:semrush:report');

        $arguments = [
            'campaign' => $campaign->getId(),
        ];

        $commandInput = new ArrayInput($arguments);

        try {
            $command->run($commandInput, $output);
        } catch (\Exception $e) {
            $io->error($e->getMessage());

            return 0;
        }
        $io->success('Semrush report fetched');
    }
}
