#!/usr/bin/perl -w
use strict;
use File::Path;
use Getopt::Long;

# header column never has any info...

((my $progname = $0) =~ s/^.*(\/|\\)//ig); # basename $0

# Parse options
my $no_verbose_progress = 0;
my $usage = 0;
GetOptions('quiet' => \$no_verbose_progress, # be quiet
           'help' => \$usage # help!
          );

# Print usage
if ($usage) {
	usage();
}

unless ($ARGV[0]) {
	print STDERR "Specify a CSV file name as the program's argument(e.g. CAVETAB2.CSV)\n";
	usage();
}

open (CSV, "< $ARGV[0]") or print STDERR "That filename could not be opened. Exiting.\n" and die $!;

# Start writing index file
open INDXAL, ">..\/indxal.htm" or die $!;
print INDXAL << "END";
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- *** This file is auto-generated by $progname - edit cavetab2.csv instead -->
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Loser Plateau area : Cave description index</title>
<link rel="stylesheet" type="text/css" href="css/main2.css" />
</head>

<body>

<h1>Kataster Gruppe 1623:<br />Loser Augst-Eck - INDEX</h1>

<p>Note that <a href="1626/index.htm">information on caves in the adjacent area 1626 (Rauher - Sch&ouml;nberg)</a> is to be found elsewhere.</p>

<table border="0" frame="void">
END

<CSV>; # starting to read in csv file, eat header line

# Read in pos file to @pos now rather than later so we don't repeat it n times
open INPUT2, "< all.pos" or print STDERR "Could not find all.pos in the current directory\n" and die $!;
my @pos = <INPUT2>;
close INPUT2;

# Go down a directory
chdir "..";

# While loop which reads in each line of csv file
while (<CSV>) {
	chomp;
	do_this_line($_);
}

# Finish writing index file
print INDXAL << "END";
</table>

<!-- LINKS -->
<hr /><ul>
<li>Back to <a href="../index.htm">CUCC Home page</a></li>
<li>Back to <a href="index.htm">Expedition Intro page</a></li>

<li>
<h3>Main Indices:</h3>
<ul><li><a href="infodx.htm"><b>Index</b> to Expo</a> information pages</li>
<li><a href="areas.htm">Description of CUCC's area</a> and split to subareas</li>
<li>List of (links to) <a href="pubs.htm">published reports and logbooks</a></li></ul>
</li>

<li>
<h3>Pictures:</h3>
<ul><li><a href="gall0.htm">Text only Index</a></li>
<li><a href="gallery/0.htm">Index pages (with thumbnails)</a></li></ul>
</li>

<li>
<h3>Other info:</h3>
<ul><li>Table of <a href="folk/index.htm">members of CUCC expeditions</a> 1976-99</li>
<li><a href="others/index.htm">Other groups</a> who have worked in the area.</li>
<li><a href="1626/index.htm">Adjacent area 1626</a></li></ul>
</li>
</ul>
<!-- /LINKS -->

</body>
</html>
END

close INDXAL;
print "Information: Done\n";

# Process a line of the CSV file
# First argument is contents of line to process
# 2nd arg is the Kataster number of the cave an entrance belongs to (optional)
# 3rd arg is the Other number of the cave an entrance belongs to (optional)
# 4th arg is the basename of the cave an entrance belongs to (optional)
# Returns nothing
sub do_this_line {
	# Split single line into all the fields
	my ($kat_num, $kat_status, $ents, $other_number, $mult_ents, $file, $linkfile, $name, $unofficial_name, $comment, $area, $explorers, $u_description, $equipment, $qmlist, $katstatus, $references, $u_centre_line, $u_drawn_survey, $survex_file, $length, $depth, $extent, $header, $footer, $notes, $ent_name, $tag_punkt, $other_punkt, $desc_other_punkt, $exact_punkt, $fix_type, $gpspresa, $gpspostsa, $northing, $easting, $altitude, $bearings, $map, $location, $approach, $ent_desc, $ent_photo, $marking) = &parse_csv($_[0]);
	my $parents_name;

	# If we have been called to process an entrance, we may have been given the cave's Kataster number or Other number 
	if ($_[1] and ! $kat_num) {
		$kat_num = $_[1];
	}
	if ($_[2] and ! $other_number) {
		$other_number = $_[2];
	}
	if ($_[3]) {
		$parents_name = $_[3];
	}

	# Generate $linkid which will be kataster no., or other no. if no kataster no. present. Per HTML4 (and XHTML etc.) ID and NAME tokens must begin with alpha characters - hence "id" prepend
	my $linkid = "id$kat_num";
	my $other_number_no_brackets = $other_number;
	if ($kat_num and $other_number) {
		$other_number = "($other_number)"; # wrap it in brackets, so it doesn't appear to be official
	} elsif ($other_number and ! $kat_num) {
		$linkid = "id$other_number";
	}
	# Under XHTML 1.0, link ids must not have '(', '?', ' ', or '/'
	$linkid =~ s/\//-/g;
	$linkid =~ s/\?/q/;
	$linkid =~ s/\(/:/;
	$linkid =~ s/\)/:/;
	$linkid =~ s/ /_/;
	$linkid = lc($linkid);

	# Determine the number of directorys deep the cave's main page is, in order to link to area descriptions and indxal
	my $toroot = 'Q'; # hey; it's magic
	my $counter = ($file =~ tr/\///);
	while ($counter) {
		$toroot = join('', $toroot, "/..");
		$counter--;
	}
	$toroot =~ s/Q\///;

	# If it's not an entrance, and it's not in 1626, insert it in the index file
	if ($mult_ents !~ /entrance/ && $area ne 1626) {
		my $e = $ents;
		$e =~ s/ +/&nbsp;/g;
		print INDXAL "<tr><td><a name=\"$linkid\">$kat_num $other_number";
		if ($e) {
			print INDXAL "<small> - $e</small>";
		}
		print INDXAL "</a></td><td>";
		if ($file) {
			print INDXAL "<a href=\"$file\">";
		} elsif ($linkfile) {
			print INDXAL "<a href=\"$linkfile\">";
		}
		if ($name) {
			print INDXAL $name;
		} else {
			print INDXAL "?";
		}
		if ($unofficial_name) {
			print INDXAL " ($unofficial_name)";
		}
		if ($file or $linkfile) {
			print INDXAL "</a>";
		}
		if ($comment) {
			print INDXAL " - $comment";
		}
		print INDXAL "</td></tr>\n";
	}

	# If the cave does not have a filename allocated, but does have multiple entrances, keep going through the CSV file until we are at the last entrance, before we return
	unless ($file) { # this IS necessary
		if ($mult_ents eq "yes") {
			my $e_mult_ents;
			do {
				my $e = <CSV>;
				chomp;
				my (undef, undef, undef, undef, $emult_ents) = &parse_csv($e);
				$e_mult_ents = $emult_ents;
			} while ($e_mult_ents ne "last entrance");
		}
		return;
	}

	# If command line option is set, then be quiet
	unless ($no_verbose_progress) {
		print "Progress: $file\n";
	}

	# Make the directory that the file is in, in case it doesn't exist yet
	my $fn = $file;
	$fn =~ s/^.*\///g;
	my $path = $file;
	$path =~ s/\/$fn//g;
	mkpath($path);

	# Open the file and start writing to it
	open FILE, "> $file" or die $!;
	print FILE << "END";
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- *** This file is auto-generated by $progname - edit cavetab2.csv instead -->
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" type="text/css" href="$toroot/css/main2.css" />
END

	if ($kat_num) {
		if ($area ne 1626) {
			print FILE "<title>1623:$kat_num";
		} else {
			print FILE "<title>1626:$kat_num";
		}
	} else {
		print FILE "<title>$other_number";
	}

	print FILE << "END";
</title>
</head>

<body>

END

	if ($header) {
		print FILE "$header\n\n";
	}

	print FILE "<table id=\"cavepage\">\n";
	print FILE "<tr><th id=\"kat_no\">";
	if ($kat_num) {
		print FILE "$kat_num";
	}
	if ($ents) {
		print FILE " - $ents";
	}
	if ($other_number) {
		if ($kat_num) {
			print FILE "<br />";
		}
		print FILE " $other_number";
	}
	print FILE "</th><th id=\"name\">$name";
	if ($unofficial_name) {
		if ($name) {
			print FILE "<br />";
		}
		print FILE " ($unofficial_name)";
	}
	print FILE "</th>";
	if ($kat_status) {
		print FILE "<th id=\"status\">$kat_status</th>";
	}
	print FILE "</tr>\n</table>";

	if ($length or $depth or $extent) {
		print FILE "\n\n<p>";
	}
	if ($length) {
		print FILE "<b>Length:</b> $length ";
	} 
	if ($depth) {
		print FILE "<b>Depth:</b> $depth ";
	} 
	if ($extent) {
		print FILE "<b>Extent:</b> $extent ";
	} 
	if ($length or $depth or $extent) {
		print FILE "</p>";
	}

	# Entrance specific bit

	unless ($mult_ents eq "yes") {
		# If there is only one entrance,
		print FILE "\n\n<p>";
		if ($tag_punkt || $other_punkt || $exact_punkt || $gpspostsa || $gpspresa || $easting || $northing || $altitude || $fix_type || $desc_other_punkt && !$ent_name) { # basically, if do_ent is going to do anything, print "Entrance:"
			print FILE "<b>Entrance: </b>";
		}
		# Process the location data for the entrance
		do_ent($tag_punkt,$other_punkt,$exact_punkt,$gpspostsa,$gpspresa,$easting,$northing,$altitude,$ent_name,$fix_type,$desc_other_punkt);
		print FILE "</p>"
	} else { 
		# If there are multiple entrances
		multi_ents($file, $kat_num, $other_number, $other_number_no_brackets, $toroot);
	}

	# Cave general bit
	if ($location) {
		print FILE "\n\n<p><b>Location:</b> $location</p>";
	}	
	if ($bearings) {
		print FILE "\n\n<p><b>Bearings:</b> $bearings</p>";
	}
	if ($approach) {
		print FILE "\n\n<p><b>Approach:</b> $approach</p>";
	}
	if ($map) {
		print FILE "\n\n<p><b>Map:</b> $map</p>";
	}
	if ($ent_desc) {
		print FILE "\n\n<p><b>Entrance Description:</b> $ent_desc</p>";
	}
	if ($ent_photo) {
		print FILE "\n\n<p><b>Entrance Photo:</b> $ent_photo</p>";
	}
	if ($marking and $marking ne "\r" and $marking ne "\r\n" and $marking ne "\n") { # bodgelicious.
		print FILE "\n\n<p><b>Marking:</b> $marking</p>";
	}
	if ($references) {
		print FILE "\n\n<p><b>References:</b> $references</p>";
	}
	if ($u_description) {
		print FILE "\n\n<p><b>Underground Description:</b> $u_description</p>";
	}
	if ($equipment) {
		print FILE "\n\n<p><b>Equipment:</b> $equipment</p>";
	}
	if ($qmlist) {
		print FILE "\n\n<p><b>QM list:</b> $qmlist</p>";
	}
	if ($u_drawn_survey) {
		print FILE "\n\n<p><b>Survey:</b> $u_drawn_survey</p>";
	}
	if ($notes) {
		print FILE "\n\n<p><b>Notes:</b> $notes</p>";
	}
	if ($explorers) {
		print FILE "\n\n<p><b>Explorers:</b> $explorers</p>";
	}
	if ($katstatus) {
		print FILE "\n\n<p><b>Kataster Status:</b> $katstatus</p>";
	}
	if ($u_centre_line) {
		print FILE "\n\n<p><b>Centre Line:</b> $u_centre_line</p>";
	}
	if ($survex_file) {
		print FILE "\n\n<p><b>Survex file:</b> $survex_file</p>";
	}

	if ($footer) {
		print FILE "\n\n<p>$footer</p>";
	}

	print FILE "\n\n<!-- LINKS -->\n<hr /><ul>\n";

	if ($mult_ents =~ /entrance/) {
		print FILE "<li><a href=\"javascript:history.back(1)\">Go Back (Javascript)</a></li>\n"; # ACCK! ACCK! Evil JavaScript! - this HAS to be done, for things like 78a, where the reader could have got there either via 78 OR 40 (and we have NO way of knowing
		print FILE "<li><a href=\"$parents_name\">Go up to overall cave description for this entrance</a></li>\n";
	}
	# Find the area the cave is in, and add appropriate links
	if ($area =~ /(1a|1b|1c|1d)/) {
		print FILE "<li><a href=\"$toroot\/plateau\/index.htm#$linkid\">Plateau area index and description</a></li>\n";
	}
	if ($area =~ /(2a|2b)/) {
		print FILE "<li><a href=\"$toroot\/smkridge\/index.htm#$linkid\">Schwarzmooskogel ridge area index and description</a></li>\n";
	}
	if ($area =~ /3/) {
		print FILE "<li><a href=\"$toroot\/br-alm\/index.htm#$linkid\">Br&auml;uning Alm area index and description</a></li>\n";
	}
	if ($area =~ /4/) {
		print FILE "<li><a href=\"$toroot\/kratzer\/index.htm#$linkid\">Kratzer valley index and description</a></li>\n";
	}
	if ($area =~ /5/) {
		print FILE "<li><a href=\"$toroot\/wilden\/index.htm#$linkid\">Schwarzmoos-Wildensee area index and description</a></li>\n";
	}
	if ($area =~ /^6$/) {
		print FILE "<li><a href=\"$toroot\/remote\/index.htm#$linkid\">Far plateau area index and description</a></li>\n";
		print FILE "<li><a href=\"$toroot\/1626\/index.htm\">Adjacent area 1626</a></li>\n";
	}
	if ($area =~ /7/) {
		print FILE "<li><a href=\"$toroot\/egglgrub\/index.htm#$linkid\">Egglgrube area index and description</a></li>\n";
	}
	if ($area =~ /(8a|8b|8c|8d)/) {
		print FILE "<li><a href=\"$toroot\/loser\/index.htm#$linkid\">Loser/Augst See area index and description</a></li>\n";
	}
	if ($area =~ /9/) {
		print FILE "<li><a href=\"$toroot\/gschwand\/index.htm#$linkid\">Gschwandt area index and description</a></li>\n";
	}
	if ($area =~ /10/) {
		print FILE "<li><a href=\"$toroot\/aaussee\/index.htm#$linkid\">N & NE shore of Altauseer See</a></li>\n";
	}
	if ($area =~ /11/) {
		print FILE "<li><a href=\"$toroot\/augstb\/index.htm#$linkid\">Augstbach area index and description</a></li>\n";
	}
	if ($area =~ /1626/) {
		print FILE "<li><a href=\"$toroot\/1626\/index.htm#$linkid\">1626 (Rauher - Sch&ouml;nberg) area index and description</a></li>\n";
	}

	# Finish writing to file

	if ($area =~ /1626/) {
		print FILE "<li><a href=\"$toroot\/indxal.htm\">Full Index to area 1623</a></li>";
	}
	else {
		print FILE "<li><a href=\"$toroot\/indxal.htm#$linkid\">Full Index</a></li>";
	}

	print FILE << "END";
<li><a href="$toroot/areas.htm">Other Areas</a></li>
<li><a href="$toroot/index.htm">Back to Expedition Intro page</a></li>
</ul>
<!-- /LINKS -->

</body>
</html>
END

	close FILE;
}

# Parse a line of CSV data
# Argument is the line of data to be processed
# Returns array of the separated variables
sub parse_csv {
	my $line = $_[0];
	my @parsedline = ();
	my $field = '';

	while ($line =~ m{ \G(?:^|,)
			(?: "((?> [^"]*) (?> "" [^"]*)*)" | ([^",]*)) }gx) {
		if ($2) {
			$field = $2;
		} elsif ($1) {
			$field = $1;
			$field =~ s/""/"/g;
		} else {
			$field = '';
		}

		push(@parsedline, $field);
	}

	return(@parsedline);
}

# Process the location data for the entrance
# Returns nothing
sub do_ent {
	my $punkt;
	my $calc_easting;
	my $calc_northing;
	my $calc_altitude;
	my $desc;
	my $tag_punkt = $_[0];
	my $other_punkt = $_[1];
	my $exact_punkt = $_[2];
	my $gpspostsa = $_[3];
	my $gpspresa = $_[4];
	my $easting = $_[5];
	my $northing = $_[6];
	my $altitude = $_[7];
	my $ent_name = $_[8];
	my $fix_type = $_[9];
	my $desc_other_punkt = $_[10];

	# Write out info for entrance
	if ($ent_name) {
		print FILE "<b>Entrance Name:</b> $ent_name ";
	} 
	if ($altitude) {
		print FILE "<b>Recorded Alt:</b> $altitude ";
	} 
	if ($northing) {
		print FILE "<b>Recorded as N</b>$northing ";
	} 
	if ($easting) {
		print FILE "<b>Recorded as E</b>$easting ";
	} 
	if ($fix_type) {
		print FILE "<b>Fix type:</b> $fix_type ";
	}
	if ($tag_punkt) {
		print FILE "<b>Tag point:</b> $tag_punkt ";
	}
	if ($other_punkt) {
		print FILE "<b>Point:</b> $other_punkt ";
		if ($desc_other_punkt) {
			print FILE "<b>Point description:</b> $desc_other_punkt ";
		} else {
			print FILE "<b>Point description:</b> none ";
		}	
	}
	if ($exact_punkt) {
		print FILE "<b>Exact entrance:</b> $exact_punkt ";
	}
	if ($gpspresa) {
		print FILE "<b>GPS pre sa:</b> $gpspresa ";
	} 
	if ($gpspostsa) {
		print FILE "<b>GPS post sa:</b> $gpspostsa ";
	}

	# Decide which punkt to lookup
	if ($tag_punkt) {
		$punkt=$tag_punkt;
		$desc = "tag point";
	} elsif ($other_punkt) {
		$punkt = $other_punkt;
		$desc = "point";
	} elsif ($exact_punkt) {
		$punkt = $exact_punkt;
		$desc = "exact point";
	} elsif ($gpspostsa) {
		$punkt = $gpspostsa;
		$desc = "GPS (pre SA)";
	} elsif ($gpspresa) {
		$punkt = $gpspresa;
		$desc = "GPS (post SA)";
	}

	# Find the position of that punkt
	if ($punkt) {
		for my $surveypoint (@pos) {
			if ($surveypoint =~ m/\( *([0-9\.\-]*), *([0-9\.\-]*), *([0-9\.\-]*) \) $punkt(\r\n|\n|\r)/){
				$calc_easting=$1;
				$calc_northing=$2;
				$calc_altitude=$3;
			}
		}
		if ($calc_easting) {
			print FILE "<br />\nLookup values for $desc data: ";
			print FILE "<b>Alt:</b> $calc_altitude ";
			print FILE "<b>N</b>$calc_northing ";
			print FILE "<b>E</b>$calc_easting ";
		} else
		{ print STDERR "Warning: Lookup point for $desc data not found: $punkt\n"; }
	}
}

# Handle multiple entrances
# 1st arg is the file name of the cave to which the entrance belongs
# 2nd arg is the Kataster number of the cave
# 3rd arg is the Other number of the cave (which may have been put in brackets)
# 4th arg is the Other number of the cave without any brackets
# 5th arg is the path to return to the root from the cave
sub multi_ents {
	my $file = $_[0];
	my $kat_num = $_[1];
	my $other_number = $_[2];
	my $other_number_no_brackets = $_[3];
	my $toroot = $_[4];

	print FILE "\n\n<p><b>Entrances:</b></p>\n\n<ul>";
	my $e_mult_ents;

	# Process each entrance
	do {
		my $e = <CSV>;
		chomp;

		my ($ekat_num, undef, $eents, $eother_number, $emult_ents, $efile, $elinkfile, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef, $eent_name, $etag_punkt, $eother_punkt, $edesc_other_punkt, $eexact_punkt, $efix_type, $egpspresa, $egpspostsa, $enorthing, $eeasting, $ealtitude) = &parse_csv($e);

		if ($eother_number) {
			$eother_number = "($eother_number)"; # wrap it in brackets, so it doesn't appear to be official
		}

		print FILE "\n<li>";

		if ($elinkfile) { # this is a link to another cave - add link to entrance into cave file but don't generate another file for the entrance
			print FILE "<a href=\"$toroot\/$elinkfile\">$eents $eother_number</a> ";
			do_this_line($e, $kat_num, $other_number_no_brackets);
		} elsif ($efile) { # call ourselves recursively to create a file for the entrance 
			print FILE "<a href=\"$toroot\/$efile\">$eents $eother_number</a> ";
			close FILE; # perl filehandles are not recursively safe (when hacking at 4 in the morning). thus do this.
	 
			do_this_line($e, $kat_num, $other_number_no_brackets, (($_ = $file) =~ s/^.*(\/|\\)//ig) && $_);
			open FILE, ">> $file" or die $!;
		} else { # no entrance file needed, and no link to another cave
			print FILE "$eents $eother_number";
		}

		# Process the location data for the entrance
		do_ent($etag_punkt,$eother_punkt,$eexact_punkt,$egpspostsa,$egpspresa,$eeasting,$enorthing,$ealtitude,$eent_name,$efix_type,$edesc_other_punkt);
		print FILE "</li>";
		$e_mult_ents = $emult_ents;
	} while ($e_mult_ents ne "last entrance");

	print FILE "\n</ul>";
}

# Usage
sub usage {
	print << "EOF";
USAGE: $progname [-options] <CSV file>
    -q, --quiet         Be quiet about progress
    -h, --help          Show this message
EOF
    exit(0);
}
