<?php

namespace Knp\Bundle\GaufretteBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Output\OutputInterface;
use Gaufrette\Glob;

/**
 * Command that lists the file keys of a filesystem
 *
 * @author Antoine Hérault <antoine.herault@gmail.com>
 */
class FilesystemKeysCommand extends ContainerAwareCommand
{
    /**
     * {@inheritDoc}
     */
    protected function configure()
    {
        $this
            ->setName('gaufrette:filesystem:keys')
            ->setDescription('List all the file keys of a filesystem')
            ->addArgument('filesystem', InputArgument::REQUIRED, 'The filesystem to use')
            ->addArgument('glob', InputArgument::OPTIONAL, 'An optional glob pattern')
            ->setHelp(<<<EOT
The <info>gaufrette:filesystem:list</info> command lists all the file keys of the specified filesystem:

    <info>./app/console gaufrette:filesystem:list my_filesystem</info>

You can also optionaly specify a glob pattern to filter the results:

    <info>./app/console gaufrette:filesystem:list my_filesystem media_*</info>
EOT
            );
    }

    /**
     * {@inheritDoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $filesystem = $input->getArgument('filesystem');
        $glob       = $input->getArgument('glob');
        $container  = $this->getContainer();
        $serviceId  = sprintf('gaufrette.%s_filesystem', $filesystem);

        if (!$container->has($serviceId)) {
            throw new \RuntimeException(sprintf('There is no \'%s\' filesystem defined.', $filesystem));
        }

        $filesystem = $container->get($serviceId);
        $keys       = $filesystem->keys();

        if (!empty($glob)) {
            $glob = new Glob($glob);
            $keys = $glob->filter($keys);
        }

        $count = count($keys);

        $message = $count ? sprintf(
                'Bellow %s the <info>%s key%s</info> that where found:',
                $count > 1 ? 'are' : 'is',
                $count,
                $count > 1 ? 's': ''
            ) : "<info>0 keys</info> were found.";

        $output->writeln($message);

        $output->setDecorated(true);
        foreach ($keys as $key) {
            $output->writeln(' - <info>' . $key . '</info>');
        }
    }
}