#!/usr/bin/env php
<?php namespace DbSync\Command;

$packageAutoloaders = array(
    __DIR__ . '/../vendor/autoload.php',
    __DIR__ . '/../../../autoload.php',
    __DIR__ . '/../../autoload.php',
);
foreach($packageAutoloaders as $autoloader)
{
    if(is_file($autoloader))
    {
        include $autoloader;
    }
}

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\DescriptorHelper;
use Symfony\Component\Console\Helper\FormatterHelper;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Debug\ErrorHandler;
ErrorHandler::register();

class App {

    private $descriptor;

    private $formatter;

    private $output;

    public function __construct()
    {
        $this->descriptor = new DescriptorHelper();
        $this->formatter = new FormatterHelper();
        $this->output = new ConsoleOutput();
    }

    private function showUsage(Command $command)
    {
        $this->output->writeln("");
        $this->output->writeln("<info>" . $command->getDescription() . "</info>");
        $this->output->writeln("");
        $this->descriptor->describe($this->output, $command->getDefinition());
        $this->output->writeln("");
    }

    public function run(Command $command)
    {
        $input = new ArgvInput();

        try
        {
            $input->bind($command->getDefinition());
            $input->validate();
        }catch (\Exception $e)
        {
            $this->output->writeln($this->formatter->formatBlock($e->getMessage(), 'error', true));

            $this->showUsage($command);

            return $e->getCode();
        }

        try
        {
            $command->run(new ArgvInput(), $this->output);
        }catch (\Exception $e)
        {
            $this->output->writeln($this->formatter->formatBlock($e->getMessage(), 'error', true));

            $this->output->writeln('<comment>' . $e->getTraceAsString() . '</comment>');

            return $e->getCode();
        }

        return 0;
    }

}

return (new App())->run(new SyncCommand());