#!/usr/bin/perl

use Date::Calc ':all';

my @ARG;
if (@ARGV) {
  if ($ARGV[0] =~ /^(\d{4})-?(\d{2})-?(\d{2})$/) {
    @ARG = ($1, $2, $3);
  } else {
    my $d = time() + shift() * 86400;
    my @d = localtime $d;
    @ARG = ($d[5] + 1900, $d[4] + 1, $d[3]);
  }
} else {
  @ARG = Today();
}
my $bday_18 = 6574;             # days to 18th birthday

my $dda = Delta_Days(2008,3,30, @ARG);
print "Today Lila is $dda days old.\n";
my ($dY, $dM, $dD) = my_Delta_YMD(2008,3,30, @ARG);
my $years =  $dY == 1 ? "year"  : "years" ;
my $months = $dM == 1 ? "month" : "months";
my $days =   $dD == 1 ? "day"   : "days"  ;
my $frac = y2d($dda);
print "  That's $dY $years, $dM $months, and $dD $days ($frac years).\n";
my $pct = 100 * $dda/$bday_18;
printf "  You are %.2f%% done.\n", $pct;

my $dd = Delta_Days(2004,6,14, @ARG);
print "Today Iris is $dd days old.\n";
my ($dY, $dM, $dD) = my_Delta_YMD(2004,6,14, @ARG);
my $years =  $dY == 1 ? "year"  : "years" ;
my $months = $dM == 1 ? "month" : "months";
my $days =   $dD == 1 ? "day"   : "days"  ;
my $frac = y2d($dd);
print "  That's $dY $years, $dM $months, and $dD $days ($frac years).\n";
printf "  That's %.2f Lilas.\n", $dd / $dda;
my $pct = 100 * $dd/$bday_18;
printf "  You are %.2f%% done.\n", $pct;

my $mjdd = Delta_Days(1969,4,2, @ARG);
my $frac = y2d($mjdd);
print "You are $mjdd days old ($frac years).\n";
printf "  That's %.2f Irises.\n", $mjdd / $dd;
printf "  That's %.2f Lilas.\n", $mjdd / $dda;

my $mlkd = Delta_Days(1968,8,22, @ARG);
my $frac = y2d($mlkd);
print "Lorrie is $mlkd days old ($frac years).\n";
printf "  That's %.2f Irises.\n", $mlkd / $dd;
printf "  That's %.2f Lilas.\n", $mlkd / $dda;

my $mmd = Delta_Days(1997, 7, 20, @ARG);
my ($mY, $mM, $mD) = my_Delta_YMD(1997,7,20, @ARG);
print "You have been married for $mmd days.\n";
$years =  $mY == 1 ? "year"  : "years" ;
$months = $mM == 1 ? "month" : "months";
$days =   $mD == 1 ? "day"   : "days"  ;
print "  That's $mY $years, $mM $months, and $mD $days.\n";
printf "  That's %5.2f%% of your life.\n", 100*$mmd/$mjdd;
printf "  And %5.2f%% of Lorrie's life.\n", 100*$mmd/$mlkd;

sub my_Delta_YMD {
  my ($ay, $am, $ad,
      $by, $bm, $bd) = @_;
  my $negate;
  my ($dY, $dM, $dD) = Delta_YMD($ay, $am, $ad, $by, $bm, $bd);
  if ($dY < 0) {
    ($dY, $dM, $dD) = (-$dY, -$dM, -$dD);
    $negate=1;
  }
  if ($dD < 0) {
    my ($py, $pm) = ($by, $bm); # previous month
    $pm--;
    if ($pm == 0) { $pm = 12; $py-- }
    $dD += Days_in_Month($py, $pm);
    $dM --;
  }
  if ($dM < 0) {
    $dY--;
    $dM += 12;
  }
  ($dY, $dM, $dD) = (-$dY, -$dM, -$dD) if $negate;
  ($dY, $dM, $dD);
}

sub y2d {
  my $d = shift;
  sprintf "%.2f", $d / (146097/400);  # days per year
}
