/*   -*- coding: utf-8 -*-  */
/***********************************************************************

   Module   : Explor
   Commande : ExplorZoomDataShell
   Fichier  : ExplorZoomDataShell.c
   Auteur   : DUCLOY
   Date     : 2013
 
************************************************************************/

#include <stdio.h>     /* for printf */
#include <stdlib.h>    /* for exit */
#include "Explor.h"

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

SxmlNode *ExplorStepNode;
SxmlNode *streamListSteps;

#define EXPLOR_ZOOM_INDEX_SELECT   1
#define EXPLOR_ZOOM_SAMPLE         2
#define EXPLOR_ZOOM_BIBLIO_FILTER  3
int ExplorZoomType;

void generExplorZoomExtractionBiblio()
{
  char *codePrevious;
  char *extractionFilter;
  SxmlNode *extractionCommand;
  char *strExtractionCommand;
  char *extractionItem;
  SxmlNode *extractionNode;
  char *implicitIndex;
  codePrevious=ExplorGetFromDictK2("Area", "mainLastStep");
  printf("<?dilib file=\"%s/bin/%sExtractionBiblio.sh\" ?>\n", ExplorAreaDir, ExplorStreamCode );
  printf ("#!/bin/sh\n");
  printf ("# This shell is generated by ExplorZoomDataShells \n");
  ExplorGenerDeleteHfd(ExplorStreamCode, "Extraction", "biblio");

  switch (ExplorZoomType)
    {
    case EXPLOR_ZOOM_SAMPLE:
    case EXPLOR_ZOOM_BIBLIO_FILTER:
      extractionFilter=ExplorGetFromDictK4("Area", ExplorStreamCode, "Extraction", "extractionFilter");
      printf (" HfdCat %s/Data/Main/%s/biblio.hfd \\\n", ExplorAreaDir, codePrevious);
      printf ("   | SgmlFast -c 1 \\\n"); 
      printf ("   | %s     \\\n", extractionFilter);
      break;
    case EXPLOR_ZOOM_INDEX_SELECT:
      implicitIndex="Wicri.i";
      strExtractionCommand=ExplorGetFromDictK4("Area", ExplorStreamCode, "Extraction", "selectOrCommand");
      extractionCommand=SxmlFromString(strExtractionCommand);
      printf (" ( \n");
      SxmlReset(extractionCommand);
      while ((extractionNode=SxmlNextNode(extractionCommand)))
	{
	  extractionItem=SxmlLeafText(extractionNode);
	  if (extractionItem[0]==':')
	    {
	      implicitIndex=extractionItem+1;
	    }
	  else if (extractionItem[0]=='@')
	    {
	      printf ("   cat %s \\\n", extractionItem+6);
	      printf ("     |  HfdIndexSelect -ISh $EXPLOR_AREA/Data/Main/%s/%s   \n", codePrevious, implicitIndex);
	    }
	  else
	    {
	      printf ("   HfdIndexSelect -h $EXPLOR_AREA/Data/Main/%s/%s -Sk \"%s\"  \n", codePrevious, implicitIndex, extractionItem);
	    }
	}
      printf (" ) |sort -u  \\\n");
      printf ("  | HfdSelect -h  $EXPLOR_AREA/Data/Main/%s/biblio \\\n", codePrevious);
      break;
    }

  printf ("   | TeiPutRefToIdno -t wicri:Area/%s/Extraction  \\\n", ExplorStreamCode );
  printf ("   | HfdBuild -h %s/Data/%s/Extraction/biblio\n\n",ExplorAreaDir, ExplorStreamCode);

  printf (" echo \"==== \" %s, step Extraction, biblio done\n", ExplorStreamCode);
  printf (" HfdCat %s/Data/%s/Extraction/biblio.hfd | wc \n", ExplorAreaDir, ExplorStreamCode);

  printf("<?dilib appendFile=\"%s/bin/area.mk\" ?>\n", ExplorAreaDir );
  printf("# This part is generated by InistExplorDataShells /  generInistShellCurationBiblio() \n");
  printf("%s/Make/%s/Extraction/biblio: \\\n", ExplorAreaDir, ExplorStreamCode);
  printf("                %s/Make/Main/%s.step \n", ExplorAreaDir, codePrevious);
  printf("\tsh %s/bin/%sExtractionBiblio.sh \n", ExplorAreaDir, ExplorStreamCode );
  printf("\ttouch %s/Make/%s/Extraction/biblio\n\n", ExplorAreaDir, ExplorStreamCode);
}

void generExplorZoomCurationBiblio()
{
  SxmlNode *previousStep;
  char *codePrevious;

  printf("<?dilib file=\"%s/bin/%sCurationBiblio.sh\" ?>\n", ExplorAreaDir, ExplorStreamCode );
  printf ("#!/bin/sh\n");
  previousStep=SxmlPreviousSibling(ExplorStepNode);
  codePrevious=SxmlLeafText(previousStep);
  ExplorGenerDeleteHfd(ExplorStreamCode, "Curation", "biblio");
  printf (" HfdCat %s/Data/%s/%s/biblio.hfd \\\n", ExplorAreaDir, ExplorStreamCode, codePrevious);
  printf ("   | SgmlFast -c 1  \\\n");
  printf ("   | HfdBuild -h %s/Data/%s/Curation/biblio\n\n",ExplorAreaDir, ExplorStreamCode);

  printf (" echo \"==== \" %s, step Curation, biblio done\n", ExplorStreamCode);
  printf (" HfdCat %s/Data/%s/Curation/biblio.hfd | wc \n", ExplorAreaDir, ExplorStreamCode);

  printf("<?dilib appendFile=\"%s/bin/area.mk\" ?>\n", ExplorAreaDir );
  printf("# This part is generated by CcsdExplorDataShells /  generCcsdShellCurationBiblio() \n");
  printf("%s/Make/%s/Curation/biblio: \\\n", ExplorAreaDir, ExplorStreamCode);
  printf("                %s/Make/%s/%s.step \n", ExplorAreaDir, ExplorStreamCode, codePrevious);
  printf("\tsh %s/bin/%sCurationBiblio.sh \n", ExplorAreaDir, ExplorStreamCode );
  printf("\ttouch %s/Make/%s/Curation/biblio\n\n", ExplorAreaDir, ExplorStreamCode);

}

void generExplorZoomAnalysisBiblio()
{
  printf("<?dilib file=\"%s/bin/%sAnalysisBiblio.sh\" ?>\n", ExplorAreaDir, ExplorStreamCode );
  printf ("#!/bin/sh\n");

  ExplorGenerDeleteHfd(ExplorStreamCode, "Analysis", "biblio");
  printf (" HfdCat %s/Data/%s/Curation/biblio.hfd \\\n", ExplorAreaDir, ExplorStreamCode);
  printf ("   | SgmlFast -c 1  \\\n");
  printf ("   | HfdBuild -h %s/Data/%s/Analysis/biblio\n\n",ExplorAreaDir, ExplorStreamCode);

  printf (" echo \"==== \" %s, step Analysis, biblio done\n", ExplorStreamCode);
  printf (" HfdCat %s/Data/%s/Analysis/biblio.hfd | wc \n", ExplorAreaDir, ExplorStreamCode);

  printf("<?dilib appendFile=\"%s/bin/area.mk\" ?>\n", ExplorAreaDir );
  printf("# This part is generated by ExplorZoomDataShells /  generCcsdShellAnaExplBiblio  \n");
  printf("%s/Make/%s/Analysis/biblio: \\\n ", ExplorAreaDir, ExplorStreamCode);
  printf("                %s/Make/%s/Curation.step \n", ExplorAreaDir, ExplorStreamCode);
  printf("\tsh %s/bin/%sAnalysisBiblio.sh\n", ExplorAreaDir, ExplorStreamCode );
  printf("\ttouch %s/Make/%s/Analysis/biblio\n\n", ExplorAreaDir, ExplorStreamCode);
}

int main (int argc, char **argv) {
  int cOption;

  char *pathParamFile;
  char *typeStreamStr;

  pathParamFile=NULL;
  
   while((cOption=getopt(argc,argv,"s:t:"))!=EOF)
     {switch (cOption)
	 {
	 case 's':
	   ExplorStreamCode=optarg;
	   break;
	 case 't':
	   pathParamFile=optarg;
	   break;
	 }
     }

   ExplorParamInit(pathParamFile);
   streamListSteps=SxmlFromString(ExplorGetFromDictK3("Area", ExplorStreamCode, "listSteps"));
   ExplorGenerShellCreateData( ExplorStreamCode, streamListSteps);

   typeStreamStr=ExplorGetFromDictK3("Area", ExplorStreamCode, "typeStream");
   switch(typeStreamStr[7])  /* Explor: */
     {
     case 'B':              /* BiblioFilter */
       ExplorZoomType=EXPLOR_ZOOM_BIBLIO_FILTER;
       break;
     case 'S':              /* Sample */
       ExplorZoomType=EXPLOR_ZOOM_SAMPLE;
       break;
     case 'I':              /* IndexSelect */
       ExplorZoomType=EXPLOR_ZOOM_INDEX_SELECT;
       break;
     }

   SxmlReset(streamListSteps);
   while ((ExplorStepNode=SxmlNextNode(streamListSteps))) 
    {
      char *stepCode;
      stepCode=SxmlLeafText(ExplorStepNode);
      if(strcmp(stepCode, "Extraction")==0)
	{
	  ExplorGenerShellCreateStep(ExplorStreamCode , stepCode);
	  generExplorZoomExtractionBiblio();
	  continue;
	}
      if(strcmp(stepCode, "Curation")==0)
	{
	  ExplorGenerShellCreateStep(ExplorStreamCode , stepCode);
	  generExplorZoomCurationBiblio();
	  continue;
	}
      if(strcmp(stepCode, "Analysis")==0)
	{
	  ExplorGenerShellCreateStep(ExplorStreamCode , stepCode);
	  generExplorZoomAnalysisBiblio();
	  continue;
	}
    }
   ExplorGenerAllShellsIndex(ExplorStreamCode);
   exit (EXIT_SUCCESS);
}
