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

   Module   : Explor
   Commande : ExplorMainExplorDataShell
   Fichier  : ExplorMainExplorDataShell.c
   Auteur   : DUCLOY
   Date     : 2012
 
************************************************************************/

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

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

SxmlNode *ExplorStepNode;
SxmlNode *streamListSteps;

void generExplorMainShellMergeBiblio()
{
  char *mergingListStr;
  SxmlNode *mergingList;
  SxmlNode *mergingStreamNode;
  printf("<?dilib file=\"%s/bin/%sMergeBiblio.sh\" ?>\n", ExplorAreaDir, ExplorStreamCode );
  printf ("#!/bin/sh\n");
  ExplorGenerDeleteHfd(ExplorStreamCode, "Merge", "biblio");
  mergingListStr=ExplorGetFromDictK3("Area", ExplorStreamCode, "mergingList");
  if (!mergingListStr)
    {
      ExceptSetError("ExplorMain", "PA", "Parameter","mergingList","not founded", 1);
    }
  mergingList=SxmlFromString(mergingListStr);
  SxmlReset(mergingList);
  printf ("(\n");
  while ((mergingStreamNode=SxmlNextNode(mergingList)))
    {
      SxmlNode *mergingTreeStreamNode;
      SxmlNode *lastStepNode;
      char *mergingStreamCode;
      mergingStreamCode=SxmlLeafText(mergingStreamNode);
      mergingTreeStreamNode=ExplorAreaTreeNode(mergingStreamCode, NULL, NULL);
      lastStepNode=SxmlLastChild(mergingTreeStreamNode);
      printf("  HfdCat %s/Data/%s/%s/biblio.hfd \n", ExplorAreaDir, mergingStreamCode, SxmlGetAttribute(lastStepNode,"code"));
    }
  printf (")  |  SxmlSelect -n NONE -g record/TEI/teiHeader/fileDesc/publicationStmt/idno@type=doi/1 -p @g1 -p @2  \\\n");
  printf ("   | sort -T $DILIB_WORKSPACE | ExplorMergeFromCheckpoint \\\n");
  printf ("   | SxmlSelect -g record/TEI/teiHeader/fileDesc/publicationStmt/date/attribute::when -p @g1 -p @1 \\\n");
  printf ("   | sort -rn -T $DILIB_WORKSPACE \\\n");
  printf ("   | SgmlFast -c 1  \\\n");
  ExplorCurationRecordOperations(ExplorStreamCode, "Merge");
  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 ExploMainExplorDataShells /  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 generExplorMainShellCurationBiblio()
{
  SxmlNode *previousStep;
  char *codePrevious;

  printf("<?dilib file=\"%s/bin/%sCurationBiblio.sh\" ?>\n", ExplorAreaDir, ExplorStreamCode );
  printf ("#!/bin/sh\n");
  printf ("# This file is generated by Dilib / Explor / ExplorMainExplorDataShell.c / generExplorShellCurationBiblio  \n");
  ExplorGenerDeleteHfd(ExplorStreamCode, "Curation", "biblio");
  previousStep=SxmlPreviousSibling(ExplorStepNode);
  codePrevious=SxmlLeafText(previousStep);
  printf (" HfdCat %s/Data/%s/%s/biblio.hfd \\\n", ExplorAreaDir, ExplorStreamCode, codePrevious);
  printf ("   |  SxmlSelect -n NONE -g record/TEI/teiHeader/fileDesc/publicationStmt/idno@type=wicri:doubleKey/1 -p @g1 -p @2  \\\n");
  printf ("   | sort -T $DILIB_WORKSPACE| ExplorMergeCuration \\\n");
  printf ("   | SxmlSelect -g record/TEI/teiHeader/fileDesc/publicationStmt/date/attribute::when -p @g1 -p @1 \\\n");
  printf ("   | sort -rn  -T $DILIB_WORKSPACE \\\n");
  printf ("   | SgmlFast -c 1  \\\n");
  /*  printf ("   | SgmlFast -c 1  \\\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 ExplorMainExplorDataShells /  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 generExplorMainShellExplorationBiblio()
{
  SxmlNode *previousStep;
  char *codePrevious;
  printf("<?dilib file=\"%s/bin/%sExplorationBiblio.sh\" ?>\n", ExplorAreaDir, ExplorStreamCode );
  printf ("#!/bin/sh\n");

  previousStep=SxmlPreviousSibling(ExplorStepNode);
  codePrevious=SxmlLeafText(previousStep);
  ExplorGenerDeleteHfd(ExplorStreamCode, "Exploration", "biblio");
  printf (" HfdCat %s/Data/%s/%s/biblio.hfd \\\n", ExplorAreaDir, ExplorStreamCode, codePrevious);
  printf ("    | ExplorMergeExploration \\\n");
  ExplorCurationRecordOperations(ExplorStreamCode, "Exploration");
  printf ("   | TeiPutRefToIdno -t wicri:Area/%s/Exploration  \\\n", ExplorStreamCode );
  printf ("   | TeiBuildAffiliationTree    \\\n");
  printf ("   | HfdBuild -h %s/Data/%s/Exploration/biblio\n\n",ExplorAreaDir, ExplorStreamCode);

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

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

void generExplorMergeIndexAutAff(char *step)
{
  printf("<?dilib file=\"%s/bin/%s%sIndexAutAff.i.sh\" ?>\n", ExplorAreaDir, ExplorStreamCode, step );
  printf ("#!/bin/sh\n");
  printf ("#  This shell is generated by ExplorMainExplorDataShells / generIndexAutAff\n");
  ExplorGenerDeleteHfd(ExplorStreamCode, step, "AutAff.i");
  printf ("(");
  printf (" HfdCat %s/Data/%s/%s/biblio.hfd\\\n", ExplorAreaDir, ExplorStreamCode, step);
  printf ("  | SxmlSelect -s record/TEI/teiHeader/fileDesc/sourceDesc/biblStruct/analytic/author -p @s1 -p @1  \\\n"); 
  printf ("  | SxmlSelect -s author/name/attribute::uniqKey -p @s1 -g author/name/1 -p @g1   \\\n");
  printf (" -s author/affiliation author/affiliation/wicri:noCountry -p @s2  -p @2       \n\n");

  printf (" HfdCat %s/Data/%s/%s/biblio.hfd\\\n", ExplorAreaDir, ExplorStreamCode, step);
  printf ("  | SxmlSelect -s record/TEI/teiHeader/fileDesc/sourceDesc/biblStruct/analytic/author -p @s1 -p @1  \\\n"); 
  printf ("  | grep -v \"</affiliation>\"     \\\n");   
  printf ("  | SxmlSelect -s author/name/attribute::uniqKey -p @s1 -g author/name/1 -p @g1   \\\n");
  printf ("          -p \"<affiliation>NONE</affiliation>\"   -p @2       \n\n");

  printf (" HfdCat %s/Data/%s/%s/biblio.hfd\\\n", ExplorAreaDir, ExplorStreamCode, step);
  printf ("  |  SxmlSelect -s record/TEI/back/div1@type=bibliography/listBibl/biblStruct/analytic/author -p @s1 -p @1  \\\n");
  printf ("  |  SxmlSelect -s author/name/attribute::uniqKey -p @s1 -g author/name/1 -p @g1   \\\n");
  printf ("          -p \"<affiliation>NONE (BIBLIO)</affiliation>\"   -p @2       \n\n");


  printf (" ) | sort  -u  -T $DILIB_WORKSPACE   \\\n");
  printf ("  | SxmlGrouping | HfdBuild -h %s/Data/%s/%s/AutAff.i   \n",  ExplorAreaDir,  ExplorStreamCode, step );
 printf (" IndexBuildHid -h %s/Data/%s/%s/AutAff.i -e k   \n", ExplorAreaDir, ExplorStreamCode, step);

  printf (" HfdCat %s/Data/%s/%s/AutAff.i.hfd     \\\n", ExplorAreaDir, ExplorStreamCode, step);
  printf ("      |  SgmlSelect -g g/t# -g g/k# -p @g1 -p \"<idx><kw>@g2</kw><f>@g1</f></idx>\"     \\\n");
  printf ("      | sort -rn  -T $DILIB_WORKSPACE   \\\n");
  printf ("      | SgmlFast -c 1     \\\n");
  printf ("      | head -500 > %s/Data/%s/%s/AutAff.i.sort    \n", ExplorAreaDir, ExplorStreamCode, step);

  printf (" echo \"==== \" %s, step %s, index aut-aff done\n", ExplorStreamCode, step);
  printf (" HfdCat %s/Data/%s/%s/AutAff.i.hfd | wc \n", ExplorAreaDir, ExplorStreamCode, step);

  printf("<?dilib appendFile=\"%s/bin/area.mk\" ?>\n", ExplorAreaDir );
  printf("# This part is generated by ExplorMainExplorDataShells / generIndexAutAff \n");
  printf("%s/Make/%s/%s/AutAff.i.index:  \\\n ", ExplorAreaDir, ExplorStreamCode, step);
  printf("                %s/Make/%s/%s/biblio \n", ExplorAreaDir, ExplorStreamCode, step);
  printf("\tsh %s/bin/%s%sIndexAutAff.i.sh \n", ExplorAreaDir, ExplorStreamCode, step );
  printf("\ttouch %s/Make/%s/%s/AutAff.i.index \n\n", ExplorAreaDir, ExplorStreamCode, step);
}

void generExplorMergeIndexDoubleDoi()
{
   printf("<?dilib file=\"%s/bin/MainMergeIndexDoubleDoi.i.sh\" ?>\n", ExplorAreaDir);
   printf ("#!/bin/sh\n");
   printf ("#  This shell is generated by ExplorMainExplorDataShells / generExplorMergeIndexDoubleDoi\n");
   ExplorGenerDeleteHfd("Main", "Merge", "DoubleDoi.i");
   printf (" HfdCat $EXPLOR_AREA/Data/Main/Merge/biblio.hfd\\\n");
   /* printf ("  | SxmlSelect -g record/TEI/teiHeader/fileDesc/publicationStmt/idno@type=wicri:doubleKey/1 -p k:@g1 -p @1 \n"); */
   printf ("    | SxmlSelect -g record/double/attribute::doi -p @g1 -p @1  \\\n");
   printf ("  | sort  -u    \\\n");
   printf ("| IndexFastBuildRec \\\n");
   printf ("| HfdBuild -h $EXPLOR_AREA/Data/Main/Merge/DoubleDoi.i   \n");

  ExplorGenerShellIndexHidSort("Main", "Merge", "DoubleDoi.i", 'i');
  ExplorGenerShellIndexMakeRules("Main", "Merge", "DoubleDoi.i", NULL);

  /* printf (" IndexBuildHid -h %s/Data/%s/%s/Double.i -e k   \n", ExplorAreaDir, ExplorStreamCode, step); */
}

void generExplorMergeIndexDoubleIdat()
{
   printf("<?dilib file=\"%s/bin/MainCurationIndexDoubleIdat.i.sh\" ?>\n", ExplorAreaDir);
   printf ("#!/bin/sh\n");
   printf ("#  This shell is generated by ExplorMainExplorDataShells / generExplorMergeIndexDoubleIdat\n");
   ExplorGenerDeleteHfd("Main", "Curation", "DoubleIdat.i");
   printf (" HfdCat $EXPLOR_AREA/Data/Main/Curation/biblio.hfd\\\n");
   printf ("    | SxmlSelect -g record/double/attribute::idat -p @g1 -p @1  \\\n");
   printf ("  | sort  -u    \\\n");
   printf ("| IndexFastBuildRec \\\n");
   printf ("| HfdBuild -h $EXPLOR_AREA/Data/Main/Curation/DoubleIdat.i   \n");

  ExplorGenerShellIndexHidSort("Main", "Curation", "DoubleIdat.i", 'i');
  ExplorGenerShellIndexMakeRules("Main", "Curation", "DoubleIdat.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);
	  generExplorMainShellMergeBiblio();
	  generExplorMergeIndexDoubleDoi(); 
	  continue;
	}
      if(strcmp(stepCode, "Curation")==0)
	{
	  ExplorGenerShellCreateStep(ExplorStreamCode , stepCode);
	  generExplorMainShellCurationBiblio();
	  generExplorMergeIndexDoubleIdat(); 
	  continue;
	}
      if(strcmp(stepCode, "Exploration")==0)
	{
	  ExplorGenerShellCreateStep(ExplorStreamCode , stepCode);
	  generExplorMainShellExplorationBiblio();
	  continue;
	}
    }
   /* ExplorGenerAllShellsIndex(ExplorStreamCode, streamListSteps); */
   ExplorGenerAllShellsIndex(ExplorStreamCode);
   generExplorMergeIndexAutAff("Merge");
   exit (EXIT_SUCCESS);
}
