#!/usr/local/bin/perl -W

use strict;
my $base;                     # precio de referencia

if (scalar(@ARGV) > 0) {
    $base = $ARGV[0];
}else{
    $base = 100;
}
print "BASE PRICE = $base\n";
my $r = 2.4;                     # parámetro a ajustar
my $eff_r = $r/365;

# use Date::Calc qw(:all);

# ($year,$month,$day, $hour,$min,$sec) = Time_to_Date([time()]);
# don't works!
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime(time);
my $day = $mday;
my $month = $mon+1;
$year += 1900; 
print "$year) month $month day $day\n";
my $unused = $sec+$min+$hour+$wday+$yday+$isdst;

# Jan Feb Mar Apr May Jun Jul Ago Sep Oct Nov Dec
#  1   2   3   4   5   6   7   8   9   10  11  12
my $year1 = 1966;
my $month1 = 9;
my $day1 = 6;

# my $date2 = Date_to_Days($year,$month,$day);
# my $date1 = Date_to_Days($year1,$month1,$day1);
# my $delta_day = $date2 - $date1;
# print "Delta_Days = $delta_day\n";
my $delta_days = delta_days($day1,$month1,$year1,$day,$month,$year);
print "Delta_days = $delta_days\n";

# $delta_day = Delta_Days($year,$month,$day, $year1,$month1,$day1);
# $delta_day /= 24*60;
# this is another thing that don't works 

if ($delta_days > 0) { $delta_days =0; }
if ($delta_days < -30) { $delta_days = -30; }
print "Delta_Days efectivo = $delta_days\n";

my $price;
for (my $day = 0; $day>=-30; $day--){
    $price = $base/exp($day*$eff_r);
    printf "%d %.2f\n", $day, $price;
}


# print delta_days(6,9,1966, $day,$month,$year), "\n";
sub delta_days{
    my ($d1, $m1, $y1, $d2, $m2, $y2) = @_;
    my $delta =0;
    my $ystep =1;
    $ystep = -1 if $y1>$y2; 
    for (my $i=$y1; $i!=$y2; $i += $ystep) {
	$delta += (365+leap_year($i))*$ystep;
    }
    my $mstep = 1;
    $mstep = -1 if $m1>$m2;
    for (my $j=$m1; $j!=$m2; $j += $mstep){
	$delta += days_per_month($j)*$mstep;
    }
    $delta += ($d2-$d1);
    return $delta;
}


sub leap_year
{
    return 0 if $_[0] & 3;
    return !!($_[0] % 100 || !($_[0] % 400));
}
	
	
sub days_per_month
{
    my ($m, $y) = @_;
    
    return 28 + leap_year($y)
      if $m == 2;
	    
    return 30 + (($m & 1) ^ ($m >= 8));
}
	    
# print(days_per_month($ARGV[0], $ARGV[1]), "\n");


__END__

En curso, calcula precios crecientes en función de la antelación (hasta 30
    días) según una curva exponencial. Pensado para sistemas de reservas.

