package lab07;

import java.util.ArrayList;

public class CheckingAccount implements Account {
	static int nextAcct = 5000;
	int acctNumber;
	double balance;
	ArrayList<Transaction> log;
	int month;
	int year;
	SavingsAccount savingsAcct;
	static String[] monthName={ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };

	public CheckingAccount(double initBalance,SavingsAccount custSave) {
		acctNumber=nextAcct;
		nextAcct++;
		log = new ArrayList<Transaction>();
		log.add(new Transaction(0.0,'D',initBalance));
		balance=initBalance;
		savingsAcct=custSave;
		month=8;
		year=2017;
	}

	public void deposit(double amt) {
		log.add(new Transaction(balance,'D',amt));
		balance+=amt;
	}

	public double withdraw(double amt) {
		if (amt > balance) {
			if (savingsAcct !=  null) {
				double diff=amt-balance;
				double fromSavings=savingsAcct.withdraw(diff);
				log.add(new Transaction(balance,'D',fromSavings));
				balance+=fromSavings;
			} else {
				System.out.println("Checking Account: " + acctNumber + " Unable to cover withdrawal from savings account... invalid savings account.");
			}
		}
		if (amt > balance) { // Still even after savings acct
			System.out.println("Checking Account: " + acctNumber + " requested a withdrawal of " + amt + " but only " + balance + " is available.");
			log.add(new Transaction(balance,'W',balance));
			double wdAmt=balance;
			balance=0;
			return wdAmt;
		}
		log.add(new Transaction(balance,'W',amt));
		balance-=amt;
		return amt;
	}
	 
	double transferToSavings(double amt) {
		if (savingsAcct==null) {
			System.out.println("Checking Account: " + acctNumber + " could not transfer to savings... invalid savings account.");
			return 0.0;
		}
		if (balance < amt) {
			double transAmt=balance;
			System.out.println("Checking Account: " + acctNumber + " requested a transfer of " + amt + " but only " + balance + " is available.");
			log.add(new Transaction(balance,'W',balance));
			balance=0;
			savingsAcct.deposit(transAmt);
			return transAmt;
		}
		savingsAcct.deposit(amt);
		log.add(new Transaction(balance,'W',amt));
		balance-=amt;
		return amt;
	}

	public void printStatement() {
		System.out.println(" Transactions for Checking Account: " + acctNumber + " for " + monthName[month] + " " + year);
		Transaction.printHeader();
		for(Transaction t: log) {
			t.printLine();
		}
		Transaction.printTrailer();
		log.clear();
		month++;
		if (month>11) { month=0; year++; }
	}

	public void report() {
		System.out.println("Checking Account: " + acctNumber + " Current balance: " +
			String.format("$%.02f", balance));
	}

}