#!/usr/bin/perl

# show loan interest
# from Glass & Ables, Unix for programmers and users, 2003
# slightly revised by cmc, 7/21/03

$i=0;
while ( $i < $#ARGV) {# process args
   if ( @ARGV[$i] eq "-r" ) {
	$RATE=@ARGV[++$i];# interest rate
   } else {
	if ( @ARGV[$i] eq "-a" ) {
	    $AMOUNT=@ARGV[++$i];# loan amount
	} else {
	    if ( @ARGV[$i] eq "-p" ) {
		$PAYMENT=@ARGV[++$i];# payment amount
	    } else {
		print "Unknown argument (@ARGV[$i])\n";
                exit
	    }
	}
    }
    $i++;
}

if ($AMOUNT == 0 || $RATE == 0 || $PAYMENT == 0) {
   print "Specify -r rate -a amount -p payment\n";
   exit
}

print "Original balance: \$$AMOUNT\n";
print "Interest rate:     ${RATE}%\n";
print "Monthly payment:  \$$PAYMENT\n";
print "\n";
print "Month\tPayment\tInterest\tPrincipal\tBalance\n\n";

$month=1;
$rate=$RATE/12/100;   # get actual monthly percentage rate
$balance=$AMOUNT;
$payment=$PAYMENT;

while ($balance > 0) {
# round up interest amount
    $interest=roundUpAmount($rate * $balance);
    $principal=roundUpAmount($payment - $interest);
    if ( $balance < $principal ) {     # last payment
	$principal=$balance;     # don't pay too much!
	$payment=$principal + $interest;
    }
    $balance = roundUpAmount($balance - $principal);
    print "$month\t\$$payment\t\$$interest\t\t\$$principal\t\t\$$balance\n";
    $month++;
}

sub roundUpAmount {
#
# in: floating point monetary value 
# out: value rounded (and truncated) to the nearest cent
#
    $value=$_[0];

    $newvalue = ( int ( ( $value * 100 ) +.5 ) ) / 100;

    return ($newvalue);
}
