/*	AccountClass class implementation */

#include <iostream.h>
#include <lvpvector.h>
#include <lvpstring.h>

using namespace std;	// October 5, 2001

//--------------------------------------------------------------------------------
AccountClass::AccountClass()
	: Balance(0), TransDates(0), TransKinds(0), TransAmts(0), IsOpen(false)
{
}
//--------------------------------------------------------------------------------
AccountClass::AccountClass(lvpstring AcctName, lvpstring AcctOpenDate)
	: Name(AcctName), OpenDate(AcctOpenDate), Balance(0),
	TransDates(0), TransKinds(0), TransAmts(0), IsOpen(true)
/*	Opens AcctName account on AcctOpenDate.
	Post: AcctName balance is zero, and transaction recorded */
{
}
//--------------------------------------------------------------------------------
bool AccountClass::Deposit(double Amt, lvpstring Date)
/*	Adds deposit to Acct and records transaction
	Post: Amt added to account, and transaction recorded */
{
	if (IsOpen) {
		Balance += Amt;
		TransDates.resize(TransDates.length() + 1);
		TransDates[TransDates.length()-1] = Date;

		TransKinds.resize(TransKinds.length() + 1);
		TransKinds[TransKinds.length()-1] = "Deposit";

		TransAmts.resize(TransAmts.length() + 1);
		TransAmts[TransAmts.length()-1] = Amt;
		return (true);
	}
	else
		return (false);
}
//--------------------------------------------------------------------------------
bool AccountClass::Withdrawal(double Amt, lvpstring Date)
/*	Subtracts withdrawal from account and records transaction
	Post: if Amt<=Balance, Amt deleted from account, transaction recorded,
	and true returned. Otherwise, false returned, attempt recorded, 
	and balance unchanged.                                                                              */
{
	if (IsOpen) {
		TransDates.resize(TransDates.length() + 1);
		TransDates[TransDates.length()-1] = Date;
		TransKinds.resize(TransKinds.length() + 1);
		TransAmts.resize(TransAmts.length() + 1);
		TransAmts[TransAmts.length()-1] = Amt;
		if (Amt <= Balance) {
			Balance -= Amt;
			TransKinds[TransKinds.length()-1] = "Withdrawal";
			return(true);
		}
		else {
			TransKinds[TransKinds.length()-1] = "Withdrawal/Failed";
			return(false);
		}
	}
	else
		return (false);
}
//--------------------------------------------------------------------------------
double AccountClass::GetBalance() const
/*	Determines current balance
	Post: Current balance returned */
{
	return (Balance);
}
//--------------------------------------------------------------------------------
void AccountClass::WriteTransactions(ostream & OutFile) const
/*	Writes transactions to OutFile
	Post: All information about the account written to OutFile,
	including a list of all transactions.                                        */
{
	OutFile.setf(ios::fixed);
	OutFile.precision(2);
	OutFile << Name << endl;
	OutFile << "Acct opened on " << OpenDate << " Balance: "
	<< Balance << endl;
	OutFile << "Transactions" << endl;
	for (int i=0; i<TransDates.length(); i++) {
		OutFile.width(12); OutFile << TransDates[i];
		OutFile.width(22); OutFile << TransKinds[i];
		OutFile.width(12); OutFile << TransAmts[i] << endl;
	}
}
//--------------------------------------------------------------------------------
void AccountClass::SpecifyAccount(lvpstring AcctName, lvpstring AcctOpenDate)
/*	Assigns AcctName and AcctOpenDate to account if account not initialized
	Post: AcctName assigned to Name and AcctOpenDate assigned to
	OpenDate if account was not already initialized. IsOpen is true.                */
{
	if (!IsOpen) {
		Name = AcctName;
		OpenDate = AcctOpenDate;
		IsOpen = true;
	}
}
//--------------------------------------------------------------------------------
lvpstring AccountClass::GetName() const
/*	Determines account name
	Post: Name returned          */
{
	return(Name);
}

