/*   -*- coding: utf-8 -*-  */
/***********************************************************************
 
   Module   : Nlm
   Commande : NlmNcbiExplorShell
   Fichier  : NlmNcbiExplorShell.c
   Auteur   : DUCLOY
   Date     : 2012
 
************************************************************************/

#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;

void generNlmNcbiShellMergeBiblio()
{
  char *mergingListStr;
  SxmlNode *mergingList;
  SxmlNode *mergingStreamNode;
  printf("<?dilib file=\"%s/bin/%sMergeBiblio.sh\" ?>\n", ExplorAreaDir, ExplorStreamCode );
  printf ("#!/bin/sh\n");
  printf ("# This shell has been generated by NlmNcbiExplorDataShells \n");
  printf ("echo \"---- Executing sh %s/bin/%sMergeBiblio.sh\" \n", ExplorAreaDir, ExplorStreamCode );
  ExplorGenerDeleteHfd(ExplorStreamCode, "Merge", "biblio");
  mergingListStr=ExplorGetFromDictK3("Area", ExplorStreamCode, "mergingList");
  mergingList=SxmlFromString(mergingListStr);
  SxmlReset(mergingList);
  printf ("(\n");
  while ((mergingStreamNode=SxmlNextNode(mergingList)))
    {
      char *mergingStreamCode;
      char *mergingStreamType;
      char *mergingStreamNlmCode;
      mergingStreamCode=SxmlLeafText(mergingStreamNode);
      mergingStreamType=ExplorGetFromDictK3("Area", mergingStreamCode, "typeStream");
      if (strcmp( mergingStreamType, "Nlm:Pmc")==0) mergingStreamNlmCode="Pmc";
      else mergingStreamNlmCode="PubMed";
      printf("  HfdCat %s/Data/%s/Checkpoint/biblio.hfd  \\\n", ExplorAreaDir, mergingStreamCode);
      printf("      | SxmlSelect -g record/TEI/teiHeader/fileDesc/publicationStmt/idno@type=pmid/1 -p @g1 -p %s -p @2\n", mergingStreamNlmCode);
    }
  printf (")  | sort   -T $DILIB_WORKSPACE | NlmNcbiMerge \\\n");
  printf ("   | TeiPutRefToIdno -t wicri:Area/%s/Merge  \\\n", ExplorStreamCode );

  printf ("   | HfdBuild -h %s/Data/%s/Merge/biblio\n\n",ExplorAreaDir, ExplorStreamCode);

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

  printf("<?dilib appendFile=\"%s/bin/area.mk\" ?>\n", ExplorAreaDir );
  printf("# This part is generated by NlmNcbiExplorDataShells /  generNlmNcbiShellMergeBiblio() \n");
  printf("%s/Make/%s/Merge/biblio: \\\n", ExplorAreaDir, ExplorStreamCode);
  SxmlReset(mergingList);
  while ((mergingStreamNode=SxmlNextNode(mergingList)))
    {
      char *mergingStreamCode;
      mergingStreamCode=SxmlLeafText(mergingStreamNode);
      printf("            %s/Make/%s/Checkpoint/biblio", ExplorAreaDir, mergingStreamCode);
      if (SxmlNextSibling(mergingStreamNode)) printf(" \\\n");
      else printf(" \n");
    }
  printf("\tsh %s/bin/%sMergeBiblio.sh \n", ExplorAreaDir, ExplorStreamCode );
  printf("\ttouch %s/Make/%s/Merge/biblio\n\n", ExplorAreaDir, ExplorStreamCode);
}


void generNlmNcbiShellAnaExplBiblio(char *step)
{
  SxmlNode *previousStep;
  char *codePrevious;

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

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

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

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

  printf("<?dilib file=\"%s/bin/%sCurationBiblio.sh\" ?>\n", ExplorAreaDir, ExplorStreamCode );
  printf ("#!/bin/sh\n");
  ExplorGenerDeleteHfd(ExplorStreamCode, "Curation", "biblio");
  previousStep=SxmlPreviousSibling(ExplorStepNode);
  codePrevious=SxmlLeafText(previousStep);
  printf (" HfdCat $EXPLOR_AREA/Data/%s/%s/biblio.hfd \\\n", ExplorStreamCode, codePrevious);
  printf ("   | ExplorCleanToTei          \\\n");
  ExplorCurationRecordOperations(ExplorStreamCode, "Curation");
  printf ("   | TeiPutRefToIdno -t wicri:Area/%s/Curation  \\\n", ExplorStreamCode );
  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 NlmNcbiExplorDataShells /  generNlmPmcShellCurationBiblio() \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 generNcbiMergePmidIndex()
{
  printf("<?dilib file=\"%s/bin/%sMergeIndexDoublePmid.i.sh\" ?>\n",ExplorAreaDir, ExplorStreamCode);
  printf ("#!/bin/sh\n");
  printf ("#  This shell is generated by NlmNcbiExplorDataShells / generrNcbiMergePmidIndex\n");
  ExplorGenerDeleteHfd(ExplorStreamCode, "Merge", "DoublePmid.i");
  printf (" HfdCat $EXPLOR_AREA/Data/%s/Merge/biblio.hfd\\\n", ExplorStreamCode);
  printf ("    | grep \"</double>\"  \\\n");
  printf ("    | SxmlSelect -g record/double/attribute::pmid -p @g1 -p @1  \\\n");
  printf ("    | sort -u   -T $DILIB_WORKSPACE     \\\n");
  printf ("    | IndexFastBuildRec  \\\n");
  printf ("    | HfdBuild -h $EXPLOR_AREA/Data/%s/Merge/DoublePmid.i \n\n", ExplorStreamCode);

  ExplorGenerShellIndexHidSort(ExplorStreamCode, "Merge", "DoublePmid.i", 'i');
  ExplorGenerShellIndexMakeRules(ExplorStreamCode, "Merge", "DoublePmid.i", NULL);
}

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

  char *pathParamFile;

  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);

   SxmlReset(streamListSteps);
   while ((ExplorStepNode=SxmlNextNode(streamListSteps)))
    {
      char *stepCode;
      stepCode=SxmlLeafText(ExplorStepNode);
      if(strcmp(stepCode, "Merge")==0)
	{
	  ExplorGenerShellCreateStep(ExplorStreamCode , stepCode);
	  generNlmNcbiShellMergeBiblio();
	  generNcbiMergePmidIndex();
	  continue;
	}
      if(strcmp(stepCode, "Analysis")==0)
	{
	  ExplorGenerShellCreateStep(ExplorStreamCode , stepCode);
	  generNlmNcbiShellAnaExplBiblio("Analysis");
	  continue;
	}
      if(strcmp(stepCode, "Exploration")==0)
	{
	  ExplorGenerShellCreateStep(ExplorStreamCode , stepCode);
	  generNlmNcbiShellAnaExplBiblio("Exploration");
	  continue;
	}
      if(strcmp(stepCode, "Checkpoint")==0)
	{
	  ExplorGenerShellCreateStep(ExplorStreamCode , stepCode);
	  generNlmNcbiShellAnaExplBiblio("Checkpoint");
	  continue;
	}
      if(strcmp(stepCode, "Curation")==0)
	{
	  ExplorGenerShellCreateStep(ExplorStreamCode , stepCode);
	  generNlmNcbiShellCurationBiblio();
	  continue;
	}
    }
   ExplorGenerAllShellsIndex(ExplorStreamCode);
   exit (EXIT_SUCCESS);
}
