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

/************************************************************************
*
*        Module   : Wicri
*        Fichier  : WicriRegionFromEn.c
*        Auteur   : J. DUCLOY
*        Date     : janvier 2014
*
************************************************************************/

#include "WicriRegionFromEn.h"
#include "WicriPaysFromEn.h"
#include "WicriFrance.h"
#include "WicriAllemagne.h"
#include "WicriBresil.h"
#include "WicriAmerique.h"
#include "WicriPostalCodes.h"
#include "SxmlNode.h"
#include <ctype.h>

SxmlNode *WicriAffiliationSetRegionFromCity(SxmlNode *affiliation, char *regionEnStr)
{
  SxmlNode *placeNode;

  if ((placeNode=WicriPaysFromCityByKey(regionEnStr)))
    {
      SxmlNode *placeName;
      placeName=SxmlGetFirstChildByTagName(placeNode,"placeName");
      if (placeName)SxmlAppendChild (affiliation, SxmlClone(placeName));
      SxmlSetAttribute(affiliation, "wicri:level", "3");
      return affiliation;
    }
  return NULL;
}

SxmlNode *WicriAffiliationSetRegionFromCityZip(SxmlNode *affiliation, char *regionEnStr, char *country)
{
  SxmlNode *retNode;
  SxmlNode *placeNode;
  placeNode=NULL;
  if (isdigit(regionEnStr[0]))
    {
      char *posSpace;
      posSpace=strchr(regionEnStr, ' ');
      if (posSpace) placeNode=WicriPaysFromCityByKey(posSpace+1);
    }
  else if  (isdigit(regionEnStr[strlen(regionEnStr)-1]))
    {
      char *posSpace;
      static Buffer *bufStr=NULL;
      if (!bufStr) bufStr=NewBuffer();
      posSpace=strrchr(regionEnStr, ' ');
      if (posSpace)
	{
	  BufferStrncpy(bufStr, regionEnStr, posSpace-regionEnStr);
	  placeNode=WicriPaysFromCityByKey(BufferString(bufStr));
	}
    }
  if (placeNode)
    {
      SxmlNode *placeName;
      SxmlNode *countryNode;
      placeName=SxmlGetFirstChildByTagName(placeNode,"placeName");
      countryNode=SxmlGetFirstChildByTagName(placeNode,"country");
      if (strcmp(SxmlLeafText(countryNode), country)!=0) return NULL; /* ex Roma, USA */
      if (placeName)SxmlAppendChild (affiliation, SxmlClone(placeName));
      return affiliation;
    }
  return NULL;
}

SxmlNode *WicriSetRegionOrgFromUniv(SxmlNode *affiliation, char *countryEnStr)
{
  SxmlNode *orgNode;

  if ((orgNode=WicriUnivFrFromSubstr(countryEnStr)))
    {
      SxmlNode *placeName;
      SxmlNode *orgName;
      placeName=SxmlGetFirstChildByTagName(orgNode,"placeName");
      if (placeName)SxmlAppendChild (affiliation, SxmlClone(placeName));
      orgName=SxmlGetFirstChildByTagName(orgNode,"orgName");
      while (orgName)
	{
	  SxmlAppendChild (affiliation, SxmlClone(orgName));
	  orgName=SxmlGetNextSiblingByTagName(orgName,"orgName");
	}
      SxmlSetAttribute(affiliation, "wicri:level", "4");
      return affiliation;
    }
  return NULL;
}

SxmlNode * WicriGetRegionFromSubField(SxmlNode *affiliation, char *subField, char *field, char * country)
{
  SxmlNode *retNode;
  if (country)
    {
      if (strcmp(country,"France")==0)
	{
	  retNode=WicriFranceGetRegionFromField(affiliation, subField, field);
	  if (retNode) return retNode;
	}
      else if (strcmp(country,"Allemagne")==0)
	{
	  retNode=WicriAllemagneGetRegionFromField(affiliation, subField, field);
	  if (retNode) return retNode;
	}
      else if (strcmp(country,"États-Unis")==0)
	{
	  retNode=WicriAmeriqueGetRegionFromField(affiliation, subField, field);
	  if (retNode) return retNode;
	}
     else if (strcmp(country,"Espagne")==0)
	{
	  retNode=WicriEspagneGetRegionFromField(affiliation, subField, field);
	  if (retNode) return retNode;
	}
     else if (strcmp(country,"Brésil")==0)
	{
	  retNode=WicriBresilGetRegionFromField(affiliation, subField, field);
	  if (retNode) return retNode;
	}
     else if ((retNode=WicriGlobalPostalCodeGetRegionFromField(affiliation, country, subField, field)))
	{
	  return retNode;
	}
      if ((retNode=WicriAffiliationSetRegionFromCity(affiliation, subField)))
	{ 
	  SxmlNode *noReg;
	  if ((noReg=SxmlGetFirstChildByTagName(affiliation, "wicri:noRegion")))SxmlFree(noReg);
	  return retNode;
	}
      if ((retNode=WicriAffiliationSetRegionFromCityZip(affiliation, subField, country)))
	{ 
	  return retNode;
	}
      if ((retNode=WicriSetRegionOrgFromUniv(affiliation, subField)))
	{ 
	  return retNode;
	}
    }
  return NULL;
} 

