#!/usr/bin/env perl

use strict;
use warnings;

# DEBUG:
use FindBin;
use lib "$FindBin::Bin/../lib";
# END

use Getopt::Long;
use Plack::Util;
use Pod::Usage;

use Raisin;

my ($help, $version, $params, $routes);

GetOptions(
    help    => \$help,
    version => \$version,
    params => \$params,
    routes  => \$routes,
);

my $file = $ARGV[0] || do { $help = 1; '' };

if ($version) {
    print "Raisin v.$Raisin::VERSION\n";
}
elsif ($help) {
    pod2usage(1);
}
elsif ($routes) {
    print_routes();
}


### Subroutines

sub print_routes {
    if (!$file || !-e $file) {
        print "$0: file `$file` doesn't exists\n";
        exit;
    }

    my $app_routes;
    {
        no warnings 'redefine';
        *Raisin::run = sub { $app_routes = shift->routes->routes };
    }
    my $app = Plack::Util::load_psgi($file);

    for my $r (@$app_routes) {
        my $path = $r->path;
        $path =~ s#:([^/]+)#{$1}#g;

        printf "  %-7s %s\n", $r->method, $path;

        if ($params) {
            for my $p (@{ $r->params }) {
                printf "    %s: `%s', type: %s",
                    $p->required ? 'required' : 'optional',
                    $p->name,
                    $p->type->name;

                if (defined $p->default) {
                    printf ', default: %s', $p->default;
                }
                print "\n";
            }
            print "\n";
        }
    }
}

__END__

=head1 NAME

raisin - Raisin command script

=head1 SYNOPSIS

    raisin [options] <raisin-app>

    Options:
        --help          This help screen
        --version       Display version information
        --routes        Display application routes
        --params        Display route params (should use with --routes)

=head1 DESCRIPTION

List L<Raisin> application routes and show installed L<Raisin> version.

=cut

