#!/usr/bin/perl

$preamble = "<html><body> <p> You are in a maze of twisty little web pages, all alike.\n";
$postamble = "</body></html>\n";

sub load_maze {
    my $fname = shift;
    my (@maze, $x, $y, $i);
    
    open(FD, $fname) || die "Cant open $fname: $!";
    $y = 0;
    while(<FD>) {	
	chomp;
	$x = length unless ($y != 0);
	for($i=0; $i<length; $i++) {
	    $maze[$i][$y] = substr($_, $i, 1);
	}
	$y++;
    }
    close(FD);
    return ($x+1, $y-1, @maze);
}

sub place_start_end {
    my($x, $y, @maze) = @_;

    $maze[1][1] = 'S';
    $maze[$x-2][$y-2] = 'E';
    return @maze;
}

sub genfname {
    my ($x, $y) = @_;
    return sprintf("maze%02d-%02d.html", $x, $y);
}

sub spew_page {
    my($i, $j, $x, $y, @maze) = @_;
    my($oldfd, $fname, $tmp, $c);
    my($a, $b);

    $c = $maze[$i][$j];
    
    if($c eq "S") {
	open(FD, ">index.html") || die "cant write to data file: $!\n";
    } else {
	open(FD, ">".genfname($i, $j)) || die "cant write to data file: $!\n";
    }
    $oldfd = select(FD);

    print $preamble;    

    if($c eq "E") {
	print "you\'ve made it to the end!\n";
	print $postamble;
	close(FD);	
	select($oldfd);
	return;
    }

    print "<p><pre>\n";
    for($a=0; $a<$y; $a++) {
	for($b=0; $b<$x; $b++) {
	    if($b == $i && $a == $j) {
		print "\@";
	    } else {
		print $maze[$b][$a];
	    }
	}
	print "\n";
    }
    print "</pre>\n";    
    
    if($j >= 2 && $maze[$i][$j-1] eq " ") {
	print "<a href=\"".genfname($i, $j-1)."\">[North]</a>\n";
    } else {
	print "[North]\n";
    }

    if($j != $y && $maze[$i][$j] eq " ") {
	print "<a href=\"".genfname($i, $j+1)."\">[South]</a>\n";
    } else {
	print "[South]\n";
    }

    if($i >= 1 && $maze[$i-1][$j] ne "|") {
	print "<a href=\"".genfname($i-1, $j)."\">[West]</a>\n";
    } else {
	print "[West]\n";
    }

    if($i != $x && $maze[$i+1][$j] ne "|") {
	print "<a href=\"".genfname($i+1, $j)."\">[East]</a>\n";
    } else {
	print "[East]\n";
    }

    print $postamble;
    close(FD);

    select($oldfd);
}

sub gen_html {
    my ($x, $y, @maze) = @_;
    my ($i, $j);

    for($i=1; $i<$x; $i++) {
	for($j=1; $j<$y; $j++) {
	    spew_page($i, $j, $x, $y, @maze);
	}
    }
}

#
# main
#

($x, $y, @maze) = load_maze($ARGV[0]);
print "have a $x by $y maze heere. hmm\n";
@maze = place_start_end($x, $y, @maze);
gen_html($x, $y, @maze);

