import java.awt.*;
import java.applet.*;

// Domain Logic
public class ReportGenerator extends DomainLogic { // inherits from DomainLogic
  public ReportGenerator(TextArea textArea1) {
    super(textArea1);
  }
  public void doPortfolio() {                             // display portfolio
    if (chkLogin()) {
      textArea1.append("PORTFOLIO:\n");
      double sum = 0.0;
      textArea1.append("Stock   Shares      Market\n");
      textArea1.append("-----  -------   ---------\n");
      for (int i=0; i<account.holdings.size(); i++) {  
        Holding holding = (Holding) account.holdings.elementAt(i);
        String stockStr = pad(holding.stock.SYM,7," ",false);
        String qty = pad(String.valueOf(holding.QTY),7," ",true);
        double market = holding.QTY * holding.stock.PRICE;
        String marketStr = String.valueOf(market);
        marketStr = pad(marketStr,12," ",true);
        textArea1.append(stockStr+qty+marketStr+"\n");   
        sum += market;
      }
      String sumStr = Double.toString(sum);
      sumStr = pad(sumStr,9," ",true);
      textArea1.append("                 ---------\n");
      textArea1.append("                $"+sumStr+"\n");
      String cashStr= String.valueOf(account.CASH); 
      cashStr = pad(cashStr,9," ",true); 
      textArea1.append("Cash            $"+cashStr+"\n");
      textArea1.append("                 ---------\n");
      sum = sum + account.CASH;
      sumStr = Double.toString(sum); 
      sumStr = pad(sumStr,9," ",true); 
      textArea1.append("Net Worth       $"+sumStr+"\n");
      textArea1.append("                 =========\n\n");
   } 
  }
  public void showOrders() {  // display orders
    if (chkLogin()) {
      textArea1.append("ORDERS:\n");
      for (int i=0; i<account.orders.size(); i++) {
        Order order = (Order)account.orders.elementAt(i);
        textArea1.append(order.toString()+"\n");
      }
      textArea1.append("\n");
    }
  } 
  public void showTrans() {  // display transactions
    if (chkLogin()) {
      textArea1.append("TRANSACTIONS:\n");
      for (int i=0; i<account.transactions.size(); i++) {
        Transaction trans = (Transaction)account.transactions.elementAt(i);
        textArea1.append(trans.toString()+"\n");
      }
      textArea1.append("\n");
    }
  }
  private String lastPrice(Stock stock) {  // last traded price is stored in stock class
    return "$"+stock.PRICE;
  }
  private String maxPrice(Stock stock) {   // maximum offered price is root of buyheap
    String price = "NONE";
    if (stock.buyheap.size() > 0) {
      Order order = stock.buyheap.testRoot();
      price = "$"+order.PRICE;
    }
    return price;
  }
  private String minPrice(Stock stock) {   // minimum offered price is root of sellheap
    String price = "NONE";
    if (stock.sellheap.size() > 0) {
      Order order = stock.sellheap.testRoot();
      price = "$"+order.PRICE;
    }
    return price;
  }
  public void showQuote(String sym) {  // lookup the stock in the hashtable, and display prices
    sym = sym.toUpperCase();
    if (sym.equals("")) 
      textArea1.append("Empty stock field.\n");
    else {
      Stock stock = (Stock) Stock.stocks.get(sym);
      if (stock == null) 
        textArea1.append("Invalid stock symbol: "+ sym +"\n");
      else 
        textArea1.append("Quote: "+ sym +"   Minimum SELL: "+minPrice(stock)+
                                         "   Maximum BUY: "+maxPrice(stock)+
                                         "   Last Sale: "+lastPrice(stock)+"\n\n");
   } 
  }
}  // class ReportGenerator