#!/usr/bin/perl
#

use strict;

my $path = shift @ARGV;

unless (-d $path) {
    usage();
}

chdir $path;

unless (-e "worldinfo.dat") {
    print "No worldinfo.dat found in $path\n";
    exit;
}

my $cat;
my %pred;
my %obj;

open (W, "worldinfo.dat");
while (<W>)
{
    s/;.*//;
    s/\#.*//;

    if (/^(\w+):$/) {
	$cat = $1;
	next;
    }

    if ($cat eq "INIT") {
	s/^\s+//;
	s/\s+$//;
	next if (/^$/);
	$pred{$_} = 1;
	next;
    }

    s/\s+//g;
    next if (/^$/);

    s/^(\w+)//;
    my $obj = $1;

    $obj{$obj} = 1;
    $pred{"$cat $obj"} = 1;

    my $extra = $_;
    if ($extra =~ s/\[(.+?)\]//) {
	foreach (split(/,/,$1)) {
	    s/\?/$obj/g;
	    s/\=/ /g;
	    if (/ /) {
		my @words = split(/\s+/);
		shift @words;
		foreach my $word (@words) { $obj{$word} = 1; }
		$pred{$_} = 1;
	    } else {
		$pred{"$_ $obj"} = 1;
	    }
	}
    }

    if ($cat eq "place") {
	unless ($pred{"closed $obj"}) {
	    $pred{"open $obj"} = 1;
	}
	if ($extra =~ s/\((.+?)\)//) {
	    foreach (split(/,/,$1)) {
		$obj{$_} = 1;
		$pred{"at $_ $obj"} = 1;
	    }
	}

	my $undirected = 0;
	if ($extra =~ s/^\<//) {
	    $undirected = 1;
	}
	if ($extra =~ /-\>(.+)/) {
	    my $places = $1;
	    foreach my $opos (split(/,/,$places)) {
		$obj{$opos} = 1;
		$pred{"conn $obj $opos"} = 1;
		if ($undirected) {
		    $pred{"conn $opos $obj"} = 1;
		}
		
	    }
	}
    }

}
close W;

my %block;
foreach (sort keys %pred) {
    $block{'init'} .= "($_)\n";
}
foreach (sort keys %obj) {
    $block{'objects'} .= "$_\n";
}

my @files = glob("*.template");
foreach my $f (@files)
{
    my $outf = $f;
    $outf =~ s/\.template$/.pddl/;
    print "$f -> $outf\n";
    open (F, $f);
    open (O, ">$outf");
    while (<F>) {
	if (/^(\s*).*<!--autogen:(\w+?)-->/) {
	    my $ws = $1;
	    $_ = "\n;; DON'T EDIT.  auto-generated from worldinfo.dat\n"
		. $block{$2} . 
		    ";; End auto-generated section.\n";
	    s/\n/\n$ws/g;
	}
	print O $_;
    }
    close O;
    close F;
}


print "done.\n";

sub usage
{
    print "$0 <directory>\n";
    exit;
}
