import java.util.*;
import javax.swing.*;

class Account implements Comparable
{
	private String accountNumber ;	
	private String firstName;
	private String lastName;
	private string address;
	private double balance;
	
	public Account();
	public Account(String a, String f, String l, String add, double b);
	
	public void setAccNum(String a);
	public void setFirstName(String n);
	public void setLastName(String a);
	public void setAddress(String a);
	public void setBalance(double b);
	
	public String getAccNum();
	public String getFirstName();
	public String getLastName();
	public String getAddress();
	public double getBalance();
	
	public void deposit(double amount);
	public boolean withdraw(double amt);
	
	public int compareTo(object o)
	{
		Account accObj = (Account)o;
		if(this.getAccNum() > accObje.getAccNum()
		    return 1;
		else if(this.getAccNum() < accObje.getAccNum()
		    return -1;
		else
		    return 0;
	 }
	 public String toString();
};

abstract class Transaction implements Comparable
{
	private String accountNumber;
	private double amount;
	private Date theDate;
	
	public Transaction();
	public Transaction(String acc, double amt, int year, int month, int day, 
	            int hour, int minute)
	            {
	            	accountNumber = acc;
	            	amount = amt;
	            	theDate.setYear(year);
	            	theDate.setMonth(month);
	            	theDate.setDate(day);
	            	theDate.setHours(hour);
	            	theDate.setMinutes(minute);
	            }
	 public String getAccNum();
	 public double getAmount();
	 public Date getDate();
	 
	 public void setAccNum(String a);
	 public void setAmount(double amt);
	 public void setDate(int year, int month, int day,int hour, int minute);
	 public void setdate(Date d);
	 
	 public int compareTo(Object o)
	 {
	 	Transaction trObj = (transaction) o;
	 	if(this.getAccNum() > accObj.getAccNum()
		    return 1;
		else if(this.getAccNum() < accObje.getAccNum()
		    return -1;
		else
		    return this.getDate().compareTo(trObj.getDate());
	}
	public String toString();
	public abstract String getDescription(); 

};

class Deposit extends Transaction
{
	public String getDescription() { return "DEPOSIT";}
};

class Transfer extends Transaction
{
	private String recAccNum;
	public String getDescription() { return "TRANSTER";}
	
	public void setRecAccNum(String acc);
	public String getRecAccNum();
};

class ATMExample
{
	String errLog = "Error.txt";
	static public void main(String[] args)
	{
		Account accArr = null;
		Transaction trArr = null;
		if(args.length != 3)
		{
			JOptionPane.showMesageDialog(null, "Invalid # of parameters");
			syste.exit(1);
		}
		
		String accFile = args[0];;
		String tranFile = args[1];
		String outFile = args[2];
		
		
		readAccounts(accArr, accFile);
		readTrans(trArr, tranFile );
		
		performTrans(accArr, trArr);
		
		writeAccs(accArr, outFile);
	}
	 static void readAccounts(Account[] accArr, String accFile)
	 {
	 	this function will create a vector object and
	 	read teh account objects into it from accFile. 
	 	It will then give the paramete Account array accArr 
	 	an appropriate size and transfer them to it. 
	 	Then sort the array.
	 }
	 
	 static void readTrans(Transaction[] trArr, String tranFile )
	 {
	 	this function will create a vector object and
	 	read the Transaction objects into it from tranFile.
	 	When reading the transaction objects, be careful to
	 	create the correct type of Transaction object
	 	(Deposit or Transfer). 
	 	
	 	The function will then give teh parameter Transaction 
	 	array an appropriate size and transfer them to it. 
	 	Then sort the array.
	 }
	 
	 static void performTrans(Account[] accArr, Transaction[] trArr)
	 {
	 		 	
	 	for(int n = 0; n < trArr.length;n++)
	 	{
	 		for(int k = 0; k < accArr.length; k++)
	 		{
	 			if(accArr[k].getAccNum().compareTo(trArr[n].getAccNum()==0)
	 			{
	 				doTransaction(accArr[k],trArr[n])
	 				break;
	 			}
	 		}
	 		if(k == accArr.length)
	 		{
	 		   "Account not found for that transaction"
	 		   "Write a message to error log"
	 		 }
	 		    
	 	}
	 }
	 
	 static void writeAccs(Account[] accArr, String outFile)
	 {
	 	This function will write teh details of the
	 	Account objects in teh parameter array accArr
	 	to the output file in the parameter outFile
	 }
	 
	 static void doTransaction(Account primAcc, Transaction tr, Account[] acArr)
	 {
	 	Account recAcc;
	 	if (tr.getDescription().compareTo("DEPOSIT") == 0)
	 	    primAcc.deposit(tr.getAmount());
	 	    
	 	if(tr.getDescription().compareTo("TRANSFER") == 0)
	 	    {
	 	    	for(int n = 0; n < accArr.length; n++)
	 	    	{
	 	    		if(accArr[n].getAccNum().compareTo(tr.getRecAccNum() == 0)
	 	    		{
	 	    			recAcc = accArr[n];
	 	    			break;
	 	    		}
	 	    	}
	 	    	if( n == accArr.length)
	 	    	{
	 	    		"The receving account was not found "
	 	    		" write a message to error log and return
	 	    		" from the function"
	 	    	}
	 	    	
	 	    	if(primAcc.withdraw(tr.getAmount() == true)
	 	    	   recAcc.deposit(tr.getAmount());
	 	    	else
	 	    	   "This means that the withdrawal from the 
	 	    	   "primary account failed. Write a message"
	 	    	   "to teh error log"
	 	    	  }
	 	    	   
	 	    }
	 	   }
	 	    	 
	 	    
	 	     
	 	
	 
	 
	 			
	 		
	 	

	            
	 

	 
		  
	
	
	
