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

/*
    First step of genating area
    Input : AreaParam.data.step0.tab
    Output : AreaParam.data.step1.tab + AreaDataCatParam.sh
 */

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

#include "Explor.h"
#include "Except.h"

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

void generShellAreaRootCatParam()
{
  SxmlNode *streamNode;
  printf("<?dilib file=\"%s/bin/AreaDataCatParam.sh\" ?>\n", ExplorAreaDir );
  printf ("#!/bin/sh\n\n");
  printf ("# This shell is generated by ExplorGenerParamStep1 \n\n");
  SxmlReset (ExplorListStream);
  printf("(\n");
  printf("  cat $EXPLOR_AREA/Input/AreaParam.data.step1.tab\n");
  while ((streamNode=SxmlNextNode(ExplorListStream))) 
    {
      char *stream;
      char *typeStream;
      char *dataTable;
      stream=SxmlLeafText(streamNode);
      typeStream=ExplorGetFromDictK3 ("Area", stream, "typeStream");
      if (!typeStream)
	{
	  ExceptSetError("ExplorGenerParamStep1", "NF","typeStream for",stream , " not founded in param table.",1);
	  exit(1);
	}
      dataTable= ExplorGetFromDictK2 ( typeStream, "rootTable");
      if (!dataTable)
	{
	  ExceptSetError("ExplorGenerParamStep1", "NT"," data table for",typeStream , " not founded in param table.",1);
	  exit(1);
	}
      printf("   cat %s\n ", dataTable);
    }
  /*
  printf("  cat %s/Input/WicriAreaParam.data.tab\n", ExplorAreaDir);
  printf(") | StrDictMerge > %s/Input/AreaParam.data.step2.tab\n", ExplorAreaDir);
  */
  printf("  cat $EXPLOR_AREA/Input/WicriAreaParam.data.tab\n");
  printf(") | StrDictMerge > $EXPLOR_AREA/Input/AreaParam.data.step2.tab\n");
}

int main (int argc, char **argv) {
   int cOption;
   /* char *tabList; */
   SxmlNode *streamNode;
   char *listStreamsStr;
   char  *streamsStr;
   time_t timeData;

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

   timeData =  time(NULL);

   StrDictSet(ExplorTableParam,"Area/dirPath", ExplorAreaDir);
   StrDictSet(ExplorTableParam,"Dilib/version", getenv ("DILIB_VERSION"));
   StrDictSet(ExplorTableParam,"Area/dataCreationTime", ctime(&timeData));
   listStreamsStr=StrDictSearch(ExplorTableParam,"Area/listStreams");
   if (!listStreamsStr)listStreamsStr=StrDictSearch(ExplorTableParam,"Area/streams");
   if (!listStreamsStr)listStreamsStr="<list><i>Main</i></list>";
   ExplorListStream=SxmlFromString(listStreamsStr);

   /*     areaTree         */
   {
     int mainFlag;

     ExplorAreaTree=SxmlElementCreate("area");
     SxmlAppendChild(ExplorAreaTree,  ExplorAreaData=SxmlElementCreate("data"));
     SxmlSetAttribute(ExplorAreaTree, "code", "data");
     SxmlReset(ExplorListStream);
     mainFlag=0;
     while ((streamNode=SxmlNextNode(ExplorListStream)))
       {
	 SxmlNode *treeStream;
	 char     *streamCode;

	 streamCode=SxmlLeafText(streamNode);
	 SxmlAppendChild(ExplorAreaData,  treeStream=SxmlElementCreate("stream"));
	 if (mainFlag==1) SxmlSetAttribute(treeStream, "group", "zoom");
	 else
	   {
	     if (strcmp(streamCode, "Main")==0)
	       {
		 SxmlSetAttribute (treeStream, "group", "main");
		 mainFlag=1;
	       }
	     else SxmlSetAttribute (treeStream, "group", "up");
	   }
	 SxmlSetAttribute(treeStream, "code", streamCode);
       }
   }
   ExplorSetDictK2("Area", "areaTree", strdup(SxmlToString(ExplorAreaTree)));

   /*     to be deprecated */

   streamsStr=StrDictSearch(ExplorTableParam,"Area/streams");
   if (!streamsStr) StrDictSet(ExplorTableParam,"Area/streams",listStreamsStr);

   ExplorSaveParamTable("AreaParam.data.step1", NULL);
   generShellAreaRootCatParam();
  exit (EXIT_SUCCESS);
}
