#ifndef lint
static char *RCSid = "$Header: /usr/brule/guest/empire/empire/emprcs/lib/commands/repa.c,v 2.0 1995/01/25 19:23:25 empire Exp $";
#endif

/*
 * repa.c
 *
 * repay loan from country
 *
 * from PSL Empire, 1985
 */

#include <math.h>
#include "misc.h"
#include "player.h"
#include "nat.h"
#include "loan.h"
#include "news.h"
#include "file.h"

int
repa()
{
	struct	lonstr loan;
	struct	natstr *natp;
	struct	natstr *loaner;
	int	loan_num;
	long	payment;
	long	owe;
	long	due;
	long	last_payment;
	long	normaltime;
	long	doubletime;
	double	rate_per_sec,amt;
	s_char	*cp;
	time_t	now;
	s_char	buf[1024];

	natp = getnatp(player->cnum);
	cp = getstarg(player->argp[1], "Repay loan #? ", buf);
	if (cp == 0)
		return RET_SYN;
	loan_num = atoi(cp);
	if (loan_num < 0)
		return RET_SYN;
	if (!getloan(loan_num, &loan) || loan.l_lonee != player->cnum
	    || loan.l_status != LS_SIGNED) {
		pr("You don't owe anything on that loan.\n");
		return RET_FAIL;
	}
	(void) time(&now);
	due = loan.l_duedate;
	last_payment = loan.l_lastpay;
	if (now < due) {
		normaltime = now - last_payment;
		doubletime = 0;
	}
	if (last_payment < due && due < now) {
		normaltime = due - last_payment;
		doubletime = now - due;
	}
	if (due < last_payment) {
		normaltime = 0;
		doubletime = now - last_payment;
	}
	rate_per_sec = loan.l_irate /
		((double) loan.l_ldur * SECS_PER_DAY * 100.0);

	owe = (long) (loan.l_amtdue *
		((double) normaltime * rate_per_sec + 1.0 +
		(double) doubletime * rate_per_sec * 2.0) + 0.5);
	amt = ((double) normaltime * rate_per_sec + 1.0 +
		(double) doubletime * rate_per_sec * 2.0);
	if (((1 << 30) / amt) < loan.l_amtdue)
		owe = (1 << 30);
	else
		owe = (long) (loan.l_amtdue *
		    ((double) normaltime * rate_per_sec + 1.0 +
		    (double) doubletime * rate_per_sec * 2.0) + 0.5);
	if ((cp = getstarg(player->argp[2], "amount? ", buf)) == 0)
		return RET_SYN;
	payment = atoi(cp);
	if (payment <= 0)
		return RET_SYN;
	if (payment > owe) {
		pr("You don't owe that much.\n");
		return RET_FAIL;
	}
	if (natp->nat_money < payment) {
		pr("You only have $%d.\n", natp->nat_money);
		return RET_FAIL;
	}
	player->dolcost += payment;
	loaner = getnatp(loan.l_loner);
	loaner->nat_money += payment;
	putnat(loaner);
	(void) time(&loan.l_lastpay);
	if (owe <= payment) {
		wu(0, loan.l_loner, "Country #%d paid off loan #%d with $%d\n",
			player->cnum, loan_num, payment);
		nreport(player->cnum, N_REPAY_LOAN, loan.l_loner, 1);
		loan.l_status = LS_FREE;
		loan.l_ldur = 0;
		pr("Congratulations, you've paid off the loan!\n");
	} else {
		wu(0, loan.l_loner,
		   "Country #%d paid $%.2f on loan %d\n", player->cnum,
		       (double) payment, loan_num);
		loan.l_amtdue = owe - payment;
		loan.l_amtpaid += payment;
	}
	if (!putloan(loan_num, &loan)) {
		pr("Can't save loan; get help!\n");
		return RET_SYS;
	}
	return RET_OK;
}
