The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
use strict;
use XAO::Base;

require 'requires.pl';

##
# Normally project name gets taken from PROJECT in Makefile, but you can
# override it here.
#
my $project=undef;

##
# List of files that your project needs built using standard replacements
#
my @files=qw(
    bin/build-structure
    objects/Config.pm
);

########### In most cases there is no need to change anything below ###########

if(!$project && open(F,'Makefile')) {
    while(<F>) {
        next unless /^PROJECT=(\w+)[\r\n\s]*$/;
        $project=$1;
        last;
    }
    close(F);
}
$project ||
    die "No project name in both Makefile and configure.pl\n";

my %c;
if(open(CACHE,".config-cache")) {
    while(my $str=<CACHE>) {
        chomp $str;
        next unless $str =~ /^\s*(project|base_url|odb_dsn|odb_user|odb_password|test_site)\s+(.*?)\s*$/;
        $c{$1}=$2;
    }
    close(CACHE);
}

if(!$c{project} || (stat(".config-cache"))[9] < (stat("configure.pl"))[9]) {
    print "Configuring project defaults\n\n";

    $project=$c{project} if $c{project};
    printf '%-40s : ',"Enter project name [$project]";
    chomp(my $n_project=<STDIN>);
    $project=$n_project if $n_project;

    my $base_url=$c{base_url} || "http://$project.com";
    printf '%-40s : ',"Enter base URL [$base_url]";
    chomp(my $n_base_url=<STDIN>);
    $base_url=$n_base_url if $n_base_url;

    my $dsn=$c{odb_dsn} || "OS:MySQL_DBI:$project";
    printf '%-40s : ',"Enter ODB_DSN [$dsn]";
    chomp(my $n_dsn=<STDIN>);
    $dsn=$n_dsn if $n_dsn;

    my $user=$c{odb_user} || '';
    printf '%-40s : ',"Enter ODB_USER [$user]";
    chomp(my $n_user=<STDIN>);
    $user=$n_user if $n_user;

    my $password=$c{odb_password} || '';
    printf '%-40s : ',"Enter ODB_PASSWORD [$password]";
    chomp(my $n_password=<STDIN>);
    $password=$n_password if $n_password;

    my $test_site=$c{test_site};
    printf '%-40s : ',"Is it a test site [".($test_site ? 'Y' : 'N')."] (y/n)";
    chomp(my $n_test_site=<STDIN>);
    if($n_test_site) {
        $test_site=lc($n_test_site) eq 'y' ? 1 : 0;
    }

    print "\n";

    print <<EOT;
Here are your values:
 PROJECT='$project'
 BASE_URL='$base_url'
 ODB_DSN='$dsn'
 ODB_USER='$user'
 ODB_PASSWORD='$password'
 TEST_SITE='$test_site'

EOT
    print "Are you sure? [Y/n] ";
    exit 1 if <STDIN> =~ /n/;
    print "\n";

    open(CACHE,">.config-cache") || die "Can't open .config-cache: $!\n";
    print CACHE <<EOT;
project         $project
base_url        $base_url
odb_dsn         $dsn
odb_user        $user
odb_password    $password
test_site       $test_site
EOT
    close(CACHE);
    $c{project}=$project;
    $c{base_url}=$base_url;
    $c{odb_dsn}=$dsn;
    $c{odb_user}=$user;
    $c{odb_password}=$password;
    $c{test_site}=$test_site;
}

for my $file (@files) {
    next if -r $file &&
            -r "$file.proto" &&
            (stat($file))[9] >= (stat("$file.proto"))[9] &&
            (stat($file))[9] >= (stat(".config-cache"))[9];

    print "$file.proto --> $file\n";

#    rename $file,"$file.old" if -f $file;

    open(PROTO,"$file.proto") || die "Can't open $file.proto: $!\n";
    open(FILE,"> $file") || die "Can't open $file: $!\n";
    while(my $str=<PROTO>) {
        $str=~s/<[%\$]PROJECT[%\$]>/$c{project}/ge;
        $str=~s/<[%\$]PROJECTSDIR[%\$]>/$XAO::Base::projectsdir/ge;
        $str=~s/<[%\$]BASE_URL[%\$]>/$c{base_url}/ge;
        $str=~s/<[%\$]ODB_DSN[%\$]>/$c{odb_dsn}/ge;
        $str=~s/<[%\$]ODB_USER[%\$]>/$c{odb_user}/ge;
        $str=~s/<[%\$]ODB_PASSWORD[%\$]>/$c{odb_password}/ge;
        $str=~s/<[%\$]TEST_SITE[%\$]>/$c{test_site}/ge;
        print FILE $str;
    }
    close(FILE);
    close(PROTO);

    chmod 0755, $file if $file =~ /bin\//;
}

exit 0;