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

/**********************************************************************
*
*  module   : Nlm
*  fichier  : NlmPmcAffiliationSetPays.c
*  Auteur   : Jacques DUCLOY
*  Date     : fin 2013
*
***********************************************************************/

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

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

SxPathResult *teiPathAffiliation;
SxPathResult *teiPathAffiliationOld;

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

Buffer* bufPays;

void proceedAffiliation()  /* implicit parameter affiliation - to improve */
{
  SxmlNode *inputAffiliation;
  SxmlNode *affData;
  SxmlNode *pmcCountryField;
  char *affStr;
  char *posComma;
  char *beginSubField;
  static Buffer *bufSubfield=NULL;

  if (!bufSubfield)bufSubfield=NewBuffer();  
  inputAffiliation=SxmlGetFirstChildByTagName(affiliation,"nlm:aff");
  if (!inputAffiliation) return;
  affData=SxmlLastChild(inputAffiliation);
  if(!affData) return;
  
  affStr=NULL;
  if (SxmlIsText(affData))
    {
      affStr=SxmlNodeValue(affData);
    }
  else
    {
      if (SxmlNodeHasName(affData,"addr-line"))
	affStr=SxmlLeafText(affData);
    }
  if (affStr)
    {
      BufferStrcpy (bufSubfield, affStr);
      while ( (BufferTailCmp(bufSubfield,";")==0) || (BufferTailCmp(bufSubfield," ")==0) ||(BufferTailCmp(bufSubfield,",")==0) ) BufferTailCut(bufSubfield,1);
      posComma=strrchr(BufferString(bufSubfield), ',');
      beginSubField=posComma+2;
      if (posComma)
	{
	  static Buffer *bufArea=NULL;
	  if (!bufArea) bufArea=NewBuffer();
	  BufferStrncpy(bufArea, BufferString(bufSubfield), posComma-BufferString(bufSubfield));
	  if (WicriAffiliationSetPaysFromSubFieldEn(affiliation, beginSubField))
	    {
	      char *level;
	      level=SxmlGetAttribute(affiliation, "wicri:level");
	      switch(level[0])
		{
		case '0':
		  SxmlAppendChild(affiliation, SxmlLeafCreate("wicri:regionArea", BufferString(bufSubfield)));
		  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;
	    }
	  /* if(WicriSetPaysInAffEn(BufferString(bufSubfield), affiliation)) return; */
	  if (WicriAffiliationSetPaysFromFieldEn(affiliation, BufferString(bufSubfield))) return;
	  if (posComma)   SxmlAppendChild(affiliation, WicriGenerNoCountry(posComma+2,"subfield"));
	  else  SxmlAppendChild(affiliation,WicriGenerNoCountry(BufferString(bufSubfield),"field"));
	  return;
	}
    }

  pmcCountryField=SxmlGetFirstChildByTagName(inputAffiliation,"country");
  if (!pmcCountryField) return;
  if (SxmlIsLeaf(pmcCountryField))
    {
      posComma=strrchr(SxmlLeafText(pmcCountryField), ',');
      if (!posComma)
	{
	  char *countryStr;
	  countryStr=SxmlLeafText(pmcCountryField);
	  if(WicriSetPaysFromEnglish(affiliation, countryStr))
	    {
	      SxmlSetAttribute(affiliation, "wicri:level", "1");
	      SxmlAppendChild(affiliation, SxmlLeafCreate("wicri:regionArea","# see nlm:aff country strict"));
	      return;
	    }
	  SxmlAppendChild(affiliation,WicriGenerNoCountry(countryStr, "nlm country"));
	  return;
	}
      /*   if (WicriSetPaysInAffEn(posComma, affiliation)) */
      if (WicriAffiliationSetPaysFromFieldEn(affiliation, posComma)) return;
	{
	  SxmlSetAttribute(affiliation, "wicri:level", "1");
	  SxmlAppendChild(affiliation, SxmlLeafCreate("wicri:regionArea","# see nlm:aff region in country"));
	  return;
	}
      SxmlAppendChild(affiliation,WicriGenerNoCountry(posComma, "nlm country"));
      return;
    }
  SxmlAppendChild(affiliation,WicriGenerNoCountry(BufferString(bufSubfield), "# NLM AFF"));
  return;
}

int main (int argc, char **argv) {

   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()))
    {      
      if (!(SxmlNodeHasName(docInput,"record")))continue;

      if ((listAffiliations=SxPathSetResultListCreate(teiPathAffiliation, docInput)))
	{
	  while((affiliation=SxmlNodeListNextNode(listAffiliations)))
	    {
	      proceedAffiliation();
	    }
	}
      if ((listAffiliations=SxPathSetResultListCreate(teiPathAffiliationOld, docInput)))
	{
	  while((affiliation=SxmlNodeListNextNode(listAffiliations)))
	    {
	      proceedAffiliation();
	    }
	}
      SxmlPrint (SxmlInputRecord);
    }
   exit(EXIT_SUCCESS);
}
