#!/usr/bin/perl
use 5.032;
use strict;
use warnings;

use Config;
use Data::Dumper();
use lib ((my $lib = $Config{archlib}) =~ s|perl5|GranJefe/plib|r);

package GJModule;
use Getopt::Long qw(:config no_ignore_case pass_through);
sub Load {
    no warnings 'once';
    local $GJ::__curserv = 'none';
    my $m;
    while(my $package = shift) {
	my @mparam = ();
	@mparam = split(',' , $1) if($package =~ s/\((.*)\)//);
        if(GJ::CServices::Tryload($package) and $m = $package->Config(@mparam)) {
            $GJ::Modules{'none'}{$m->{_name}} = $m;
            $m->Installed('OnConfigured');
        } else {
            warn "Can't load $package: $@\n";
            # TODO
        }
    }
    return $m;
}

sub Import {
    my $package = shift;
    my $caller = caller;
    no strict 'refs';
    while(my $sym  = shift) {
        if(defined &{$package."::$sym"}) {
            *{$caller."::$sym"} = \&{$package."::$sym"};
        } else {
            warn "${package}::${sym} not defined\n";
        }
    }
}

sub Config {
    no warnings 'once';
    my $mod = shift;
    $GranJefe::CFG->{GJMC}{$mod} = shift;
}

our $Options = {
    User => sub {
        $ENV{MOD_PERL_GJUSER} = $ENV{USER};
        $ENV{MOD_PERL_GJDPATH} = '/home/sog/work/myperl/GJ/base';
    },
    Llevel => 'warn',
    Define => [],
};

#Mockups
package Apache2::ServerUtil {
    sub server_root { "/var/GranJefe" }
    sub exists_config_define {
        my $opt = $_[0] =~ s/^GJ_//r;
        scalar grep $opt eq uc $_, @{ $Options->{Define} };
    }
}

GetOptions(
    $Options,
    'Define=s@',
    'User',
    'Llevel=s',
    'verbose',
);

{
    local $SIG{__WARN__} = sub { return unless $Options->{verbose}; warn $_[0] };
    require Bootstrap;
    no warnings 'once';
    $GJ::Slevel = $GJ::Llevels{ $Options->{Llevel} };
    $ENV{SERVER_ROOT} = $GJ::ServerRoot = $GJ::Dynaconf::Defs{ServerRoot};
    $GJ::Privs = "$GJ::Dynaconf::Defs{User}:soft"; #$GJ::Dynaconf::Defs{Group}";
    #warn "$GJ::ServerRoot/plib";
    GJ::VFS->PathRegister("$GJ::ServerRoot/plib", 0);
}

package main;
if(my $file = shift) {
    my $ret = do $file;
    die "Error: $@\n" if $@;
    die "Can't load $file: $!\n" if $! && !defined $ret;
}
