/**********************************************************************
*
*  module   : Hfd
*  commande : HfdIndexBuildHid
*  fichier  : HfdIndexBuildHid.c
*  Auteur   : Jacques DUCLOY
*  Date     : Décembre 2014
*
***********************************************************************/
 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "StrDict.h"

#include "SxPath.h"
#include "HfdIndex.h"

char *SgmlStrGetLeaf(char *s1, char *tag);

void perror();

static  HfdHcb   *hfdIndex;
static  char     *tagEntryName;
static  char     *tagList;
static  char     *tagItem;
static  char     *tagWeight;
static  char     *formatWeight;

    int getopt();
    extern char *optarg;
    extern int optind;

void usage()
{
  perror ("usage: HfdIndexBuildHid -h hfdName [ -e entryName -n ]\n");
  exit(1);
}

int main(int argc, char **argv)
{
  int             cod_arg;
  int             flagHfd;
  int             flagWrite;
  char           *hfdName;
  HfdIterator    *iterator;
  FILE           *currentFile;
  FILE           *outputFile;
  char           *fileName;
  Buffer         *inputBuffer;
  char           *bufferString;
  char           *hidName;
  SxmlNode       *pathList;  
  char           *nextOptArg;

  flagHfd=0;
  flagWrite=1;

  tagEntryName="key";
  tagList="list";
  tagItem="li";
  tagWeight="w";
  formatWeight="%.2f";
  pathList=NULL;

  while ((cod_arg = getopt(argc,argv,"nh:e:l:i:w:W:p:"))!=EOF)
    {switch(cod_arg)
     {
     case 'h' :
       hfdName=optarg;
       if((hfdIndex=HfdOpenReadKey(hfdName)))
	 {
	   flagHfd=1;
	   break;
	 }
      else
	{
	  perror("HFD not founded\n");
	  usage();
	}
       break;
     case 'e':
       tagEntryName=optarg;
       break;
     case 'p':
       if(!pathList)pathList=SxmlElementCreate("pathlist");
       SxmlAppendChild(pathList, SxmlLeafCreate("path", optarg));
       while(optind-1<argc)
	 {
	   nextOptArg=argv[optind];
	   if(!nextOptArg)break;
	   if(nextOptArg[0]=='-')break;
	   SxmlAppendChild(pathList, SxmlLeafCreate("path", nextOptArg));
	   optind++;
	 }
       break;
     case 'i':
       tagItem=optarg;
       break;
     case 'l':
       tagList=optarg;
       break;
     case 'n':
       flagWrite=0;
       break;
     case 'w':
       tagWeight=optarg;
       break;
     case 'W':
       formatWeight=optarg;
       break;
     default: usage();
       break;
     }
   }
  if(!flagHfd) usage();

  hidName=malloc(strlen(hfdIndex->name)+5);
  strcpy(hidName, hfdIndex->name);
  strcat(hidName, ".hid");

  if (flagWrite) outputFile=fopen(hidName,"w");
  else outputFile=stdout;

  iterator=HfdIteratorCreate('h');
  HfdIteratorInit(iterator,hfdIndex->rootPath );
  inputBuffer=BufferCreate(1000,1000);

  while((fileName=HfdNextFilePath(iterator)))
    {
      char c;
      currentFile=fopen(fileName,"r");
      if((bufferString=BufferFgets(inputBuffer,currentFile)))
	{
	  fprintf(outputFile,"%s\t",SgmlStrGetLeaf(bufferString,tagEntryName));
	  while((c=*bufferString++)!='\t')
	    {
	      putc(c,outputFile);
	    }
	  putc('\n',outputFile);
	}
      fclose(currentFile);
    }

  if(flagWrite)
    {
      SxmlNode  *descIndex;
      SxmlNode  *descList;

      descIndex =SxmlElementCreate("index");
      descList  =SxmlElementCreate("list");
      SxmlAppendChild(descIndex, SxmlLeafCreate("tag" ,tagEntryName));
      SxmlAppendChild(descList , SxmlLeafCreate("tagl",tagList));
      SxmlAppendChild(descList , SxmlLeafCreate("tagi",tagItem));
      SxmlAppendChild(descList , SxmlLeafCreate("tagw",tagWeight));
      SxmlAppendChild(descList , SxmlLeafCreate("forw",formatWeight));
      SxmlAppendChild(hfdIndex->desc, descIndex);
      if(pathList)SxmlAppendChild(descIndex, pathList);
      SxmlAppendChild(descIndex, descList);
      HfdHcbPrint(hfdIndex);
    }
  return 0;
}


