/*   -*- coding: utf-8 -*-  */
/***********************************************************************
*
*               Module   : Tei
*               Fichier  : TeiKeywordsFromTable.c
*               Auteur   : Ducloy
*               Date     : Février 2013
*
************************************************************************
*
* Copyleft 2013 Jacques Ducloy 
* 
************************************************************************/
#include <stdio.h>     /* for printf */
#include <stdlib.h>    /* for exit */
#include <getopt.h>
#include "TeiHandler.h"
#include "StrSearch.h"

SxmlNode *docInput;
StrSearchTable *indexingTable;

    int getopt();
    extern char *optarg;

char *inputLang;
char *inputScheme;
char *inputType;
char *inputQualifier;

void teiComputeList(SxmlNode *liste1, char *s1, char *t1, char *q1, char *l1)
{
  SxmlNode *firstItem;
  SxmlNode *itemNode;

  if (!liste1) return;
  if (!(firstItem=SxmlFirstChild(liste1)))return;
  SxmlReset (liste1);
  if (SxmlNodeHasName(firstItem, "term"))
    {
      while((itemNode=SxmlNextNode(liste1)))
	{
	  TeiKeywordsPutTerm(s1, t1, q1, l1, SxmlLeafText(itemNode));
	}
      return;  /* ??? */
    }
  while((itemNode=SxmlNextNode(liste1)))
    {
      SxmlNode *liste2;
      if ((liste2=SxmlGetFirstChildByTagName(itemNode,"l")))
	{
	    SxmlNode *firstItem2;
	    firstItem2=SxmlFirstChild(itemNode);
	    if (SxmlNodeHasName(firstItem2,"scheme")) 
	      {
		teiComputeList(liste2, SxmlLeafText(firstItem2), t1, q1, l1);
		continue;
	      }
	    if (SxmlNodeHasName(firstItem2,"type")) 
	      {
		teiComputeList(liste2, s1, SxmlLeafText(firstItem2), q1, l1);
		continue;
	      }
	}
    }
}

int main (int argc, char **argv) {
  int cOption;
  inputLang="fr";
  inputScheme=NULL;
  inputType=NULL;
  inputQualifier=NULL;

  indexingTable=StrSearchTableCreate(100,100);

  while((cOption=getopt(argc,argv,"l:q:s:t:T:"))!=EOF)
    
    {switch (cOption)
        {
	case 'T' :
	  StrSearchAddTable(optarg, indexingTable);
	  break;
	case 'l':
	  inputLang=optarg;
	  break;
	case 'q':
	  inputQualifier=optarg;
	  break;
	case 's':
	  inputScheme=optarg;
	  break;
	case 't':
	  inputType=optarg;
	  break;
	}
    }

  while ((docInput=SxmlInputNextDocumentElement()))
     { 
       char *indexingStr;
       char *rbid;
       TeiHandlerInit(docInput);
       rbid= TeiGetIdnoRbid();
       indexingStr =StrSearch(indexingTable, rbid);
       if (indexingStr) 
	 {
	   SxmlNode *indexingList;
	   indexingList=SxmlFromString(indexingStr);
	   teiComputeList(indexingList, inputScheme, inputType, inputQualifier, inputLang);
	 }
       SxmlPrint (SxmlInputRecord);
     }
   exit (EXIT_SUCCESS);
}
