<?php

/*
 * This file is part of the NelmioApiDocBundle package.
 *
 * (c) Nelmio
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Nelmio\ApiDocBundle\Command;

use Psr\Container\ContainerInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

class DumpCommand extends Command
{
    /**
     * @var ContainerInterface
     */
    private $generatorLocator;

    /**
     * DumpCommand constructor.
     */
    public function __construct(ContainerInterface $generatorLocator)
    {
        $this->generatorLocator = $generatorLocator;

        parent::__construct();
    }

    /**
     * Configures the dump command.
     */
    protected function configure()
    {
        $this
            ->setDescription('Dumps documentation in OpenAPI JSON format')
            ->addOption('area', '', InputOption::VALUE_OPTIONAL, '', 'default')
            ->addOption('no-pretty', '', InputOption::VALUE_NONE, 'Do not pretty format output')
        ;
    }

    /**
     * @throws InvalidArgumentException If the area to dump is not valid
     *
     * @return int|void
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $area = $input->getOption('area');

        if (!$this->generatorLocator->has($area)) {
            throw new InvalidArgumentException(sprintf('Area "%s" is not supported.', $area));
        }

        $spec = $this->generatorLocator->get($area)->generate();

        if ($input->hasParameterOption(['--no-pretty'])) {
            $output->writeln(json_encode($spec));
        } else {
            $output->writeln(json_encode($spec, JSON_PRETTY_PRINT));
        }

        return 0;
    }
}