#! /usr/bin/perl
use strict;
use Getopt::Long;
use File::Copy;

# options
my @optlist = ("h|help!","v|verbose!");
my $result = GetOptions @optlist;
our ($opt_h, $opt_v);

# -h option || check the number of arguments
if ($opt_h || @ARGV < 2 || @ARGV > 4) {
    usage();
    exit 1;
}

# get arguments
my $prolog_file   = $ARGV[0];
my $command_file  = $ARGV[1];
my $prolog        = $ARGV[2];
my $prolog_system = $ARGV[3];

# check arguments
if (! -e $prolog_file) {
    &error("File $prolog_file does not exist");
}

if (! $prolog) {
    $prolog = "prolog";
}

if (! $prolog_system) {
    $prolog_system = "Unknown";
}

# main
my $nosuffix = $prolog_file;
$nosuffix =~ s/.pl$//g;
my $cmd_temp = $nosuffix . ".txt";

if ($prolog_system eq "SICStus" || $prolog_system eq "SWI-Prolog") { # SICStus or SWI-Prolog
    my $wam;
    my $dump;
    my $goal;
    my $goal2;
    if ($prolog_system eq "SICStus") {
	$wam  = $nosuffix . ".ql";
	$dump = $nosuffix . ".sav";
	#$goal = "\"[operators], fcompile(\'$prolog_file\'), load(\'$wam\'), save_program(\'$dump\', main), halt.\"";
	$goal = "\"[operators], fcompile([\'$prolog_file\',system]), load(\'$wam\'), load(system), save_program(\'$dump\', main), halt.\"";
	$goal2 = "load(\'$wam\'), main.";
    }
    if ($prolog_system eq "SWI-Prolog") {
	$wam  = $nosuffix . ".qlf";
	$dump = $nosuffix . ".qsav";
#	$goal = "\"[operators], qcompile(\'$prolog_file\'), load_files(\'$wam\'), qsave_program(\'$dump\', [goal=main]), halt.\"";
	$goal = "\"[operators], qcompile([\'$prolog_file\',system]), load_files(\'$wam\'), load_files(system),qsave_program(\'$dump\', [goal=main]), halt.\"";
	$goal2 = "load_files(\'$wam\'), main.";
    }
    &message("unlink $wam, $dump");
    unlink $wam, $dump;
    my $cmd = "echo $goal | $prolog";
    if (! $opt_v) {# check -v option
	$cmd .= " 2> /dev/null";
    }
    &message("making $wam, $dump");
    &message($cmd);
    system($cmd);
    if (-e $dump) { # saving program succeeds
	unlink $wam;
	&message("making $command_file");
	&mk_command($command_file, $cmd_temp, undef, $dump, undef, undef);
	chmod 0755, $command_file;
	exit 0;
    } elsif (-e $wam) { # compilation succeeds, but saving program fails
	&message("making $command_file");
	&mk_command($command_file, $cmd_temp, $goal2, $prolog, undef, undef);
	chmod 0755, $command_file;
	exit 0;
    } else {
	&error("$0 fails");
    }
} elsif ($prolog_system eq "PrologCafe") {
    my $file;
    my $system_opts;
    my $system_args;
    # set $system_opts
    #$system_opts = "-cp \\\$PLCAFEDIR/lang.jar:\\\$PLCAFEDIR/builtin.jar:\\\$PLCAFEDIR/compiler.jar";
    $system_opts = "-cp \\\$PLCAFEDIR/plcafe.jar";
    if ($prolog_file =~ m|.*/(.*).pl$|i) {
	$file = $1;
    } else {
	&error("invalid prolog file found, $prolog_file");
    }
    # set $system_args
    $system_args = "com.googlecode.prolog_cafe.lang.PrologMain com.googlecode.prolog_cafe.compiler.$file:main";
    &message("making $command_file");
    &mk_command($command_file, $cmd_temp, undef, $prolog, $system_opts, $system_args);
    chmod 0755, $command_file;
    exit 0;    
} else {
    my $goal3 = "[\'$prolog_file\',system], main.";
#    my $goal3 = "[\'$prolog_file\'], main.";
    &message("making $command_file");
    &mk_command($command_file, $cmd_temp, $goal3, $prolog, undef, undef);
    chmod 0755, $command_file;
    exit 0;
}

exit 0;

# sub
sub usage {
    print "\nUsage: $0 [-options] prolog_file command_file [prolog] [prolog_system]\n";
    print "\n where options include:\n";
    print "\t-h -help         : print this help message\n";
    print "\t-v -verbose      : enable verbose output\n";
    print "\n where prolog is the command of Prolog system:\n";
    print "\t(ex.) sicstus, pl, swipl, prolog...\n";
    print "\n where prolog_system include:\n";
    print "\tSICStus\n";
    print "\tSWI-Prolog\n\n";
}

sub message {
    my ($x) = @_;
    if ($opt_v) { # check -v option
	print "\% $x\n";
    }
}

sub error {
    my ($x) = @_;
    print "\% ERROR: $x\n";
    exit(1);
}

sub mk_command {
    my ($command_file, $command_temp, @val) = @_;
    my @key = ("goal", "system", "system_opts", "system_args");
    copy($command_temp, $command_file) || &error("can not copy $command_temp to $command_file");
    open(OUT, ">>$command_file") || &error("can not open $command_file");
    print OUT "sub init {\n";
    print OUT "\t%env = (\n";
    for (my $i=0; $i < scalar(@key); $i++) {
	next if (! $val[$i]);
	print OUT "\t\t\"$key[$i]\", \"$val[$i]\",\n";
    }
    print OUT "\t)\n";
    print OUT "}\n";
    close(OUT) || &error("can not close $command_file");
}


