#!/usr/bin/env tarbaby

# PODNAME: tpsgi
# ABSTRACT: PSGI application which simplifies migrating legacy/cgi applications to PSGI, but also has advanced features for normal psgi apps

use 5.040;
use warnings FATAL => 'all';
use re '/aa';

use FindBin::libs;
use File::Basename qw{dirname};

use TPSGI;

my %options = main(@ARGV);

=head1 USAGE

tpsgi ... starman options

tpsgi obeys a config file, ~/.tpsgi.ini which is in Config::Simple (key=value) format, with the keys being:

    verbose     # Whether to print all log messages or not
    custom_log  # Custom location for default (rotated) log
    routers     # Router module(s), separate with comma.  Relative to TPSGI install dir.
    indices     # Dirindex files.  In addition to index.html, index.htm, index.cgi
    loggers     # Logger module(s), separate with comma.  Loaded by name, from beside a router or @INC
    auth        # Authentication module
    domain      # Domain name of the application, used by things like service files
    basedir     # Directory you want to chdir into on startup. Relative to TPSGI install dir.  Default '.'
    user        # Who to run as
    http_user   # Who's proxying this application (used for statics)
    autoreload  # Whether or not to automatically reload the application when library files change. Default 0.

The idea is that this application is going to be run in a chroot with the user's homedir being the application dir.
This is why the various paths asked for are relative to the tPSGI install dir.

=cut

sub main {
    my (@args) = @_;

    my %config = TPSGI::get_config();
    foreach my $route ( @{ $config{routers} } ) {
        my $libdir = dirname($route);
        push( @INC, $libdir );
    }

    return %config;
}

our $app = sub {
    umask 0o022;

    # Change your dir into whatever basedir you need to be in
    chdir("$options{tpsgi_dir}/$options{basedir}") or die "Can't chdir into $options{tpsgi_dir}/$options{'basedir'}: $!";

    # If we have manually set the NYTPROF var, use it and don't try to control
    # When to stop or start it.
    $ENV{NYTPROF} ||= "sigexit=1:savesrc=0:start=no:file=$options{tpsgi_dir}/prof/nytprof.out";
    require Devel::NYTProf;
    mkdir "$options{tpsgi_dir}/prof";

    # new() loads the routers, so a router that will not compile dies here,
    # before app() can catch anything.
    my $self = eval { TPSGI->new(%options) } or return TPSGI::cannot_start( $@, $_[0], %options );
    return $self->app(@_);
};
