#ifndef DATABASE_H
#define DATABASE_H
/************************************************
* dataBase.h
*
*       This header defines externals and 
*       prototypes, etc. for dataBase.c lib.
*
************************************************/
#include <stdio.h>
#include <libraries/guifront.h>
#include <proto/guifront.h>
#include <clib/exec_protos.h>

#define FILESIZE	100
#define MAXMACROS	10

#define FILTERNA	0
#define FILTERYES	1
#define FILTERNO	2
#define FILTERIN	1
#define FILTEROUT	2

#define DEFAULT_TEMPS	4
#define DEFAULT_CATS	1

#define STRINGSIZE      71
#define DATESIZE        12
#define TEMPNAMESIZE	31
#define CATNAMESIZE	31
#define AMNTSIZE	16
#define CHECKSIZE	7

#define CHECKTYPE	0
#define WITHDRAWALTYPE	1
#define DEPOSITTYPE	2
#define SCRIPTTYPE	3

/* flags */
#define PRINTED		0x01
#define CLEARED		0x02
#define VOIDED		0x04
#define RECONCILED	0x08
#define TAXDEDUCT	0x10

/* sort entry defines */
#define SORTENTRIES	6
#define SORTCHECK	0
#define SORTDATE	1
#define SORTAMNT	2
#define SORTNAME	3
#define SORTMEMO	4
#define SORTCATEGORY	5

#define SORTASCEND	0
#define SORTDESCEND	1

/* voucher types */
#define VT_NONE         0
#define VT_LEFTRIGHT    1
#define VT_ABOVEBELOW   2
#define VT_TWOBELOW     3
#define VT_ABOVE        4
#define VT_BELOW        5

#define NUMCHECKFORMS	10

/* date formats */
#define DATE_MMDDYY	0
#define DATE_DDMMYY	1
#define DATE_DEC_12	2
#define DATE_12_DEC	3

/* max decimal places */
#define MAXDECIMAL 4

/* macro for copylist routine */
#define STROFF(nodedef,nodefield) ((UWORD)((char *)( ((nodedef *)0)-> nodefield ) - (char *)( (nodedef *)0)))


/* amount structure */
typedef  ULONG amountType;

/* balance type (not to be confused with amount! */
typedef struct {
	ULONG dollar;	/* not really dollar, but so I can read it clearly */
	UWORD cent;	/* ditto, normally.. remainder? */
	UBYTE neg;	/* negative or positive... */
} balanceType;

/* stateVariables */
struct stateVars {
	balanceType currAmnt;
	balanceType stateAmnt;
	UWORD currTemplate;
	UWORD currCheckNumber;
};

/* NetInformation */
struct netInfoVars {
	balanceType taxdeductcurr;
	balanceType taxdeductstate;
	balanceType currAmnt;
	balanceType stateAmnt;
	UBYTE decimal;
};

/* date structure */
typedef struct {
	UBYTE day;
	UBYTE month;
	USHORT year;
} dateType;

typedef struct {
	UBYTE line1[STRINGSIZE];
	UBYTE line2[STRINGSIZE];
	UBYTE line3[STRINGSIZE];
	UBYTE line4[STRINGSIZE];
} addressType;

/* arexx macro structure */
typedef struct {
	char macroname[20+1];
	char macrofile[FILESIZE+1];
} arexxNode;

/* script structure */
typedef struct {
	struct Node node;
	char scname[TEMPNAMESIZE];
} scriptNode;

/* networth structure */
typedef struct {
	struct Node node;
	char acname[100];
	char actype;
	struct netInfoVars balances;
} netNode;

/* a category structure */
typedef struct {
	struct Node node;
	char 	catname[CATNAMESIZE];
	char	color;
	char 	linestyle;
} categoryNode;

/* A budget group structure */
typedef struct {
	struct Node node;
	char groupname[CATNAMESIZE];
	struct List catlist;
} groupNode;

/* a budget item */
typedef struct {
	struct Node node;
	UBYTE catname[CATNAMESIZE];
	amountType amount;
} budgetNode;

/* an item node */
typedef struct {
        struct  MinNode node;
	WORD	type;
        
        UWORD   check;
        char    name[STRINGSIZE];
        char    memo[STRINGSIZE];

	dateType date;       	     
	amountType amount;   
       
	UBYTE	flags;

	char category[CATNAMESIZE];
#if 0
	struct List budgetlist;
	addressType address;
#endif
} entryNode;

/* a template structure */
typedef struct {
	struct Node node;
        char	tempname[TEMPNAMESIZE];
        entryNode template;                
} templateNode;

/* a filter structure */
typedef struct {
	struct MinNode node;
	entryNode *entry;
	long printChars[4];
	balanceType runningBal;
	balanceType filterBal;
} filterNode;

typedef struct {

	/* types */
	BOOL	checks;
	BOOL	withdrawals;
	BOOL	deposits;

	/* type state(s) */
	UBYTE	andflag;	/* AND set */
	UBYTE	notflag;	/* NOT set */

	/* ranges */
	UBYTE	checkrange; /* flag ->0, 1=in, 2=out */
	UWORD	checkfrom;
	UWORD	checkto;

	UBYTE	amntrange; /* flag -> 0, 1=in, 2=out */
	amountType amountFrom;
	amountType amountTo;

	UBYTE	daterange; /* flag -> 0, 1=in, 2=out */
	dateType dateFrom;
	dateType dateTo;

	/* budget */
	UBYTE	usecategory; /* flags -> 0, 1=in, 2=out */
	UBYTE	category[CATNAMESIZE+1];

	/* storage */
	UBYTE	printcode, taxcode, voidcode, reconcilecode, clearcode;	

	/* fields */
	UBYTE	usepayee, usememo;
	char 	payee[STRINGSIZE+1], memo[STRINGSIZE+1];
	char	payeetoken[STRINGSIZE*2 + 2], memotoken[STRINGSIZE*2+2];

} filterSetting;
	

/* sort structures */
typedef struct {
	struct Node node;
	char field[STRINGSIZE+1];
	UBYTE  order;
	UBYTE index;
} sortNode;

typedef struct {
	BOOL 	check;
	BOOL	memo;
	BOOL	name;
	BOOL	amnt;
	BOOL	date;
	BOOL	category;
} sortState;

/* account global info structure */
typedef struct {
	char accnt[STRINGSIZE];
	char bank[STRINGSIZE];
	char holder[STRINGSIZE];

	BOOL	negative;
	amountType beginAmount;

	dateType openDate;

	BOOL closed;
	dateType closeDate;

	UBYTE 	decimal;
	UWORD	checknumber;
} accntState;

/* search criteria structure */
typedef struct {
	BOOL 	check;
	UWORD	checknum;

	BOOL	memo;
	char	memostr[STRINGSIZE];
	char 	memostrtoken[STRINGSIZE*2 + 2];

	BOOL	name;
	char	namestr[STRINGSIZE];
	char 	namestrtoken[STRINGSIZE*2 + 2];

	BOOL	amnt;
	amountType amount;

	BOOL	date;
	dateType searchdate;

	BOOL	category;
	char	catstr[CATNAMESIZE];
	char	catstrtoken[CATNAMESIZE*2 + 2];

	LONG	lastrow;
} searchState;

/* special category edit structure */
typedef struct {
	categoryNode	new;
	BOOL		oldnode;
	categoryNode	original;
} editCatNode;

/* report prefs */
typedef struct {
	UWORD rows;
	UWORD cols;
	UWORD style;
	BOOL  tofile;
	BOOL  state;
	BOOL  summary;
  	BOOL  padline;
} reportSetting;

/* quick-dates structure */
typedef struct {
	struct Node node;
	char dateStr[DATESIZE];
	dateType date;
} dateNode;

/* quick-memos structure */
typedef struct {
	struct Node node;
	char memoStr[STRINGSIZE];
} memoNode;

/* quick-name structure */
typedef struct {
	struct Node node;
	char nameStr[STRINGSIZE];
} nameNode;

/* quick-amnt structure */
typedef struct {
	struct Node node;
	char amntStr[STRINGSIZE];
} amntNode;

/* check form structure */
typedef struct {
	BOOL	sheet_feed;
	ULONG 	lines_check;
	ULONG	checks_page;
	ULONG	pay_margin;
	ULONG	pay_width;
	ULONG	pay_line;
	ULONG	date_margin;
	ULONG	date_width;
	ULONG	date_line;
	ULONG	amnt_margin;
	ULONG	amnt_width;
	ULONG	amnt_line;
	ULONG	memo_margin;
	ULONG	memo_width;
	ULONG	memo_line;
	ULONG	voucher_type;
	ULONG	voucher_margin;
	ULONG	voucher_width;
	ULONG	str_margin;
	ULONG	str_width;
	ULONG 	str_line;

	/* new stuff */
	ULONG	top_lines;
   	ULONG	columns;
	ULONG	reserved;
} checkForm;

typedef struct {
	char	device[STRINGSIZE];
	checkForm userForm;
	checkForm forms[NUMCHECKFORMS];
} formControl;

typedef struct {
	ULONG checkNumber;
	BOOL  autoVoid;
	BOOL  printVoid;
	ULONG checksPage1;
	ULONG printMode;
} printControl;

typedef void  (*funcptr)();

extern STRPTR fptlabels[];
extern struct TagItem strCheckTags[];
extern struct TagItem strAmntTags[];
extern struct TagItem strDateTags[];
extern struct TagItem strMemoTags[];
extern struct TagItem strNameTags[];
extern struct TagItem strTempTags[];
extern struct TagItem strCatTags[];
extern struct TagItem TxtBorder[];
extern struct TagItem TxtNoBorder[];
extern struct TagItem TxtZero[];
extern struct TagItem TxtInt[];
extern struct TagItem NumBorder[];
extern struct TagItem ListView[];
extern struct TagItem MiscButton[];

extern UWORD decimalModulos[];
extern char easymonths[12][4];
extern char daysinmonth[12];
extern searchState searchControl;
extern struct MinList entries, filtered;
extern struct List templates, testtemps, memolist, datelist, namelist, amntlist;
extern struct List categories, sortfields, grouplist;

extern arexxNode arexxMacros[MAXMACROS];
extern printControl checkPrint;
extern reportSetting reportControl;
extern struct stateVars amntState;
extern balanceType filtAmnt;
extern BOOL amiChangedItems;
extern accntState usrAccount;
extern sortNode sortEntries[SORTENTRIES];
extern sortState sortStates;
extern filterSetting filterControl;
extern dateType currDate;
extern UWORD currCentury;
extern UWORD entryCount;
extern formControl checkForms;
extern UWORD dateFormat;

void DataFreeList(struct List *);
BOOL DataInit(void);
BOOL DataAddTemp(struct List *,templateNode *);
BOOL DataAddCat(struct List *, categoryNode *);
void DataFreeAll(void);
struct Node *DataOrd2Node(struct List *,LONG );
LONG DataNode2Ord(struct List *,char *);
void DataStoreAmnt(amountType *, char *);
void DataBuildAmnt(BOOL, amountType *, char *);
void DataBalConvert(balanceType *, UBYTE, UBYTE);
void DataBalToAmnt(balanceType *, UBYTE *, amountType *);
void DataBuildBal(UBYTE, balanceType *, char *);
void DataInitBal(UBYTE, amountType *, balanceType *);
void DataAddBal(UBYTE , amountType *, balanceType *);
void DataBalAddBal(UBYTE decimal,balanceType *dest,balanceType *bal1, balanceType *bal2);
int  DataCmpBal(BOOL, balanceType *, balanceType *);
int DataCmpAmntBal(amountType *amnt, balanceType *bal);
void DataCopyGroupList(struct List *, struct List *);
void DataMoveList(struct List *, struct List *);
BOOL DataIsUnique(GUIFront *gui, struct List *, char *, BOOL,char *);
BOOL DataVerifyAmnt(char *, char *);
BOOL DataVerifyDate(char *, char *);
void DataStoreDate(dateType *, char *);
void DataBuildDate(dateType *, char *);
void DataAnnounce(GUIFront *gui, char *);
void DataAnnounceDate(GUIFront *gui);
void DataAnnounceAmount(GUIFront *gui);
int DataQuery(GUIFront *gui, char*, char *);
BOOL DataAddEntry(entryNode *, struct MinList *, filterNode **);
BOOL DataInsertEntry(filterNode *,entryNode *,entryNode *, struct MinList *, filterNode **, entryNode **);
BOOL DataAddFilter(filterNode **, entryNode *, struct MinList *);
BOOL DataInsertFilter(filterNode *,filterNode **, entryNode *, struct MinList *);
void DataBuildRegDate(dateType *, char *);
BOOL DataTestFilter(entryNode *, filterSetting *);
void DataListInit(void);
void DataRemoveEntry(entryNode *, filterNode *);
void DataRemoveFilter(filterNode *);
void DataRemoveEntryFilter(entryNode *);
void DataUpdateBal(UBYTE, amountType *, balanceType *, char *);
void DataRebuildFilters(void);
void DataSitNSpin(struct Gadget *, struct Window *);
void DataMoveSort(struct List *, sortNode *, struct List *, sortNode *);
balanceType DataReconcile(BOOL);
void DataSortFilter(filterNode *, filterNode *, sortNode *);
void DataCopyCatList(struct List *, struct List *);
editCatNode *DataNewEditCat(struct List *, categoryNode *);
void DataMoveCatList(struct List *);
WORD DataSearchFilter(struct MinList *, searchState *);
BOOL DataLoadFile(char *);
BOOL DataSaveFile(char *, BOOL);
WORD DataFindNode(struct List *,struct Node *);
BOOL DataGetFileName(char *,short , char *, char *);
void DataAttachIcon(char*, char *, char *);
balanceType DataRunningBals(struct MinList *, struct MinList *);
balanceType DataBalance(UBYTE, struct MinList *);
BOOL DataSummarize(char *, netNode *);
void DataFilterBalance(struct MinList *);
void DataUpdateFilters(struct MinList *);
struct Node *DataFindName(struct List *,char *);
struct Node *DataGetNext(struct List *, struct Node *);
void DataListUp(GUIFront *gui, struct Gadget *listgad, struct List *list, UWORD *listsel);
void DataListDown(GUIFront *gui, struct Gadget *listgad, struct List *list, UWORD *listsel);
void DataListBottom(GUIFront *gui, struct Gadget *listgad, 
		struct List *list, UWORD *listsel, UWORD entries);
void DataListTop(GUIFront *gui, struct Gadget *listgad, 
		struct List *list, UWORD *listsel, UWORD topmargin);
void DataListRemove(GUIFront *gui, struct Gadget *listgad, 
		struct List *list, UWORD *listsel);
UWORD DataCountNodes(struct List *);
groupNode *DataNewGroup(struct List *gl, groupNode *grp);
void DataFreeGroupCats(struct List *gl);
void DataReplaceGroupCats(struct List *grps, struct List *new);
void DataCopyList(struct List *src, struct List *dest, funcptr func);
void DataCopyGroupList(struct List *src, struct List *dest);

#endif
