/*   -*- coding: utf-8 -*-  */
/***********************************************************************
 
   Module   : Inra
   Commande : InraHalExplorDataShells
   Fichier  : InraHalExplorDataShells.c
   Auteur   : Jacques Ducloy
   Date     : 20/12/2015
 
************************************************************************/

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

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

SxmlNode *ExplorStepNode;
SxmlNode *ExplorStreamListSteps;

void generInraHalShellCorpusBiblio()
{
  SxmlNode *listSxmlImportFile;
  char     *strListSxmlImportFile;
  SxmlNode *fileNode;

  printf("<?dilib file=\"%s/bin/%sCorpusBiblio.sh\" ?>\n", ExplorAreaDir, ExplorStreamCode );
  printf ("#!/bin/sh\n");
  printf ("# This file is generated by Dilib / InraHal / InraHalExplorDataShells \n");
  printf ("echo \"---- Executing sh %s/bin/%sCorpusBiblio.sh\" \n", ExplorAreaDir, ExplorStreamCode );
  ExplorGenerDeleteHfd (ExplorStreamCode, "Corpus", "biblio");               /* if update */

  strListSxmlImportFile=ExplorGetFromDictK3("Area", ExplorStreamCode, "Corpus/importFile");
  if (!strListSxmlImportFile)
     {
        fprintf(stderr, "parameter * Area/%s/Corpus/importFile * is missing\n", ExplorStreamCode);
        exit(EXIT_FAILURE);
     }
  listSxmlImportFile=SxmlFromString(strListSxmlImportFile);
  printf (" (\n");
  SxmlReset (listSxmlImportFile);
  while ((fileNode=SxmlNextNode(listSxmlImportFile)))
     {
        printf ("cat %s/Import/%s   \n", ExplorAreaDir, SxmlLeafText(fileNode));
     }
  printf (" ) | InraHalToSxml  \\\n");
  printf ("   | SxmlUnIndent  \\\n");  
  printf ("   | InraHalToTei  \\\n"); 
  printf ("   | TeiPutRefToIdno -t wicri:Area/%s/Corpus  \\\n", ExplorStreamCode );
  printf ("   | HfdBuild -h %s/Data/%s/Corpus/biblio\n\n",ExplorAreaDir, ExplorStreamCode);

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

  printf("<?dilib appendFile=\"%s/bin/area.mk\" ?>\n", ExplorAreaDir );
  printf("# This part is generated by Dilib / InraHal / InraHalExplorDataShells \n");
  printf("%s/Make/%s/Corpus/biblio: ", ExplorAreaDir, ExplorStreamCode);
  SxmlReset (listSxmlImportFile);
  while ((fileNode=SxmlNextNode(listSxmlImportFile)))
     {
	printf (" \\\n");
        printf ("         %s/Import/%s", ExplorAreaDir, SxmlLeafText(fileNode));
     }
  printf("\n\tsh %s/bin/%sCorpusBiblio.sh \n", ExplorAreaDir, ExplorStreamCode );
  printf("\ttouch %s/Make/%s/Corpus/biblio\n\n", ExplorAreaDir, ExplorStreamCode);
}

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

  printf("<?dilib file=\"%s/bin/%sCurationBiblio.sh\" ?>\n", ExplorAreaDir, ExplorStreamCode );
  printf ("#!/bin/sh\n");
  printf ("# This shell has been generated by InraHalExplorDataShells \n");
  printf ("echo \"---- Executing sh $EXPLOR_AREA/bin/%sCurationBiblio.sh\" \n", ExplorStreamCode );
  ExplorGenerDeleteHfd(ExplorStreamCode, "Curation", "biblio");
  previousStep=SxmlPreviousSibling(ExplorStepNode);
  codePrevious=SxmlLeafText(previousStep);
  printf (" HfdCat $EXPLOR_AREA/Data/%s/%s/biblio.hfd \\\n", ExplorStreamCode, codePrevious);
  printf ("   | SgmlFast -c 1 \\\n");
  printf ("   | InraHalAffiliationSetCountry  \\\n");
  ExplorGenerBuildBiblio(ExplorStreamCode, "Curation", NULL);

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

void generInraHalShellCheckExplBiblio(char *step)
{
  printf("<?dilib file=\"%s/bin/%s%sBiblio.sh\" ?>\n", ExplorAreaDir, ExplorStreamCode, step );
  printf ("#!/bin/sh\n");
  printf ("# This file is generated by Dilib / InraHal / InraHalExplorDataShells / generInraHalShellCheckExplBiblio  \n");
  printf ("echo \"---- Executing sh %s/bin/%s%sBiblio.sh\" \n", ExplorAreaDir, ExplorStreamCode, step );
  ExplorGenerDeleteHfd(ExplorStreamCode, step, "biblio");
  printf (" HfdCat $EXPLOR_AREA/Data/%s/Curation/biblio.hfd \\\n", ExplorStreamCode);
  /* printf ("   | SgmlFast -c 1  \\\n"); */
  printf ("   | InraHalCurationCountry  \\\n");
  ExplorExplorationCommonOperations(ExplorStreamCode, step, 1);
  ExplorGenerBuildBiblio(ExplorStreamCode, step, NULL);
  printf("<?dilib appendFile=\"%s/bin/area.mk\" ?>\n", ExplorAreaDir );
  printf("# This part is generated by InraHalExplorDataShells /  generInraHalShellCheckExplBiblio  \n");
  printf("%s/Make/%s/%s/biblio: \\\n ", ExplorAreaDir, ExplorStreamCode, step);
  printf("                %s/Make/%s/Curation.step \n", ExplorAreaDir, ExplorStreamCode);
  printf("\tsh %s/bin/%s%sBiblio.sh\n", ExplorAreaDir, ExplorStreamCode, step );
  printf("\ttouch %s/Make/%s/%s/biblio\n\n", ExplorAreaDir, ExplorStreamCode, step);
}

void generInraHalCorpusAutAffIndex()
{
  printf("<?dilib file=\"%s/bin/%sCorpusIndexAutAff.i.sh\" ?>\n",ExplorAreaDir, ExplorStreamCode);
  printf ("#!/bin/sh\n");
  printf ("#  This shell is generated by InraHalExplorDataShells / generIndexAutAff\n");
  ExplorGenerDeleteHfd(ExplorStreamCode, "Corpus", "AutAff.i");

  printf ("(");
  printf (" HfdCat $EXPLOR_AREA/Data/%s/Corpus/biblio.hfd\\\n", ExplorStreamCode);
  printf ("    | SgmlFast -G analytic  \\\n");
  printf ("    | SxmlSelect -s analytic/author  -p @s1 -p @1  \\\n");
  printf ("    | SxmlSelect -g author/name/attribute::uniqKey -p @g1 -g author/name/1 -p @g2 -g author/affiliation/inra:affiliation/unit/name author/affiliation/inra:affiliation/name -p @g3 -p @2\n");
  printf (" ) | sort      \\\n");
  printf ("    | SxmlGrouping | HfdBuild -h $EXPLOR_AREA/Data/%s/Corpus/AutAff.i   \n", ExplorStreamCode);

  ExplorGenerShellIndexHidSort(ExplorStreamCode, "Corpus", "AutAff.i", 'g');
  ExplorGenerShellIndexMakeRules(ExplorStreamCode, "Corpus", "AutAff.i", NULL);
}

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

   pathParamFile=NULL;
   ExplorStreamCode=NULL;

   while((cOption=getopt(argc,argv,"s:t:"))!=EOF)
     {switch (cOption)
	 {
	 case 's':
	   ExplorStreamCode=optarg;
	   break;
	 case 't':
	   pathParamFile=optarg;
	   break;
	 }
     }
   if ((!pathParamFile)|| (!ExplorStreamCode)) 
     {
         perror("**** Options -s stream and -t paramFile are mandatory\n");
         exit (EXIT_FAILURE);
     }
   ExplorParamInit(pathParamFile);
   ExplorStreamListSteps=SxmlFromString(ExplorGetFromDictK3("Area", ExplorStreamCode, "listSteps"));
   ExplorGenerShellCreateData( ExplorStreamCode, ExplorStreamListSteps);

   SxmlReset(ExplorStreamListSteps);
   while ((ExplorStepNode=SxmlNextNode(ExplorStreamListSteps)))
    {
      char *stepCode;
      stepCode=SxmlLeafText(ExplorStepNode);
      if(strcmp(stepCode, "Corpus")==0)
	{
	  ExplorGenerShellCreateStep(ExplorStreamCode , stepCode);
	  generInraHalShellCorpusBiblio();
	  generInraHalCorpusAutAffIndex();
	  continue;
	}
     else if(strcmp(stepCode, "Curation")==0)
	{
	  ExplorGenerShellCreateStep(ExplorStreamCode , stepCode);
	  generInraHalShellCurationBiblio();
	  continue;
	}
     else if(strcmp(stepCode, "Checkpoint")==0)
	{
	  ExplorGenerShellCreateStep(ExplorStreamCode , stepCode);
	  generInraHalShellCheckExplBiblio(stepCode);
	  continue;
	}
    else if(strcmp(stepCode, "Exploration")==0)
	{
	  ExplorGenerShellCreateStep(ExplorStreamCode , stepCode);
	  generInraHalShellCheckExplBiblio(stepCode);
	  continue;
	}
    }
   ExplorGenerAllShellsIndex(ExplorStreamCode);
   exit (EXIT_SUCCESS);
}
