/* @(#)update.h	(c) Telelogic AB */

#ifndef _UPDATE_HPP_
#define _UPDATE_HPP_

#include "support.h"
#include "protos.h"
#include <assert.h>
#include "account.h"

typedef enum {
	USERORDER_WITHDRAWAL 	= 0,
	USERORDER_DEPOSIT	= 1,
	USERORDER_MENU		= 2,
	USERORDER_QUIT		= 3,
	USERORDER_UNKNOWN	= 4
} UserOrderEnum;

typedef enum {
	USERORDER_MENU_ACCOUNT_BALANCE 	= 0,
	USERORDER_MENU_ACCOUNT_LAST	= 1,
	USERORDER_MENU_UNKNOWN 		= 2
} UserOrderMenuEnum;

std::istream& operator>>(std::istream& f,  UserOrderEnum& kind);
std::ostream& operator<<(std::ostream& f, UserOrderEnum kind);

class Update {	

private:
   void GenInit();

public:
   int	Amount;	
   UserOrderEnum Kind;
   Update();	
   Update(UserOrderEnum	kind);
   ~Update();
   void Execute();

   // List
   class Update* same_Account;
   class Update* same_Transaction;

   // Transaction
   class Transaction* Transaction;
   void set_Transaction (class Transaction& a_Transaction);
   void unset_Transaction ();
   void p_connect_Transaction (class Transaction& a_Transaction);
   void p_disconnect_Transaction (class Transaction& a_Transaction);
   class Account* Account;
   void set_Account (class Account& a_Account);
   void unset_Account ();
   void p_connect_Account (class Account& a_Account);
   void p_disconnect_Account (class Account& a_Account);    //GENB
};

std::ostream& operator<<(std::ostream& f, Update& update);

#define NEGATIVE(x) (x < 0)

#endif