// Michael Tartaglia
// A cheap Bank Account program that allows
//    a user to deposit or withdraw cash...

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class BankAccount extends Applet implements ActionListener{
   private Choice bankMenu;			// OPTIONS MENU
   private TextField entered;			// CASH ENTERY BOX
   private TextArea history;			// HISTORY OF TRANSACTIONS
   private int transactions = 0;		// NUMBER OF TRANSACTIONS
   private double balance = 0;		// TOTAL CURRENT BALANCE
   private String ERROR = "";			// ERRORS OF PROCESSING

   public void init() {
      setBackground(Color.white);

      Panel note = new Panel();
      note.setLayout(new FlowLayout(FlowLayout.CENTER));
      note.add(new Label("Just type in a number in the field and hit enter."));
      add(note);

      bankMenu = new Choice();
      bankMenu.addItem("Please choose an option:");	// CASE 0
      bankMenu.addItem(" - Deposit cash");				// CASE 1
      bankMenu.addItem(" - Withdraw cash");				// CASE 2
      add(bankMenu);

      Panel moneyBlock = new Panel();
      moneyBlock.setLayout(new FlowLayout(FlowLayout.CENTER));
      moneyBlock.setBackground(new Color(220,255,220));
      moneyBlock.add(new Label("$"));
      entered = new TextField(10);
      entered.setText("0.0");
      entered.addActionListener(this);
      moneyBlock.add(entered);
      add(moneyBlock);

      history = new TextArea("Transaction History...",4,40);
      history.setBackground(new Color(255,255,255));
      history.setEditable(false);
      add(history);      
   }


   public void actionPerformed(ActionEvent e)
   throws NumberFormatException {
	// INPUT: action event occurring on input box
      double value = 0;		// VALUE OF ENTRY
      if (e.getSource() == entered) {
         try {					// MAKE SURE NUMBER ENTERED IS VALID
            value = Double.parseDouble(entered.getText());
         } catch (NumberFormatException nfe) {
            ERROR = "Illegal value entered!";
         }
         switch (bankMenu.getSelectedIndex()) {
            case 0:  ERROR = "Choose option!";
                     break;
            case 1:  makeDeposit(value);		// SEND VALUE OF TRANSACTION TO DEPOSIT SUB
                     break;
            case 2:  makeWithdrawl(value);	// SEND VALUE OF TRANSACTION TO WITHDRAWL SUB
                     break;
            default: break;
         }
         entered.setText("");		// RESET DATA ENTRY BOX
      }
      repaint();
   }

   public void makeDeposit(double value) {
      if (value <= 0) {		// ENSURE VALID AMOUNT IS DEPOSITED
         ERROR = "Requested deposit is illegal!";
      } else {
         transactions++;	// ADD TO NUMBER OF TRANSACTIONS
         balance += value; // ADD VALUE TO TOTAL, AND APPEND TO HISTORY
         history.append("\n" + transactions + ": Deposited $" + value);
      }
   }

   public void makeWithdrawl(double value) {
      if (value > balance) {	// ENSURE PROPER AMOUNT IS ENTERED
         ERROR = "Requested withdrawl exceeds balance!";
      } else {
         transactions++;		// ADD TO NUMBER OF TRANSACTIONS
         balance -= value;		// ADD VALUE TO TOTAL, AND APPEND TO HISTORY
         history.append("\n" + transactions + ": Withdrew $" + value);
      }
   }

   public void paint(Graphics g) {
      g.setFont(new Font("Courier",Font.BOLD,12));		// SET FONT
      if (!ERROR.equals("")) {			// PRINT ERROR, IF ANY OCCURRED
         g.drawString(ERROR,50,170);
         ERROR = "";
      }
      g.setFont(new Font("Courier",Font.PLAIN,12));
      g.drawString("     Balance: $" + balance,50,184);		// PRINT BALANCE
      g.drawString("Transactions: " + transactions,50,198); // PRINT # OF TRANS.
   }
}
