#!/usr/bin/env perl

use strict;
use Getopt::Long;
use Pod::Usage;

use RapidApp::Helper;

my $bootstrap_cmd = join(' ',(reverse split(/\//,$0))[0],@ARGV);

my $force    = 0;
my $help     = 0;
my $makefile = 0;
my $scripts  = 0;
my $dir;

my $helpers;

# We no longer support "upgrading" existing apps like catalyst.pl
# -- no longer accept those options from the command line
GetOptions(
    'help|?'      => \$help,
    #'force|nonew' => \$force,
    #'makefile'    => \$makefile,
    #'scripts'     => \$scripts,
    'helpers=s'   => \$helpers,
    'dir=s'       => \$dir
);

my $name = shift @ARGV;
my @extra_args = @ARGV;

pod2usage(1) if ( $help || !$name );

# Attempt to catch the common error of forgetting the app name with extra args
die "rapidapp.pl: Missing application-name!\n" if ($name =~ /^\-\-/);

my @default_traits = ('TabGui');

sub _traits_list {
  # Get the traits as a CSV list:
  my @list = $helpers ? split(/\,/,$helpers) : @default_traits;
  return map {
    $_ =~ s/^\+// ? $_ : "RapidApp::Helper::Traits::$_";
  } @list;
}

# --
# Special default --dir for rapi/psgi
# If we're being called from within the environment of the rapi/psgi docker image,
# use the /opt/app directory as the default app target dir because it is the most
# common-sense default for this scenario. See the rapi/psgi docs for more info
$dir = "/opt/app" if($ENV{RAPI_PSGI_DOCKERIZED} && !$dir);
# --

my $helper = RapidApp::Helper->new_with_traits({
    '.newfiles' => !$force,
    'makefile'  => $makefile,
    'scripts'   => $scripts,
    'traits'    => [&_traits_list],
    name        => $name,
    ( $dir ? ('dir' => $dir) : () ),
    extra_args  => \@extra_args,
    bootstrap_cmd => $bootstrap_cmd
});
# Pass $ARGV[0] for compatibility with old ::Devel
pod2usage(1) unless $helper->mk_app( $name );

1;

__END__

=head1 NAME

rapidapp.pl - Bootstrap a RapidApp/Catalyst application

=head1 SYNOPSIS

 rapidapp.pl [options] application-name [--] [extra options]

 'rapidapp.pl' creates a skeleton for a new RapidApp application

 Options:
  --help      display this help and exit
  --dir       optional custom target directory (must be empty or not exist)
  --helpers   comma-separated list of helper traits (RapidApp::Helper::Traits::*)

 Extra Options:
    When supplying --helpers, extra args can be supplied following -- after the
    application-name. These additional arguments will be processed by helpers
    which accept options.

 application-name must be a valid Perl module name and can include "::", 
 which will be converted to '-' in the project name.


 Examples:
   rapidapp.pl My::App
   rapidapp.pl MyApp
   rapidapp.pl --helpers Templates,TabGui,AuthCore,NavCore MyApp
   rapidapp.pl --helpers RapidDbic MyApp -- --dsn dbi:mysql:database=somedb,root,''
   rapidapp.pl --helpers RapidDbic MyApp -- --from-sqlite /path/to/existing/sqlt.db
   rapidapp.pl --helpers RapidDbic MyApp -- --from-sqlite-ddl my-schema.sql
   rapidapp.pl --helpers RapidDbic MyApp -- --blank-ddl

   rapidapp.pl --helpers RapidDbic MyApp -- \
     --dsn 'dbi:Pg:dbname=foo;host=localhost;port=5432',larry,secretpw \
     --loader-option db_schema='%' --loader-option preserve_case=0 \
     --connect-option quote_names=0

   rapidapp.pl --helpers RapidDbic MyApp -- --dsn \
     'dbi:ODBC:Driver=TDS;TDS_Version=7.0;Server=10.1.2.3;Port=1433;Database=Blah',sa,topsecret \


=head1 DESCRIPTION

The C<rapidapp.pl> script bootstraps a RapidApp/Catalyst application, creating a
directory structure populated with skeleton files.  

This script is simply an extension on top of C<catalyst.pl>. See L<catalyst>.

=head1 SEE ALSO

L<RapidApp>, L<rdbic.pl>, L<catalyst>, L<Catalyst::Manual>, L<Catalyst::Manual::Intro>

=head1 SUPPORT
 
IRC:
 
    Join #rapidapp on irc.perl.org.

=head1 AUTHOR

Henry Van Styn <vanstyn@cpan.org>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2013 by IntelliTree Solutions llc.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut