<?php

namespace App\Command\App\Delete;

use App\Service\UserService;
use Doctrine\ORM\EntityNotFoundException;
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;
use Webmozart\Assert\Assert;

class UsersCommand extends Command
{
    protected static $defaultName = 'app:delete:users';
    /**
     * @var UserService
     */
    private $userService;

    public function __construct(UserService $userService, $name = null)
    {
        parent::__construct($name);
        $this->userService = $userService;
    }

    protected function configure()
    {
        $this
            ->setDescription('Remove users within id range')
            ->addArgument('firstId', InputArgument::REQUIRED, 'Id of a first user to delete')
            ->addArgument('lastId', InputArgument::REQUIRED, 'Id of a last user to delete');
    }

    /**
     * @param InputInterface  $input
     * @param OutputInterface $output
     *
     * @return int|null
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $io = new SymfonyStyle($input, $output);

        try {
            $firstId = $input->getArgument('firstId');
            $lastId = $input->getArgument('lastId');
            Assert::integerish($firstId);
            Assert::integerish($lastId);
            Assert::greaterThan($lastId - $firstId + 1, 0);
        } catch (\Exception $e) {
            $io->error($e->getMessage());

            return 1;
        }

        $io->createProgressBar();

        $io->progressStart($lastId - $firstId + 1);

        $counter = 0;
        for ($i = $firstId; $i <= $lastId; ++$i) {
            try {
                $user = $this->userService->getUser($i);
            } catch (EntityNotFoundException $e) {
                continue;
            }
            $this->userService->deleteUser($user);
            ++$counter;
            $io->progressAdvance(1);
        }

        $io->progressFinish();
        $io->success(sprintf('%s users has been deleted', $counter));
    }
}
