#!/usr/local/bin/perl -w
#
# mocpro_level3.pl
# mocness tow data file manipulation routine - level 3
# For version, see $version

# October 17, 1997  rcg
# November 4, 1997.  Change to level 3.  rcg
# November 10, 1997.  Fix code for outputing comments.  rcg
# November 14, 1997 rcg Change output message to say displayed by.
# May 13, 1998 rcg Eliminate warning message when qualifier did not exist
# December 7, 1998. Display date and time correctly for old cruises.

# Looks at all the file $ARGV[2] and outputs level 3 data

# Passed parameters:
#	$ARGV[0] - data type
#	$ARGV[1] - file type
#	$ARGV[2] - data file to process

$version="V1.24/7Dec1998";

#some definitions
#$script_loc="/data/rgroman/ctd_mocness";   # not used
$| = 1;
$i_am_level = 3;
print STDOUT "#Displayed by $0, $version\n";

$fieldnames_level[3]="/data/rgroman/ctd_mocness/fieldnames_level3";
$datafile=$ARGV[2];
print STDOUT "#   Using data file $datafile\n";

# Read fieldnames allowed and save for later use
if ($i_am_level != $#fieldnames_level) {
	print STDOUT ("# At level $i_am_level rather than $#fieldnames_level\n",
		"#\tin routine $0.  Cannot continue.\n");
	exit 0;
}
for ($i=$i_am_level; $i <= $#fieldnames_level; $i++) {
#	print "STDOUT #**debug,  fieldnames_level[$i]=$fieldnames_level[$i]\n";
	open FIELDNAMES, $fieldnames_level[$i] or 
		die "#Could not get field names from $fieldnames_level[$i], $!";
	@fieldnames=<FIELDNAMES>;
	close FIELDNAMES;
	chomp (@fieldnames);
}

# Remove field name attributes if present
for ($i=0; $i <= $#fieldnames; $i=$i+1) {
	if (index ($fieldnames[$i], "#") >= 0 ) {  #comment line, drop out
		$fieldnames[$i]="";
		next;
	}
	$qualifier[$i]=$fieldnames[$i];
	$fieldnames[$i]=~ s/(^.*)\[.*/$1/;
	$qualifier[$i]=~ s/^.*(\[.*)/$1/;
	if ($fieldnames[$i] eq $qualifier[$i]) {$qualifier[$i]="";}
#	print STDOUT ("#**debug, fieldnames[$i]=",$fieldnames[$i], 
#		", qualifier[$i]=",$qualifier[$i], "\n");
}
# Read data file

open MOCDATA, $datafile or
	die "#  Could not open CTD from MOCNESS data file $datafile, $!";
$_=<MOCDATA>;
chomp;
@notuse=();
push @save_for_comments, $_ ;
#print STDOUT " **debug, array save_for_comments=@save_for_comments\n";
#print STDOUT "#**debug, before old/new determination _=$_\n";

if ( m/^\d{1,}.*/ ) {
#	old form found, with one field or value per line
	$format='old';
	$numbfields=$_ - 1;
#	print  STDOUT "# **debug, numbfields=$numbfields\n";
	for ($k=0; $k <= $numbfields; $k++) {
		$fields_in_data[$k] = <MOCDATA>;
		chomp $fields_in_data[$k];
#		print STDOUT ("# **debug, fields_in_data[",
#			$k,"]=$fields_in_data[$k]\n");
	}
	@save_for_comments=();
}
else {
# 	new format with field names and data on per line basis
	$format="new";
	$numbfields=0;
	while ($numbfields == 0) {
		$_=<MOCDATA>;
#		print STDOUT "# **debug, _=$_\n";
		push @save_for_comments, $_;
		unless (defined $_ ) {
			print STDOUT "#Error found in $0\n";
			print STDOUT "#  Reached end of file in $datafile without\n";
			print STDOUT "#  finding list of variables expected.\n";
			print STDOUT ("#",
			"<a href=\"http://globec.whoi.edu/globec-dir",
			"/contact_dmo.html\"",
			">Contact the DMO</a>");	
			exit 0;
		}
		chomp;
		@fields_in_data = split /\s+/, $_ ;
		for ($i=0; $i <= $#fields_in_data; $i++) {
			$fields_in_data[$i] =~ s/ //g;
#			print STDOUT 
#			  "**debug, fields_in_data[$i]=$fields_in_data[$i]\n";
		}
		if ($fields_in_data[0] eq "" ) {shift @fields_in_data; }
		if ($fields_in_data[0] eq "time" ) {
			$numbfields = <MOCDATA> -1;
			if ($numbfields != $#fields_in_data) {
				print STDOUT ("#Error found in $0\n",
					"#  in datafile $datafile\n",
					"#  Number of fields expected was ",
					$numbfields, " but see",
					$#fields_in_data, " instead.\n");
				exit 0;
			}
		}
	}
}

for ($i=0; $i <= $#fields_in_data; $i=$i+1) {
	$fields_in_data[$i] =~ s/\s//g;
#	print STDOUT ("#**debug, redefine variable names, ", 
#		"fields_in_data[$i]=",$fields_in_data[$i], "\n");
	if ( $fields_in_data[$i] eq "time" and $format eq "new") { 
		$fields_in_data[$i] = "yrday_local"; }
	if ( $fields_in_data[$i] eq "time" and $format eq "old") {
		$fields_in_data[$i] = "time_local"; }
	elsif ( $fields_in_data[$i] eq "pres" ) {
		$fields_in_data[$i] = "press"; }
	
	
}

# Output file comments if available (from new format only)
if ($#save_for_comments >= 0 ) {
	pop @save_for_comments;	#Remove line of field names
	foreach $comment (@save_for_comments) {
#		print STDOUT "# **debug, comment=$comment\n";
		print STDOUT ("#",$comment,"\n");
	}
}

# Determine field names that I know about and provide feedback if missing some
NAMES:
for ($i=0; $i <= $#fields_in_data; $i=$i+1) {
	foreach $name (@fieldnames) {
#		print STDOUT 
#		   "#**debug, compare # $i, $name with $fields_in_data[$i]\n";
		next NAMES if $name eq "";
		next NAMES if $name eq $fields_in_data[$i];
	}
	print STDOUT ("#Warning in $0, for file $datafile\n",
		"#  Cannot use field name $fields_in_data[$i]\n",
		"#",
		"<a href=\"http://globec.whoi.edu/globec-dir",
		"/contact_dmo.html\"",
		">Call the DMO</a>\n");
	push @notuse, $i;
}
push @notuse, -1;	#In case all field names are okay

# Output valid field names
SKIP1:
for ($i=0; $i <= $#fields_in_data; $i++) {
	foreach $j (@notuse) {
		if ($j == $i) {next SKIP1; }
		print STDOUT ($fields_in_data[$i]);
		if ( defined $qualifier[$i] ) {print STDOUT ($qualifier[$i]); }
		print STDOUT ("\t");
		last;		#printed out valid field name, end inner loop
	}
}
print STDOUT "\n";

#Read data from file and output
while (<MOCDATA>) {
	chomp;
#	print STDOUT "#**debug, format=$format, next data read=$_\n";
	if ($format eq "old") {
		$data[0]=$_;
		$data[0] =~ s/\s//g;
		$hour = int($data[0]);
		$data[0] = $hour*100 + ($data[0] - $hour)*60.;
		if ($data[0] < 100 ) { $data[0] = "00" . $data[0]; }
		elsif ($data[0] < 1000 ) { $data[0] = "0" . $data[0]; }
#		print STDOUT ("#**debug, hour=$hour, data[0]=$data[0]\n");
		for ($i=1; $i <= $numbfields; $i=$i+1) {
			$data[$i]=<MOCDATA>;
			$data[$i] =~ s/\s//g;
#			print STDOUT "#**debug -old fmt, data[$i]=$data[$i]\n";
		}
	}
	else {		# newformat
		@data = split /\s+/, $_;
		for ($i=0; $i <= $#data; $i=$i+1) {
			$data[$i] =~ s/\s//g;
#			print STDOUT "#**debug -new fmt, data[$i]=$data[$i]\n";
		}
		if ($data[0] eq "" ) {shift @data; }		
	}
	
#	output only valid field values
SKIP2:	for ($i=0; $i <= $#data; $i=$i+1) {
		foreach $j (@notuse) {
			next SKIP2 if $j == $i ;
			print STDOUT "$data[$i]\t";
			last;
		}
	}
	print STDOUT "\n";
}

close MOCDATA;
exit 0;
	

	
	
