/* @include embgroup **********************************************************
**
** Group Routines.
**
** @author Copyright (c) 1999 Alan Bleasby
** @version $Revision: 1.23 $
** @modified $Date: 2011/10/18 14:24:24 $ by $Author: rice $
** @@
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
** MA  02110-1301,  USA.
**
******************************************************************************/

#ifndef EMBGROUP_H
#define EMBGROUP_H




/* ========================================================================= */
/* ============================= include files ============================= */
/* ========================================================================= */

#include "ajdefine.h"
#include "ajstr.h"
#include "ajlist.h"
#include "ajfile.h"

AJ_BEGIN_DECLS




/* ========================================================================= */
/* =============================== constants =============================== */
/* ========================================================================= */




/* ========================================================================= */
/* ============================== public data ============================== */
/* ========================================================================= */




/* @data EmbPGroupProg ********************************************************
**
** Hold details of programs (names and documentation) and the package
** they belong to.
**
** @alias EmbOGroupProg
** @alias EmbSGroupProg
**
** @attr name [AjPStr] Name of group or of program
** @attr doc [AjPStr] Documentation for this program
** @attr keywords [AjPStr] keywords for this program
** @attr package [AjPStr] EMBASSY package, empty for main package
** @attr groups [AjPList] List of group(s) this program belongs to.
** @attr acdtopics [AjPList] List of relation topic attributes
** @attr acdoperations [AjPList] List of relation operation attributes
** @attr acdinputs [AjPList] List of relation input attributes
** @attr acdoutputs [AjPList] List of relation output attributes
** @attr acdparams [AjPList] List of relation parameter attributes
** @@
******************************************************************************/

typedef struct EmbSGroupProg {
    AjPStr name;
    AjPStr doc;
    AjPStr keywords;
    AjPStr package;
    AjPList groups;
    AjPList acdtopics;
    AjPList acdoperations;
    AjPList acdinputs;
    AjPList acdoutputs;
    AjPList acdparams;
} EmbOGroupProg;
#define EmbPGroupProg EmbOGroupProg*




/* @data EmbPGroupRelation ****************************************************
**
** Hold details of relation attributes and the qualifiers they appear in.
**
** @alias EmbOGroupRelation
** @alias EmbSGroupRelation
**
** @attr type [AjPStr] Type of qualifier
** @attr qual [AjPStr] Name of qualifier
** @attr acdgroup [AjPStr] ACD group for qualifier type
** @attr id [AjPStr] EDAM term id
** @attr namespace [AjPStr] EDAM namespace
** @attr name [AjPStr] EDAM term name
** @@
******************************************************************************/

typedef struct EmbSGroupRelation {
    AjPStr type;
    AjPStr qual;
    AjPStr acdgroup;
    AjPStr id;
    AjPStr namespace;
    AjPStr name;
} EmbOGroupRelation;
#define EmbPGroupRelation EmbOGroupRelation*




/* @data EmbPGroupTop *********************************************************
**
** This serves as both a node in a list of names of groups which each hold
** a list of details of programs (names and documentation) and also
** it is a node in a list of the details of programs (names and documentation).
**
** Using the same structure for both is a bit confusing, but it simplifies
** some of the routines which search and output the lists of gnodes of
** groups and program data.
**
** GROUP LIST 	nodes point to	PROGRAM LISTS
** ----------			-------------
**
** group gnode 	-> program gnode - program gnode - program gnode - etc.
**     |
** group gnode 	-> program gnode - program gnode - program gnode - etc.
**     |
**    etc.
**
**
** The layout of the 'alpha' list of alphabetic listing of applications is
** a bit different - instead of applications being grouped, as in 'glist'
** above, the applications all come under one major group and each
** application holds a list of the groups it belongs to:
**
** ALPHA LIST
** ----------
**
** group gnode -> program gnode -> group gnode - group gnode - etc.
** 		   |
** 	       program gnode -> group gnode - group gnode - group gnode - etc.
** 		   |
** 	       program gnode -> group gnode - group gnode - group gnode - etc.
** 		   |
** 	       program gnode -> group gnode - group gnode - group gnode - etc.
** 		   |
** 	       program gnode -> group gnode - group gnode - group gnode - etc.
**                    |
**                   etc.
**
**
** @alias EmbOGroup
** @alias EmbSGroup
**
** @attr name [AjPStr] name of group or of program
** @attr doc [AjPStr] documentation for this program (used by list of programs)
** @attr progs [AjPList] list of programs in this group (used by groups list)
** @@
******************************************************************************/

typedef struct EmbSGroupTop {
    AjPStr name;
    AjPStr doc;
    AjPList progs;
} EmbOGroupTop;
#define EmbPGroupTop EmbOGroupTop*




/* ========================================================================= */
/* =========================== public functions ============================ */
/* ========================================================================= */



/*
** Prototype definitions
*/

ajint         embGrpCompareTwoGnodes(const void * a, const void * b);
ajint         embGrpCompareTwoPnodes(const void * a, const void * b);
void          embGrpExit(void);
AjBool        embGrpGetEmbassy(const AjPStr appname, AjPStr* embassyname);
void          embGrpGetProgGroups(AjPList glist, AjPList alpha,
				  char * const env[],
				  AjBool emboss, AjBool embassy,
				  const AjPStr embassyname,
				  AjBool explode, AjBool colon,
				  AjBool gui);
void          embGrpGroupsListDel(AjPList *groupslist);
void          embGrpProgsListDel(AjPList *progslist);
void          embGrpRelationsListDel(AjPList *relslist);
void          embGrpProgDel(EmbPGroupProg *Pgl);
void          embGrpKeySearchProgs(AjPList newlist, const AjPList glist,
				   const AjPStr key, AjBool all);
void          embGrpSearchProgsEdam(AjPList newlist, const AjPList glist,
                                    const AjPStr key, const char* namespace,
                                    AjBool sensitive, AjBool subclasses,
                                    AjBool obsolete);
void          embGrpKeySearchSeeAlso(AjPList newlist,
				     AjPList *appgroups, AjPStr* package,
				     const AjPList alpha, const AjPList glist,
				     const AjPStr key);
EmbPGroupTop  embGrpMakeNewGnode(const AjPStr name);
EmbPGroupProg embGrpMakeNewPnode(const AjPStr name, const AjPStr doc,
				 const AjPStr keywords, const AjPStr package);
void          embGrpOutputGroupsList(AjPFile outfile,
				     const AjPList groupslist,
				     AjBool showprogs, AjBool html,
				     AjBool showkey,
				     const AjPStr package);
void          embGrpOutputProgsList(AjPFile outfile,  const AjPList progslist,
				    AjBool html, AjBool showkey,
				    const AjPStr package);
void          embGrpSortGroupsList(AjPList groupslist);
void          embGrpSortProgsList(AjPList progslist);
void          embGrpGroupMakeUnique(AjPList list);
void          embGrpProgsMakeUnique(AjPList list);

/*
** End of prototype definitions
*/

AJ_END_DECLS

#endif  /* !EMBGROUP_H */
