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

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

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

void generAreaReset()
{
  SxmlNode *item;
  printf("<?dilib file=\"%s/bin/AreaReset.sh\" ?>\n", ExplorAreaDir );
  printf ("#!/bin/sh\n\n");
  printf ("# This shell is generated by ExplorGenerShell \n");
  printf ("if [ -d \"$EXPLOR_AREA\" ]; then\n");
  printf ("rm -rf $EXPLOR_AREA/bin \n");
  printf ("rm -rf $EXPLOR_AREA/Input \n" );
  printf ("rm -rf $EXPLOR_AREA/Site\n" );
  printf ("rm -rf $EXPLOR_AREA/Data\n" );
  printf ("rm -rf $EXPLOR_AREA/Make\n" );
  printf ("fi\n");
}

void generAreaResetSite()
{
  printf("<?dilib file=\"%s/bin/AreaResetSite.sh\" ?>\n", ExplorAreaDir );
  printf ("#!/bin/sh\n\n");
  printf ("# This shell is generated by ExplorGenerShell \n");
  printf ("rm -rf %s/Site\n", ExplorAreaDir );
}

void generAreaResetLight()
{
  printf("<?dilib file=\"%s/bin/AreaResetLight.sh\" ?>\n", ExplorAreaDir );
  printf ("#!/bin/sh\n\n");
  printf ("# This shell is generated by ExplorGenerShell \n");
  printf ("rm -rf %s/bin \n", ExplorAreaDir );
  printf ("rm -rf %s/Input \n", ExplorAreaDir );
  printf ("rm -rf %s/Site\n", ExplorAreaDir );
}

void generAreaGenerShells()
{
    printf("<?dilib file=\"%s/bin/AreaGenerShells.sh\" ?>\n", ExplorAreaDir );
    printf ("#!/bin/sh\n\n");
    printf ("ExplorGenerShell -t %s/Input/AreaParam.data.tab | HfdStoreFile\n", ExplorAreaDir );
    printf ("sh %s/bin/AreaGenerStreamShells.sh\n", ExplorAreaDir );
}

void generAreaShellCreateData()
{
  SxmlNode *item;
  printf("<?dilib file=\"%s/bin/AreaCreateData.sh\" ?>\n", ExplorAreaDir );
  printf ("#!/bin/sh\n\n");
  printf ("# This shell is generated by ExplorGenerShell \n");
  printf ("echo \"---- Executing sh %s/bin/AreaCreateData.sh\"\n", ExplorAreaDir );
  printf ("\nexport LC_ALL=\"C\"\n\n");

  SxmlReset (ExplorListStream);
  while ((item=SxmlNextNode(ExplorListStream)))
    {
      printf ("sh %s/bin/%sCreateData.sh\n", ExplorAreaDir, SxmlLeafText(item) );
    }
}

void generAreaShellCreateSite(int mode, char *lang) /* 1:old ; 2 test, 3 new */
{
  SxmlNode *itemNode;
  SxmlNode *streamNode;
  char *listNsStr;
  SxmlNode *listNS;
  SxmlNode *nodeNS;

  listNsStr=ExplorGetFromDictK2 ("Area", "listNS");
  listNS=SxmlFromString(listNsStr);

  switch(mode)
    {
    case '1':
      printf("<?dilib file=\"%s/bin/AreaCreateSite.sh\" ?>\n", ExplorAreaDir );
      break;   
    case '2':
      printf("<?dilib file=\"%s/bin/AreaCreateSiteTest.sh\" ?>\n", ExplorAreaDir );
      break;   
    case '3':
      printf("<?dilib file=\"%s/bin/AreaCreateSite.%s.sh\" ?>\n", ExplorAreaDir, lang );
      break;   
    }

  printf ("#!/bin/sh\n\n");
  printf ("# This shell is generated by ExplorGenerShell / generAreaShellCreateSite\n\n");

  SxmlReset (ExplorListStream);
  printf ("(\n");
  printf ("   cat $DILIB/data/Explor/param.en.tab\n");
  while ((streamNode=SxmlNextNode(ExplorListStream)))
    {
      char *stream;
      char *typeStream;
      char *paramRootFile;
      stream=SxmlLeafText(streamNode);
      typeStream=ExplorGetFromDictK3 ("Area", stream, "typeStream");
      paramRootFile=ExplorGetFromDictK2 (typeStream, "langTable/en");
      printf ("   cat %s\n", paramRootFile);
    }
  printf (") >  %s/Input/AreaSiteParam.subset.root.tab   \n\n",  ExplorAreaDir);

  printf (" ExplorGenerSiteParam -l root -t %s/Input/AreaParam.data.tab <  %s/Input/AreaSiteParam.subset.root.tab | HfdStoreFile\n", ExplorAreaDir, ExplorAreaDir);

  printf ("echo \"====\" %s Site, generic parameters done \"====\" \n", ExplorAreaDir );

  printf ("ExplorGenerSiteShell -t %s/Input/AreaParam.data.tab | HfdStoreFile \n", ExplorAreaDir );

  printf ("sh %s/bin/SiteMkdir.sh \n", ExplorAreaDir );
  SxmlReset (ExplorListStream);
  while ((itemNode=SxmlNextNode(ExplorListStream)))
    {
      char *stream;
      char *typeStream;
      char *generCommand;
      stream= SxmlLeafText(itemNode);
      typeStream=ExplorGetFromDictK3 ("Area", stream, "typeStream");
      generCommand=ExplorGetFromDictK2 (typeStream, "generSiteShell");
      if (!generCommand)
	{
	  ExceptSetError("ExplorGenerShell", "NT"," generSiteShell for", typeStream , " not founded in param table.",1);
	  exit(1);
	}
      printf ("%s -t %s/Input/AreaParam.data.tab -s %s | HfdStoreFile\n", generCommand, ExplorAreaDir, stream);
      printf ("echo \"--- %s done \"\n", generCommand);
      printf ("sh %s/bin/%sSiteMkdir.sh \n", ExplorAreaDir, stream);
    }
  printf ("echo \"====\" %s Site, Common done \"====\" \n", ExplorAreaDir );

  switch(mode)
    {
    case '1':
      printf ("ExplorParamFromWiki < %s/Import/WicriAreaParam.%s.wiki > %s/Input/WicriAreaParam.%s.tab\n",
	      ExplorAreaDir, lang, ExplorAreaDir, lang);
      break;   
    case '2':
      printf ("(\n");
      printf ("ExplorParamFromWiki < %s/Import/WicriAreaParam.%s.wiki \n", ExplorAreaDir, lang);
      printf ("ExplorParamFromWikiTable < %s/Import/WicriAreaSiteParam.%s.wiki \n", ExplorAreaDir, lang);
      printf (") > %s/Input/WicriAreaParam.%s.tab \n",  ExplorAreaDir, lang);
      break;   
    case '3':
      printf ("ExplorParamFromWikiTable < %s/Import/WicriAreaSiteParam.%s.wiki > %s/Input/WicriAreaParam.%s.tab\n",
	      ExplorAreaDir, lang, ExplorAreaDir, lang);
      break; 
    }

  printf ("echo \"----\" %s Site,  WicriAreaParam.%s  done \"----\" \n", ExplorAreaDir, lang );
  SxmlReset (ExplorListStream);
  printf ("(\n");
  printf ("   cat $DILIB/data/Explor/param.%s.tab\n", lang);
  while ((streamNode=SxmlNextNode(ExplorListStream)))
    {
      char *stream;
      char *typeStream;
      char *paramRootFile;
      stream=SxmlLeafText(streamNode);
      typeStream=ExplorGetFromDictK3 ("Area", stream, "typeStream");
      paramRootFile=ExplorGetFromDictK3 (typeStream, "langTable", lang);
      printf ("   cat %s\n", paramRootFile);
    }
  printf ("   cat %s/Input/WicriAreaParam.%s.tab\n" ,ExplorAreaDir, lang );
  printf (") >  %s/Input/AreaSiteParam.subset.%s.tab   \n\n",  ExplorAreaDir, lang);
  printf (" ExplorGenerSiteParam -t %s/Input/AreaSiteParam.root.tab -l %s < %s/Input/AreaSiteParam.subset.%s.tab | HfdStoreFile\n",ExplorAreaDir, lang, ExplorAreaDir, lang );
  printf ("cp %s/Input/AreaSiteParam.%s.tab %s/Site/Common/AreaParam.%s.tab\n",
	  ExplorAreaDir, lang, ExplorAreaDir,lang );
  
  printf ("ExplorGenerSite -t %s/Input/AreaSiteParam.%s.tab | HfdStoreFile \n", ExplorAreaDir, lang );
  SxmlReset (ExplorListStream);
  while ((itemNode=SxmlNextNode(ExplorListStream)))
    {
      char *stream;
      /*	  char *dilibMod; */
      char *typeStream;
      char *generCommand;
      stream= SxmlLeafText(itemNode);
      typeStream=ExplorGetFromDictK3 ("Area", stream, "typeStream");
      generCommand=ExplorGetFromDictK2 (typeStream, "generSiteHtmlPhp");
      /*	  dilibMod=ExplorGetFromDictK3("Area", stream, "dilibPrefix"); */
      printf ("%s -s %s -t %s/Input/AreaSiteParam.%s.tab  | HfdStoreFile \n", generCommand, stream , ExplorAreaDir, lang);
      printf ("echo \"--- %s done \"\n", generCommand);
    }
}

void generAreaGenerStreamShells()
{
  SxmlNode *streamNode;
  printf("<?dilib file=\"%s/bin/AreaGenerStreamShells.sh\" ?>\n", ExplorAreaDir );
  printf ("#!/bin/sh\n\n");
  SxmlReset (ExplorListStream);
  while ((streamNode=SxmlNextNode(ExplorListStream))) 
    {
      char *stream;
      char *typeStream;
      char *generCommand;

      stream= SxmlLeafText(streamNode);
      typeStream=ExplorGetFromDictK3 ("Area", stream, "typeStream");
      generCommand=ExplorGetFromDictK2 (typeStream, "generDataShells");

      printf("echo \" ---- executing %s -t %s/Input/AreaParam.data.tab -s %s \"\n", generCommand , ExplorAreaDir, stream );
      printf ("%s -t %s/Input/AreaParam.data.tab -s %s | HfdStoreFile\n", generCommand , ExplorAreaDir, stream );
    }
}

void generDataMake()
{
  SxmlNode *streamNode;
  char     *stream;
  SxmlNode *stepNode;
  char     *step;
  SxmlNode *listSteps;
  char     *listStepsStr;
  char     *areaCode;
  char     *posSlash;

  printf("<?dilib file=\"%s/bin/area.mk\" ?>\n", ExplorAreaDir );
  printf("# This part is generated by ExplorGenerShell / generDataMake\n" );
  areaCode=ExplorGetFromDictK3 ("Area", stream, "areaCode");
  if (!areaCode)
    {
      if ((posSlash=strrchr(ExplorAreaDir,'/'))) areaCode=posSlash+1;
      else areaCode=ExplorAreaDir;
    }
  printf("$(EXPLOR_AREA)/Make/%s.area: \\\n",  areaCode );
  SxmlReset (ExplorListStream);
  while ((streamNode=SxmlNextNode(ExplorListStream)))
    {
      stream=SxmlLeafText(streamNode );
      printf("               $(EXPLOR_AREA)/Make/%s.stream", stream);
      if (SxmlNextSibling(streamNode)) printf(" \\\n");
      else printf(" \n");
    }
  printf("\ttouch $(EXPLOR_AREA)/Make/%s.area \n\n",  areaCode );

  SxmlReset (ExplorListStream);
  while ((streamNode=SxmlNextNode(ExplorListStream)))
    {
      stream=SxmlLeafText(streamNode );
      printf("$(EXPLOR_AREA)/Make/%s.stream: \\\n", stream);
      listStepsStr=ExplorGetFromDictK3("Area", stream, "listSteps");
      listSteps=SxmlFromString(listStepsStr);
      SxmlReset(listSteps);
      while ((stepNode=SxmlNextNode(listSteps)))
	{
	  step=SxmlLeafText(stepNode );
	  printf ("             $(EXPLOR_AREA)/Make/%s/%s.step", stream, step );
	  if (SxmlNextSibling(stepNode)) printf(" \\\n");
	  else printf(" \n");
	}
      printf("\ttouch $(EXPLOR_AREA)/Make/%s.stream \n\n", stream);
    }
}

void generDataMkdir()
{
  SxmlNode *streamNode;
  SxmlNode *stepNode;
  SxmlNode *listSteps;
  char     *stream;
  char     *step;
  char     *listStepsStr;
  printf("<?dilib file=\"%s/bin/DataMkdir.sh\" ?>\n", ExplorAreaDir );
  printf ("#!/bin/sh\n\n");
  printf ("mkdir %s/Make\n", ExplorAreaDir );
  printf ("mkdir %s/Data\n", ExplorAreaDir );
  SxmlReset (ExplorListStream);
  while ((streamNode=SxmlNextNode(ExplorListStream)))
    {
      stream=SxmlLeafText(streamNode );
      printf ("mkdir -p %s/Data/%s\n", ExplorAreaDir, stream );
      printf ("mkdir -p %s/Make/%s\n", ExplorAreaDir, stream );
      listStepsStr=ExplorGetFromDictK3("Area", stream, "listSteps");
      listSteps=SxmlFromString(listStepsStr);
      SxmlReset(listSteps);
      while ((stepNode=SxmlNextNode(listSteps)))
	{
	  step=SxmlLeafText(stepNode );
	  printf ("mkdir -p %s/Data/%s/%s\n", ExplorAreaDir, stream, step );
	  printf ("mkdir -p %s/Make/%s/%s\n", ExplorAreaDir, stream, step );
	}
    }
}

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

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

   ExplorParamInit(pathParamFile);

   generAreaReset();
   generDataMkdir();
   generDataMake();
   generAreaGenerStreamShells();
   generAreaShellCreateData();
   SxmlReset (ExplorListLang);
   while ((itemNode=SxmlNextNode(ExplorListLang)))
     {
       char *lang;
       lang= SxmlLeafText(itemNode);
       generAreaShellCreateSite('1', lang);
       generAreaShellCreateSite('2', lang);
       generAreaShellCreateSite('3', lang);
     }
   generAreaResetSite();
   generAreaResetLight();
   generAreaGenerShells();
   exit(EXIT_SUCCESS);
}
