#!/usr/bin/perl -w

###################################################################################################
#	PULSASJON.CGI
#	Mottar data fra pulsasjon_page.cgi, dvs. magnetometer_page.cgi søker opp all pulsasjondata i 
#	aktuell periode ( avhengig av brukervalg i sensor_form.cgi ) fra db:hessdalen.magnetometer_pulsasjon
#	for så å sende disse dataene til pulsasjon_page.cgi som så sender de videre hit. 
#	Basert på disse dataene ( starttid for puls ) hentes tilsvarende data fra 
#	db:hessdalen.pulsasjon_variasjon ( pulsasjonsdataene ) og plottes i en graf. 
#
###################################################################################################

use strict;
use CGI ":standard";
use GD::Text;
use GD;
use GD::Graph::lines;
use Pg;
use Time::ParseDate;

my @legends;
my @data;
my $title;
my $y_label;
my $x_label;
my $x_label_skip;
my $x_label_vertical;
my $correct_width;


#REGULÆRT UTTRYKK FOR Å DELE OPP STRENGEN MOTTAT FRA MAGNETOMETER_PAGE.CGI
my $puls_periode = url_param('puls_periode');	


my ($month, $day,  $year,  $hour, $min, $sec ) = $puls_periode =~ /(\d*).(\d*).(\d*)-(\d*):(\d*):(\d*)/;

if(!(url_param('puls_periode') eq '')){
	#year, month, day, minuts, sek
	if(defined(&get_data( $year, $month, $day, $hour, $min, $sec ))) {
		&drawGraph();		
	} else {
		&error(10,10, "There are no data registred in the database for this period.", "Try again...");
	}
}else{
	&error(10,10, "There are no data for this length", "Try again");
}




#############################
#
#		SUBRUTINER
#
#############################


sub error{
		my ($x, $y, $error_message, $error_message2 ) = @_;
		#Dersom det ikke er oppgitt noen ønkset min, maks eller middle 
		#lages et enkelt bilde med feilmelding i.
		my $im = new GD::Image(600,400);
		#Farger
		my $bakgrunn 	= $im->colorAllocate(232,	246,	250);
		my $white		 	= $im->colorAllocate(255,	255,	255);
		my $black 		= $im->colorAllocate(0,		0,		0);
		$im->filledRectangle(1,1,599,399,$bakgrunn);
		
		#Plasserer feilmelding i bildet.
		$im->string(gdMediumBoldFont,$x,$y,$error_message, $black);
		$im->string(gdMediumBoldFont,10,$y+14,$error_message2, $black);
		
		print("Content-type: image/png\n\n");
		print $im->png;
		exit;
}

#############################
#HENTE-DATA
#############################
sub get_data {
	#Mottatte data
	my ($year, $month, $day, $hour, $min, $sec) = @_;
	  
	#Oppkobling til database
	my $dbconn = Pg::connectdb("dbname=hessdalen");
	($dbconn->status == PGRES_CONNECTION_BAD) && return undef;

	my $res = $dbconn->exec("
		SELECT start_aar, start_maaned, start_dag, start_time, start_minutt, start_sekund, sekund_teller,
		peak_to_peak_x, peak_to_peak_y, peak_to_peak_z
		FROM pulsasjon_variasjon
		WHERE start_aar=$year AND start_maaned=$month AND start_dag=$day 
		AND start_time=$hour AND start_minutt=$min AND start_sekund=$sec
		ORDER BY sekund_teller"
	);
	
	if ( ($res->resultStatus != PGRES_TUPLES_OK) || ($res->ntuples == 0) ){
		return undef;
	}
	
	print STDERR $res->ntuples . "\n";
	my $antall = $res->ntuples;
	$title		= sprintf ( "Pulsation start: %02d.%02d.%d - %02d:%02d:%02d" , $month, $day, $year, $hour, $min, $sec);
	$x_label	= "Time - [ s - Seconds after pulsation start ]";
	$y_label	= "NanoTesla [ nT ]";

	($antall >	50 ) && ($x_label_skip = 5);
	($antall > 100 ) && ($x_label_skip = 10);
	($antall > 200 ) && ($x_label_skip = 20);
	($antall > 300 ) && ($x_label_skip = 30);
	($antall > 400 ) && ($x_label_skip = 60);
	($antall > 500 ) && ($x_label_skip = 50);
	($antall > 600 ) && ($x_label_skip = 60);

	$x_label_vertical = 1;	
	$correct_width= 0;	

	my @xvalues = ();
	my @peak_x  = ();
	my @peak_y  = ();
	my @peak_z  = ();
	my $x_flag = 0;
	my $y_flag = 0;
	my $z_flag = 0;

	for (my $tup=0, my $i=0; $i<$antall; $i++){
		if($tup < $res->ntuples && 
			$res->getvalue($tup, 0) ne ""  &&
			$res->getvalue($tup, 1) ne ""  && 
			$res->getvalue($tup, 2) ne ""  &&
			$res->getvalue($tup, 3) ne ""  && 
			$res->getvalue($tup, 4) ne ""  && 
			$res->getvalue($tup, 5) ne "" ) {	

			#print STDERR $tup . "\n";
			push @xvalues, sprintf("%2.1f s", $res->getvalue($tup,6) / 10 );			
			#push @xvalues, sprintf("%02d.%02d.%d - %02d:%02d:%003d", 
			#												$res->getvalue($tup,1),
			#												$res->getvalue($tup,2),
			#												$res->getvalue($tup,0),
			#												$res->getvalue($tup,3),
			#												$res->getvalue($tup,4),
			#												$res->getvalue($tup,6) );

			if ( $res->getvalue($tup,7) eq "" ){ 
				push @peak_x, undef;
			}else{
				push @peak_x, $res->getvalue($tup, 7);
				$x_flag = 1;
			}
			if ( $res->getvalue($tup,8) ne "" ){
				push @peak_y, $res->getvalue($tup, 8);
				$y_flag = 1;
			}else{
				push @peak_y, undef;
			}
			if ( $res->getvalue($tup,9) ne "" ) {
				push @peak_z, $res->getvalue($tup, 9);
				$z_flag = 1;
			}else{
				push @peak_z, undef;
			}
																
			$tup++;									
		} else {
			push @xvalues, undef;
			push @peak_x,  undef;
			push @peak_y,  undef;
			push @peak_z,  undef;
		
		}
	}
	
		push @data, [@xvalues];
		($x_flag == 1 ) && (push @data, [@peak_x]);
		($y_flag == 1 ) && (push @data, [@peak_y]);
		($z_flag == 1 ) && (push @data, [@peak_z]);

		($x_flag == 1 ) && (push @legends, 'pp X');
		($y_flag == 1 ) && (push @legends, 'pp Y');
		($z_flag == 1 ) && (push @legends, 'pp Z');
	
	return 1;
}


#############################
#SELVE FIGURTEGINGEN
#############################
sub drawGraph{
	
	#Oppretter ny figur - graf bestående av linjer.
	my $graph = GD::Graph::lines->new(600,400);
	
	#Farger og font.
	$graph->set_text_clr('#000000');
	$graph->set_title_font('../font/courbd.ttf',14);
	#$graph->set_x_label_font('../font/courbd.ttf',10);
	#$graph->set_y_label_font('../font/courbd.ttf',10);
	$graph->set_legend_font('../font/courbd.ttf',8);
	
	#"Fargesammensetning" for de forskjellige grafene som vises i samme figur - basert på den globale 
	#tabellen @legends.
	$graph->set_legend(@legends);

	#Oppsett av grafen - hvordan den ser ut.
	$graph->set(
		labelclr					=>	'black',
		textclr						=>	'black',
		title							=>	$title,
		transparent				=>	0,
		interlaced				=>	0,
		fgclr							=>	'#4395a5',
		bgclr							=>	'#e8f6fa',
		boxclr						=>	'#e8f6fa',
		borderclrs				=>	'undef',
		t_margin					=>	10,
		r_margin					=>	10,
		l_margin					=>	10,
		b_margin					=>	0,
		tick_length				=>	4,
		long_ticks				=>	1, 
		zero_axis					=>  0, 
		zero_axis_only		=>	0, 
		box_axis					=>	0,
		axis_space				=>	4,
		line_width				=>	2,
		line_types				=>	[1,1,1,1],
	
		x_label_position 	=>	1,
		x_label						=>	$x_label,
		x_label_skip			=>	$x_label_skip,	
		x_all_ticks				=> 	0,
		x_tick_offset			=>  0,
		correct_width			=>	$correct_width,
		x_plot_values			=>	1, 
		x_labels_vertical	=>	$x_label_vertical,
	
		y_label_position	=>	1,
		y_label						=>	$y_label,
		y_tick_number			=>	10,
		y_label_skip			=>	0,
		overwrite					=>	0
	);
	
	#Plotter graf med datasettet @data - inneholder data for enten day_data(), week_data(), month_data()
	#eller year_data() 	
	my $gd = $graph->plot(\@data);
	
	print("Content-type: image/png\n\n");
	print $gd->png;

}
