#!/usr/bin/perl -w

use strict;

use Astro::Coord::ECI;
use Astro::Coord::ECI::TLE;
use Astro::Time;
use Getopt::Long;

my $dur = 2; # hour
my $step = 10; # seconds
my $start = undef;
my $yyear = undef;
my $end = undef;

my $el_limit = deg2rad(15);

GetOptions('duration=f'=>\$dur, 'step=i'=>\$step, 'year=i'=>\$yyear,
	   'start=s'=>\$start, 'end=s'=>\$end);

my $mjd = now2mjd();
my ($dayno, $year, $ut) = mjd2dayno($mjd);
$year = $yyear if defined ($yyear);

if (defined $start) {
  if ($start =~ /^(\d+)\/(\d+:\d+(:\d+(.\d*)?)?)$/) {
    print "Matched $start as dayno/time\n";
    $mjd = dayno2mjd($1, $year, str2turn($2,'H'));
  } elsif ($start =~ /^(\d+)\/(\d+)\/(\d+:\d+(:\d+(.\d*)?)?)$/) {
    print "Matched $start as dd/mm/time\n";
    $mjd = cal2mjd($1, $2, $year, str2turn($3,'H'));
  } elsif ($start =~ /^\d+:\d+(:\d+(.\d*)?)?$/) {
    print "Matched $start as time\n";
    $mjd = dayno2mjd($dayno, $year, str2turn($start,'H'));
  } elsif ($start =~ /^(\d+)$/) {
    print "Matched $start as dayno\n";
    $mjd = dayno2mjd($1, $year, $ut);
  } else {
    die "Could not parse start time $start\n";
  }
}


my $endmjd;
if (defined $end) {
  if ($end =~ /^(\d+)\/(\d+:\d+(:\d+(.\d*)?)?)$/) {
    print "Matched $end as dayno/time\n";
    $endmjd = dayno2mjd($1, $year, str2turn($2,'H'));
  } elsif ($end =~ /^(\d+)\/(\d+)\/(\d+:\d+(:\d+(.\d*)?)?)$/) {
    print "Matched $end as dd/mm/time\n";
    $endmjd = cal2mjd($1, $2, $year, str2turn($3,'H'));
  } elsif ($end =~ /^\d+:\d+(:\d+(.\d*)?)?$/) {
    print "Matched $end as time\n";
    $endmjd = dayno2mjd($dayno, $year, str2turn($end,'H'));
    $endmjd += 1 if ($endmjd<$mjd);
  } elsif ($end =~ /^(\d+)$/) {
    print "Matched $end as dayno\n";
    $endmjd = dayno2mjd($1, $year, $ut);
  } else {
    die "Could not parse start time $end\n";
  }
} else {
  $endmjd = $mjd + $dur/24;
}



my $AK07_LONG =  deg2rad(-26.69021);
my $AK07_LAT  =  deg2rad(116.63715);
my $AK07_ELEV =  355/1000.0;

my @tle = <>;

my $loc = Astro::Coord::ECI->new(name => 'AK07')
  ->geodetic($AK07_LONG, $AK07_LAT, $AK07_ELEV);

my ($tle) = Astro::Coord::ECI::TLE->parse({station => $loc}, @tle);

$Astro::Time::StrSep = ' ';
$Astro::Time::StrZero = 2;
my $count = 0;
for (my $time=$mjd; $time<$endmjd; $time+=$step/60/60/24) {
  if ($count>=500) {
    printf STDERR "Truncating output to 500 elements\n";
    last;
  }

  $tle->universal(mjd2epoch($time));

  my ($azimuth, $elevation, $range) = $tle->azel();
  
  my ($day, $month, $year, $ut) = mjd2cal($time);
  my $str = turn2str($ut,'H',0);

  if ($elevation>$el_limit) {
    printf("%04d %02d %02d   %s   %9.3f %9.3f 0\n", $year, $month, $day, $str, 
	   rad2deg($azimuth), rad2deg($elevation));
    $count++;
  }
}
