/* Libraries */
#include <libraries/mui.h>

/* protos */
#include <clib/muimaster_protos.h>
#include <clib/alib_protos.h>
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>

/*  Pragmas  */
#include <pragmas/muimaster_pragmas.h>
#include <pragmas/exec_pragmas.h>

/*  Ansi  */
#include <stdlib.h>
#include <stdio.h>

/* MUIBuilder */
#include "loan.h"

extern struct ObjApp *App;

ULONG __saveds __asm calc_loan(register __a0 struct Hook *h, 
                               register __a2 void *obj,
                               register __a1 APTR data)
{
  char *s;
  double capital;
  double pay;
  double payments;
  double rate;
  double xtra;
  double xtratime;
  int i=0;
  double interest;
  double total=0;
  long ca;
  double startcapital;

  get(App->capital, MUIA_String_Contents, &s);
  capital=atof(s);
  startcapital=capital;

  get(App->amount, MUIA_String_Contents, &s);
  pay=atof(s);

  get(App->rate, MUIA_String_Contents, &s);
  rate=atof(s);

  get(App->Payment_rate, MUIA_Cycle_Active, &ca);

  switch (ca)
  {
    case 0:
      payments=365;
    break;
    case 1:
      payments=52;
    break;
    case 2:
      payments=26;
    break;
    case 3:
      payments=12;
    break;
    case 4:
      payments=1;
  }
  
  get(App->xtra, MUIA_String_Contents, &s);
  xtra=atof(s);

  get(App->xtratime, MUIA_String_Contents, &s);
  xtratime=atof(s);

  DoMethod(App->result_list, MUIM_List_Clear, NULL, NULL, NULL);

  while ((capital > 0) && (capital <= startcapital))
  {
    char *tmp;

    tmp=(char *)(malloc(255));
    i++;
    interest = (capital*rate)/(payments*100);
    capital += interest;
    capital -= pay;
    total   += pay;
    if (i<xtratime)
    {
      capital -= xtra;;
      total   += xtra;
    }
    sprintf(tmp, "Payment #%4d  Capital %17.2f  Interest %17.2f  Total Paid %17.2f", i, capital, interest, total);

    DoMethod(App->result_list, MUIM_List_Insert, &tmp, 1, MUIV_List_Insert_Bottom);

    free(tmp);
  }

	set(App->Results, MUIA_Window_Open, TRUE);

  return (TRUE);
}
