
import java.text.*;

public class BankAccount{
	private static int nextAccountNumber = 1000;	//used to generate account numbers
	
	private DecimalFormat formatter = new DecimalFormat("$0.00");
	private String owner;	//name of person who owns the account
	private int accountNumber;	//a valid and unique account number;
	private double balance;	//amount of money in the account
	private TransactionRecord transactions;	//collection of past transactions

	public BankAccount(String anOwnerName){	//constructor
    	owner = anOwnerName;
    	accountNumber =  nextAccountNumber++;
    	balance = 0.0;
    	transactions = new TransactionRecord();

	}
	public String getOwner(){return owner;}
	public double getBalance(){return balance;}
 	
	public void deposit(double anAmount ){
 		Transaction transaction = new Transaction(TransactionType.DEPOSIT, accountNumber, balance, balance+anAmount);
 		transactions.add(transaction);
 		balance+=anAmount;
	}

	public void withdraw(double anAmount){
 		Transaction transaction = new Transaction(TransactionType.WITHDRAW, accountNumber, balance, balance-anAmount);
 		transactions.add(transaction);
 		balance-=anAmount;
 		
 		if(balance<0.0){
 			Transaction serviceCharge = new Transaction(TransactionType.SERVICE_CHARGE, accountNumber, balance, 
 				balance-(anAmount*0.06));
 			transactions.add(serviceCharge);
 			balance-=(anAmount*0.06);
 		}
 		else{
 			Transaction serviceCharge = new Transaction(TransactionType.SERVICE_CHARGE, accountNumber, balance, 
 				balance-(anAmount*0.03));
 			transactions.add(serviceCharge);
 			balance-=(anAmount*0.03);
 		}
	}
 
	public String toString(){
 		return "Account Holder: " + owner + "\n\t#" + accountNumber + "\n\tBalance: " + formatter.format(balance);
	}
	
	public void printHistory(){
		System.out.println(toString() + "\n");
		transactions.printHistory();
	}
	
	public void printHistory(int n){
		System.out.println(toString() + "\n");
		transactions.printHistory(n);
	}

} //end class BankAccount