#!/usr/bin/perl -w

use CGI;
use Template;
use Time::Piece;
use strict;
use warnings;

my @templates = qw(.);
my $seesat5   = "./seesat5";
# downloaded from http://celestrak.com/NORAD/elements/gps-ops.txt
my $tle_file  = "gps-ops.txt";

###########################
my $cmd;

sub get_gps_visibility {
    my ($lat, $lon, $future, $tz, $mask) = @_;

    $cmd =  "$seesat5 lat $lat lon $lon open $tle_file zone $tz " .
	"today +$future 0000 stop 2345 step 15 runall exit";
    # print $cmd, "\n";
    # system $cmd;
    open SEESAT, "$cmd|" or die "Can't pipe to $seesat5: $!\n";

    my ($prn, %hour);
    while (<SEESAT>) {
	# print "seesat5: $_\n";
	if ( /\(PRN (\d+)\)/o ) {
	    $prn = $1;
	} 
	elsif ( /^\+(\d\d\d\d):\d\d\s+(\d+)\s+(\d+)/ ) {
	    if ($prn) {
		my ($time, $azi, $elev) = ($1, $2, $3);
		push @{$hour{$time}}, [$prn, $azi, $elev] if $elev > $mask;
	    } 
	    else {
		warn "Weird parse error from $seesat5";
	    }
	}
    }

    return %hour;
}

my $q   = CGI->new;
my %var = $q->Vars;
my $tt  = Template->new({ INCLUDE_PATH  => \@templates, });
my $now   = gmtime;
my $date  = eval { 
    Time::Piece->strptime( $var{date} || $now->ymd("/"), "%Y/%m/%d" ) };
my $day  = int(($date - $now) / 86400);

$var{$_} =~ y#-.[0-9]/##cd for grep($var{$_}, qw( lat lon date horizon tz ));

my $tz   = sprintf("%+03d%02d", int($var{tz} / 60), $var{tz} % 60 );
my $lat  = sprintf("%.3f", $var{lat});
my $lon  = sprintf("%.3f", $var{lon});

# print $q->header("text/plain");

my %hour  =  get_gps_visibility( $lat, $lon, $day, $tz, $var{horizon} );

print $q->header;
print "<!-- $cmd -->\n";
# print "now = $now\n";
# print $q->query_string, "\n";
# print "$var{lat}, $var{lon}, $day, $tz, $var{mask}";
# print "$_ " for keys %hour;
$tt->process( "result.tt2", {
    lat	    => $lat,
    lon	    => $lon,
    date    => $date, 
    tz	    => $tz, 
    hours   => \%hour } )
    || die $tt->error;

