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

/*
           ExplorMergeFromCheckpoint.c
	   Solving DOI doubles

 */

#include <stdio.h>     /* for printf */
#include <stdlib.h>    /* for exit */
#include <getopt.h>
#include "SxPath.h"
#include "Buffer.h"
#include "TeiHandler.h"

SxmlNode *docInput;
SxmlNode *teiRoot;

char     *previousDoi;
char     *currentDoi;
char     *previousRBID;
char     *currentRBID;
SxmlNode *previousTei;
SxmlNode *mergingList;

SxPathResult *pathTeiWicriSource;

void cleanRecord()
{
  SxmlNode *oldRec;
  oldRec=SxmlNextSibling(teiRoot);
  if (oldRec)
    {
      SxmlRemoveChild(oldRec);
      SxmlFree(oldRec);
    }
}

void keepOneDoc()
{
  previousDoi=strdup(currentDoi);
  previousTei=SxmlRemoveChild(teiRoot);
}

void purge()
{
  if (previousTei)
    {
      SxmlNode *newDoc;
      newDoc=SxmlElementCreate("record");
      SxmlAppendChild(newDoc, previousTei);
      SxmlPrint(newDoc);
      putchar('\n');
      SxmlFree(newDoc);
      previousTei=NULL;
    }
  if (mergingList)
    {
      SxmlNode *record;
      /*
      record=SxmlElementCreate("record");
      SxmlAppendChild(record, SxmlRemoveChild(SxmlFirstChild(SxmlFirstChild(mergingList))));
      SxmlFree(SxmlRemoveChild(SxmlFirstChild(mergingList)));
      SxmlAppendChild(record,mergingList);
      */
      record=TeiDoublesBuildRecordFromList(mergingList);
      SxmlPrint(record);
      putchar('\n');
      SxmlFree(record);
      mergingList=NULL;
    }
  if (previousDoi)
    {
      free(previousDoi);
      previousDoi=NULL;
    }
}

void basicMerge()
{
  SxmlNode *container;
  SxmlNode *sourceNode;
  if (!mergingList)
    {
      mergingList=SxmlElementCreate("double");
      SxmlSetAttribute(mergingList, "doi", previousDoi);
      
      sourceNode=SxPathFirstResultNode(pathTeiWicriSource,previousTei);
      if (sourceNode) SxmlAppendChild(mergingList, container=SxmlElementCreate(SxmlLeafText(sourceNode)));
      else SxmlAppendChild(mergingList, container=SxmlElementCreate("notDef"));
      SxmlAppendChild(container, previousTei);
      previousTei=NULL;
    }
  sourceNode=SxPathFirstResultNode(pathTeiWicriSource,teiRoot);
  if (sourceNode) SxmlAppendChild(mergingList, container=SxmlElementCreate(SxmlLeafText(sourceNode)));
  else SxmlAppendChild(mergingList, container=SxmlElementCreate("notDef"));
  SxmlAppendChild(container,SxmlRemoveChild(teiRoot));
}

int main()
{
  previousDoi=NULL;
  previousRBID=NULL;
  previousTei=NULL;
  mergingList=NULL;
  pathTeiWicriSource=SxPathFirstCompile("teiHeader/fileDesc/publicationStmt/idno@type=wicri:source");
  while ((docInput=SxmlInputNextDocumentElement()))
    {
      if(SxmlNodeHasName(docInput,"record"))
	{
	  SxmlNode *publicationStmt;
	  SxmlNode *rbidNode;

	  currentDoi=SxmlNodeValue(SxmlFirstChild(SxmlFirstChild(SxmlInputRecord)));
	  teiRoot=SxmlGetFirstChildByTagName(docInput,"TEI");
	  cleanRecord();

	  publicationStmt=TeiFindPublicationStmt(teiRoot);
	  TeiSetDoubleKey(teiRoot);
	  rbidNode=SxmlGetFirstChildTagAtt(publicationStmt, "idno","type","RBID");
	  if (!rbidNode)
	    {
	      purge();
	      SxmlPrint (docInput);
	      putchar('\n');
	      continue;
	    }
	  currentRBID=SxmlLeafText(rbidNode);

	  if (strcmp(currentDoi,"NONE")==0)
	    {
	      purge();
	      SxmlPrint (docInput);
	      putchar('\n');
	      continue;
	    }
	  if (!previousDoi) 
	    {
	      keepOneDoc();
	      continue;
	    }
	  if (strcmp(currentDoi, previousDoi)==0)
	    {
	      basicMerge();
	      continue;
	    }
	  purge();
	  keepOneDoc();
	}
    }
  purge();
  exit (EXIT_SUCCESS);
}
