/* prototype mary's menu program */
/* Copyright 1997,1999 Mark W. Eichin.
   Not for public release at this time.
  */

#pragma pack(2)

#include <Common.h>
#include <System/SysAll.h>
#include <UI/UIAll.h>
#include <string.h>
#include <stdio.h>

#define FrmLookupPtr(fp,ID) FrmGetObjectPtr(fp, FrmGetObjectIndex(fp,ID))

static char pricebuf[40];
static int cashtotal = 0;
static int dishprice = 0;
static int dishsplit = 1;

static int getprice(Word id, Word item);
static void draw_a_price(FormPtr fp, int field, int pr);
static void draw_raw_price(FormPtr fp, int cashtotal, int pr);
static void clearEntries(FormPtr fp);
static void updatePopup(FormPtr fp, EventType *e);
static void updatePrices(FormPtr fp, int pr);

DWord PilotMain(Word cmd, Ptr cmdPBP, Word launchFlags)
{
  EventType e;
  short err;
  FormPtr fp = 0;

  if (cmd != sysAppLaunchCmdNormalLaunch) { /* 0 */
    return 0;
  }
  FrmGotoForm(1000);		/* main page */
  while(1) {
    EvtGetEvent(&e, 100);
    if (SysHandleEvent(&e)) continue;
    if (MenuHandleEvent((void *)0, &e, &err)) continue;
    switch (e.eType) {
      case frmLoadEvent:
        FrmSetActiveForm(fp=FrmInitForm(e.data.frmLoad.formID)); break;
      case frmOpenEvent:
        FrmDrawForm(FrmGetActiveForm()); break;
      case menuEvent:
        FrmAlert(1000); break;	/* alert 1000 */
      case appStopEvent:
        return 0;
      default:
        FrmHandleEvent(FrmGetActiveForm(), &e); break;

      case popSelectEvent:
	/* this one *actually* handles the popup menu, so recalc here */
        FrmHandleEvent(FrmGetActiveForm(), &e);
	updatePopup(fp,&e);

	break;
      case ctlSelectEvent:
        FrmHandleEvent(FrmGetActiveForm(), &e);
	{
	  if (e.data.ctlSelect.controlID == 4100) 
	    clearEntries(fp);
	} 
      }
  }
  return 0;
}

static void updatePopup(FormPtr fp, EventType *e)
{
  Word lid = e->data.popSelect.listID;
  ListPtr lp = FrmLookupPtr(fp,lid);
  int pr, oldpr; 
  switch (lid) {
  case 3251:			/* dishsplit */
      oldpr = dishprice / dishsplit;
      dishsplit = lp->currentItem;
      if (dishsplit == 0) dishsplit = 1;
      pr = dishprice / dishsplit;
      break;
  case 3201:			/* dish */
      oldpr = dishprice / dishsplit;
      dishprice = getprice(lp->id, lp->currentItem);
      pr = dishprice / dishsplit;
      break;
  default:
      pr = getprice(lp->id, lp->currentItem);
      oldpr = getprice(lp->id, e->data.popSelect.priorSelection);
      break;
  }
  cashtotal += pr;
  cashtotal -= oldpr;
  updatePrices(fp,pr);
}

static void updatePrices(FormPtr fp, int pr) {
  int tax, tip, cooked;
  tax = 5L * cashtotal / 100L;
  tip = 15L * cashtotal / 100L;	/* (* 2480 15)37200 */
  cooked = cashtotal + tax + tip;
  draw_raw_price(fp, cashtotal, pr);
  draw_a_price(fp, 1, tax);
  draw_a_price(fp, 2, tip);
  draw_a_price(fp, 3, cooked);
}

static void clearControl(FormPtr fp, Word i) {
  ListPtr lp = FrmLookupPtr(fp,i);
  ControlPtr cp = FrmLookupPtr(fp,i-1);
  LstSetSelection(lp,0);
  LstDrawList(lp);
  CtlSetLabel(cp, LstGetSelectionText(lp, 0));
}

static void clearEntries(FormPtr fp)
{
  Word i;
  cashtotal = 0;
  dishprice = 0; dishsplit = 1;
  /* sprintf(pricebuf, "$0.00 (cleared)   ");*/
  /* draw_raw_price(fp, 0, 0);*/
  for (i = 3001; i<=3401 ; i+= 100) {
    clearControl(fp,i);
  }
  clearControl(fp,3251);
  updatePrices(fp,0);
}

static void draw_raw_price(FormPtr fp, int cashtotal, int pr) {
  sprintf(pricebuf, "$%d.%02d ($%d.%02d)  ", 
	  cashtotal/100, cashtotal%100,
	  pr/100, pr%100);
  FrmCopyLabel(fp, 2101, "$0.00 ($0.00)          ");
  FrmCopyLabel(fp, 2101, pricebuf);
}

static char prices[4][40];

static void draw_a_price(FormPtr fp, int field, int pr) {
  Word labelId = 2101 + 100*field;
  sprintf(prices[field], "$%d.%02d   ", pr/100, pr%100);
  FrmCopyLabel(fp, labelId, "$0.00   ");
  FrmCopyLabel(fp, labelId, prices[field]);
}

static int getprice(Word id, Word item) {
  switch(id) {
  default: return 0;
  case 3001:			/* soup */
    switch(item) {
    case 1: return 375;		/* suan */
    case 2: return 365;		/* wonton */
    case 3: return 175;		/* h&s  */
    case 4: return 375;		/* h&s w/wonton */
    case 5: return 175;		/* eggdrop */
    default: return 0;
    } 
    break;
  case 3101:			/* ravs */
    switch(item) {
#define RAVS 475
    case 1: return RAVS/3;	/* 2 ravs */
    case 2: return RAVS/2;	/* 3 ravs */
    case 3: return RAVS;	/* 6 ravs */
    case 4: return 3*RAVS/2;	/* 9 ravs */
    default: return 0;
    }
    break;
  case 3201:			/* dish */
    switch(item) {
    case 1: return 725;		/* kpcd */
    case 2: return 850;		/* gen ted's */
    case 3: return 895;		/* dcsb */
    case 4: return 975;		/* mongo beef */
    default: return 0;
    }
    break;
  case 3301:			/* mooshi */
    switch(item) {
    case 1: return 725;		/* chix with */
    case 2: return 675;		/* chix w/o */
    case 3: return 750;		/* beef with */
    case 4: return 700;		/* beef w/o */
    case 5: return 725;		/* pork with */
    case 6: return 675;		/* pork w/o */
    default: return 0;
    }
    break;
  case 3401:			/* rice */
    switch(item) {
    case 1: return 100;		/* $1 rice */
    default: return 0;
    }
    break;
  }    
}
