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

/* 
  File: NlmMedlineAffiliationSetPays.c
 */


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

#include <getopt.h>
#include "SxPath.h"
#include "Buffer.h"
#include "WicriPaysFromEn.h"

SxPathResult *teiPathAffiliation;
SxPathResult *teiPathAffiliationOld;

SxmlNode *docInput;
SxmlNode * affiliation;
SxmlNode *docInput;
SxmlNode *listAffiliations;

Buffer* bufPays;
Buffer *bufSubField=NULL;
Buffer *bufArea=NULL;

SxmlNode *affiliationSetPaysFromSubFieldEn(SxmlNode *affiliation, char *subField)
{
  SxmlNode *retNode;
  retNode=WicriAffiliationSetPaysFromSubFieldEn(affiliation, subField);
  if (!retNode)return NULL;
  char *level;
  level=SxmlGetAttribute(affiliation, "wicri:level");
  switch(level[0])
    {
    case '0':
      SxmlAppendChild(affiliation, SxmlLeafCreate("wicri:regionArea", subField));
      SxmlSetAttribute(affiliation, "wicri:level", "1");
      break;
    case '1':
      SxmlAppendChild(affiliation, SxmlLeafCreate("wicri:regionArea", BufferString(bufArea)));
      break;
    case '2':
      SxmlAppendChild(affiliation, SxmlLeafCreate("wicri:cityArea", BufferString(bufArea)));
      break;
    case '3':
      SxmlAppendChild(affiliation, SxmlLeafCreate("wicri:orgArea", BufferString(bufArea)));
      break;
    default:
      break;
    }
  return retNode;
}

void proceedAffiliation()
{
  SxmlNode *inputAffiliation;
  SxmlNode *ncyNode;
  char *posDot;
  char *posComma;
  char *beginAff;

  if((inputAffiliation=SxmlGetFirstChildByTagName(affiliation,"nlm:affiliation")))
    {
      char *inputAffiliationStr;

      inputAffiliationStr=SxmlLeafText(inputAffiliation);
      beginAff=inputAffiliationStr;
      posComma=strrchr(beginAff, ',');
      if (!posComma)
	{
	  if (WicriAffiliationSetPaysFromUrl(affiliation, beginAff)) return;
	  SxmlAppendChild(affiliation, ncyNode=WicriGenerNoCountry(beginAff,"no comma"));
	  return;
	}
      if (!bufArea) bufArea=NewBuffer();
      BufferStrncpy(bufArea, beginAff, posComma-beginAff);
      posDot=strchr(posComma,'.');
      if (!posDot)posDot=strchr(posComma,';');
      if (posDot)
	{
	  static Buffer *bufAff=NULL;
	  char *beginSubField;
	  char *posAt;

	  if (!bufAff) bufAff=NewBuffer();
	  if (!bufSubField) bufSubField=NewBuffer();

	  posAt=strchr(posComma,'@');
	  beginSubField=posComma+1;
	  while (beginSubField[0]==' ') beginSubField++;

	  if ((posDot+1)[0])  /* sth like U.K. or P. R. China or « P. R. China. » */
	    {
	      if ((posDot+1)[0]==' ') /* sth like « China. xx@yy.cn » or P. R. China or « P. R. China. » */
		{
		  BufferStrncpy(bufSubField, beginSubField, posDot-beginSubField);
		}
	      else
		{
		  char *newSpace;
		  if ((newSpace=strchr(posDot,' '))) BufferStrncpy(bufSubField, beginSubField, newSpace-beginSubField);
		  else  BufferStrcpy(bufSubField, beginSubField);
                }
	    }
	  else
	    {
	      if ((posDot-1)[0]==' ')  /* sth like "Brazil ."  */
		{
		  BufferStrncpy(bufSubField, beginSubField, posDot-beginSubField-1);
		}
	      else BufferStrncpy(bufSubField, beginSubField, posDot-beginSubField);
	    }
	  if (affiliationSetPaysFromSubFieldEn(affiliation, BufferString(bufSubField))) return;
	  BufferStrncpy(bufAff, beginAff, posDot-beginAff+1);

	  if (WicriAffiliationSetPaysFromUrl(affiliation, posDot)) return;
	  if (WicriAffiliationSetPaysFromUrl(affiliation, posComma)) return;	  
	  /* if (WicriSetPaysInAffEn(BufferString(bufAff), affiliation)) return; */
	  if (WicriAffiliationSetPaysFromFieldEn(affiliation, BufferString(bufAff))) return;
	  if (WicriAffiliationSetPaysFromFieldEn(affiliation, inputAffiliationStr)) return;

	  SxmlAppendChild(affiliation, WicriGenerNoCountry(BufferString(bufSubField),"subField"));
	  return;
	  
	}
      else /* no posDot */
	{
	  if (affiliationSetPaysFromSubFieldEn(affiliation, posComma+2)) return;
	  SxmlAppendChild(affiliation,SxmlLeafCreate("wicri:noCountry", "no dot"));
	  return;
	}
    }
}

void proceedDoc()
{
  if (!(SxmlNodeHasName(docInput,"record")))return;
  if ((listAffiliations=SxPathSetResultListCreate(teiPathAffiliation, docInput)))
    {
      while((affiliation=SxmlNodeListNextNode(listAffiliations)))
	{
	  proceedAffiliation();
	}
    }
  if ((listAffiliations=SxPathSetResultListCreate(teiPathAffiliationOld, docInput)))
    {
      while((affiliation=SxmlNodeListNextNode(listAffiliations)))
	{
	  proceedAffiliation();
	}
    }
}

int main () {
  bufPays=BufferCreate(10,10);
  teiPathAffiliationOld=SxPathSetCompile("TEI/teiHeader/fileDesc/titleStmt/author/affiliation");
  teiPathAffiliation=SxPathSetCompile("TEI/teiHeader/fileDesc/sourceDesc/biblStruct/analytic/author/affiliation");
  while ((docInput=SxmlInputNextDocumentElement()))
    {      
      proceedDoc();
      SxmlPrint (SxmlInputRecord);
    }
   exit(EXIT_SUCCESS);
}
