package Minilla::CLI;
use strict;
use warnings;
use utf8;
use Getopt::Long;
use Try::Tiny;

use Minilla;
use Minilla::Errors;
use Minilla::Project;
use Minilla::Util qw(find_dir);
use Minilla::Logger;

use Minilla::CLI::New;
use Minilla::CLI::Help;
use Minilla::CLI::Dist;
use Minilla::CLI::Test;
use Minilla::CLI::Release;
use Minilla::CLI::Install;

use Moo;

no Moo;

sub run {
    my ($self, @args) = @_;

    local $Minilla::AUTO_INSTALL = 1;
    local $Minilla::Logger::COLOR = -t STDOUT ? 1 : 0;
    local @ARGV = @args;
    my @commands;
    my $version;
    my $p = Getopt::Long::Parser->new(
        config => [ "no_ignore_case", "pass_through" ],
    );
    $p->getoptions(
        "h|help"         => sub { unshift @commands, 'help' },
        "color!"         => \$Minilla::Logger::COLOR,
        "debug!"         => \$Minilla::DEBUG,
        "auto-install!"  => \$Minilla::AUTO_INSTALL,
        'version!'       => \$version,
    );

    if ($version) {
        print "Minilla: $Minilla::VERSION\n";
        exit 0;
    }

    push @commands, @ARGV;

    my $cmd = shift @commands || 'help';
    my $klass = sprintf("Minilla::CLI::%s", ucfirst($cmd));

    ## no critic
    if (eval sprintf("require %s; 1;", $klass)) {
        try {
            $klass->run(@commands);
        } catch {
            /Minilla::Error::CommandExit/ and return;
            errorf("%s\n", $_);
            exit 1;
        }
    } else {
        warnf("Could not find command '%s'\n", $cmd);
        if ($@ !~ /^Can't locate Minilla/) {
            errorf("$@\n");
        }
        exit 2;
    }
}

1;

