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

#include <stdlib.h> 
#include <string.h>
#include <ctype.h>
#include "Buffer.h"
#include "RegExp.h"
#include "StrDict.h"
#include "WicriPostalCodes.h"

StrDict *WicriGlobalPostalCodesFr=NULL;

static Buffer *bufName=NULL;
StrDict *WicriGetGlobalPostalCodesFr()
{
  char *wicriDataRoot;
  if (WicriGlobalPostalCodesFr) return WicriGlobalPostalCodesFr;
  if (!bufName)  bufName=NewBuffer();
  wicriDataRoot=WicriGetDataRoot();
  BufferStrcpy(bufName,wicriDataRoot);
  BufferStrcat(bufName,"/Metadata/postalCodeGlobal.fr.tab");
  WicriGlobalPostalCodesFr=StrDictFromFile(BufferString(bufName));
  return WicriGlobalPostalCodesFr;
}


SxmlNode *WicriGlobalPostalCodesGetCityRegionFromCpos(SxmlNode *affiliation, char *countryCode, char *strCode)
{
  int codeLength;
  static Buffer *bufCode=NULL;
  StrDict *table;
  char *placeStr;
  char *prevKey;
  char *firstKey;
  char *nextKey;

  switch (countryCode[0])
    {
    case 'A' :  /* AUT */
      codeLength=4;
      break;
    case 'B' :  /* BEL */
      codeLength=4;
      break;
    default:
      return NULL;
    }
  if (!bufCode)bufCode=NewBuffer();

  table=WicriGetGlobalPostalCodesFr();
  BufferStrcpy(bufCode, countryCode);
  BufferStrncat(bufCode, strCode, codeLength);
  if ((placeStr=StrDictSearch(table, BufferString(bufCode))))
    {
      WicriAffiliationPutPlace(affiliation, placeStr); 
      return affiliation;
    }
  /*                                         key range */
  prevKey=StrDictKeyLessEqual(table, BufferString(bufCode));
  if ((prevKey))
    {
      /*                   sth like AUT1050  in    AUT1000-1901  */  
      if ((strlen(prevKey)>3+2*codeLength) 
          &&(strncmp(BufferString(bufCode), prevKey, 3)==0)
          &&(strcmp(BufferString(bufCode)+3, prevKey+4+codeLength)<=0))
	{
	  placeStr=StrDictValue(table);
	  WicriAffiliationPutPlace(affiliation, placeStr); 
	  return affiliation;
	}
    
      /*                   now BEL1000  in  BEL1000-1901  */  
      nextKey=StrDictNext(table);
      if ((nextKey)  && (strlen(nextKey)>3+2*codeLength) &&(strncmp(BufferString(bufCode)+3, nextKey+3,codeLength)==0))
	{
	  placeStr=StrDictValue(table);
	  WicriAffiliationPutPlace(affiliation, placeStr); 
	  return affiliation;
	}
      return NULL;
    }
  if ((firstKey=StrDictFist(table))
      && (strlen(firstKey)>3+2*codeLength)  &&(strncmp(BufferString(bufCode)+3, firstKey+3, codeLength)==0))
    {
      placeStr=StrDictValue(table);
      WicriAffiliationPutPlace(affiliation, placeStr); 
      return affiliation;
    }
  return NULL;
}

SxmlNode *WicriGlobalPostalCodeGetRegionFromField(SxmlNode *affiliation, char *country, char *strRegion, char *regionArea)
{
  char *countryCode;
  SxmlNode *retNode;
  if (strcmp(country, "Belgique")==0) countryCode="BEL";
  else if (strcmp(country, "Autriche")==0) countryCode="AUT";
  else return NULL;
  if  ((retNode=WicriGlobalPostalCodesGetCityRegionFromCpos(affiliation, countryCode, strRegion))) return retNode;
  return NULL;
}
