/*   -*- coding: utf-8 -*-  */
#include <stdlib.h> 
#include <string.h>
#include <ctype.h>
#include "Buffer.h"
#include "RegExp.h"
#include "StrDict.h"
#include "WicriAllemagne.h"

StrDict *WicriAllemagneCodePostal4Fr=NULL;
StrDict *WicriAllemagneCodePostal5Fr=NULL;
StrDict *WicriAllemagneCity2placeFr=NULL;
static Buffer *bufName=NULL;

StrDict *WicriAllemagneGetCity2placeFr()
{
  char *wicriDataRoot;
  if(WicriAllemagneCity2placeFr) return WicriAllemagneCity2placeFr;
  if (!bufName)  bufName=NewBuffer();
  wicriDataRoot=WicriGetDataRoot();
  BufferStrcpy(bufName,wicriDataRoot);
  BufferStrcat(bufName,"/Allemagne/city2place.fr.tab");
  WicriAllemagneCity2placeFr=StrDictFromFile(BufferString(bufName));
  return WicriAllemagneCity2placeFr;
}

StrDict *WicriAllemagneGetCodePostal4Fr()
{

  char *wicriDataRoot;
  if (WicriAllemagneCodePostal4Fr) return WicriAllemagneCodePostal4Fr;
  if (!bufName)  bufName=NewBuffer();
  wicriDataRoot=WicriGetDataRoot();
  BufferStrcpy(bufName,wicriDataRoot);
  BufferStrcat(bufName,"/Allemagne/codePostal4.fr.tab");
  WicriAllemagneCodePostal4Fr=StrDictFromFile(BufferString(bufName));
  return WicriAllemagneCodePostal4Fr;
}

StrDict *WicriAllemagneGetCodePostal5Fr()
{

  char *wicriDataRoot;
  if (WicriAllemagneCodePostal5Fr) return WicriAllemagneCodePostal5Fr;
  if (!bufName)  bufName=NewBuffer();
  wicriDataRoot=WicriGetDataRoot();
  BufferStrcpy(bufName,wicriDataRoot);
  BufferStrcat(bufName,"/Allemagne/codePostal5.fr.tab");
  WicriAllemagneCodePostal5Fr=StrDictFromFile(BufferString(bufName));
  return WicriAllemagneCodePostal5Fr;
}

SxmlNode *WicriAllemagneGetCityRegionFromCpos4(SxmlNode *affiliation, char *str)
{
  char *placeStr;
  static char *code4=NULL;
  
  if (!code4)code4=malloc(6);
  strncpy(code4, str, 6);
  if ((placeStr=StrDictSearch(WicriAllemagneGetCodePostal4Fr(), code4)))
    {
      WicriAffiliationPutPlace(affiliation, placeStr); 
      return affiliation;
    }
  return NULL;
}

SxmlNode *WicriAllemagneGetCityFromTableFr(SxmlNode *affiliation, char *str)
{
  char *placeStr;
    if ((placeStr=StrDictSearch(WicriAllemagneGetCity2placeFr(), str)))
    {
      WicriAffiliationPutPlace(affiliation, placeStr); 
      return affiliation;
    }
  return NULL;
}



SxmlNode *WicriAllemagneGetCityRegionFromCpos5(SxmlNode *affiliation, char *str)
{
  char *placeStr;
  char *prevKey;
  StrDict *table;
  static char *code5=NULL;
  
  if (!code5)code5=malloc(5);
  table=WicriAllemagneGetCodePostal5Fr();
  strncpy(code5, str, 5);
  if ((placeStr=StrDictSearch(table, code5)))
    {
      WicriAffiliationPutPlace(affiliation, placeStr); 
      return affiliation;
    }
  /*                                         key range */
  if ((prevKey=StrDictKeyLessEqual(table, code5)))
    {
      char *nextKey;
      /*                   sth like 63025  in    63000-63100  */  
      if ((strlen(prevKey)>10) &&(strcmp(code5, prevKey+6)<=0))
	{
	  placeStr=StrDictValue(table);
	  WicriAffiliationPutPlace(affiliation, placeStr); 
	  return affiliation;
	}
      /*                   now 63000  in    63000-63100  */  
      if ((nextKey=StrDictNext(table))
	  && (strlen(nextKey)>10) &&(strncmp(code5, nextKey,5)==0))
	{
	  placeStr=StrDictValue(table);
	  WicriAffiliationPutPlace(affiliation, placeStr); 
	  return affiliation;
	}
    }
  else
    {
      char *firstKey;
      if ((firstKey=StrDictFist(table))
	   && (strlen(firstKey)>10) &&(strncmp(code5, firstKey,5)==0))
	{
	  placeStr=StrDictValue(table);
	  WicriAffiliationPutPlace(affiliation, placeStr); 
	  return affiliation;
	}
    }
  
  return NULL;
}

SxmlNode *WicriAllemagneGetRegionFromField(SxmlNode *affiliation, char *strRegion, char *regionArea)
{
  char *beginZip;
  SxmlNode *retNode;

  beginZip=WicriFindZip4(strRegion);
  if ((!beginZip)
      && ((strRegion-regionArea) > 10))
    {
      beginZip=RegExpFind(WicriRegExpZip4, strRegion-10);
    }
  if (beginZip)
    {
      if (isdigit (beginZip[4]))  /*  postal code 5 digits */
	{
	  retNode=WicriAllemagneGetCityRegionFromCpos5(affiliation, beginZip);
	  if (retNode) return retNode;
	  SxmlAppendChild(affiliation, SxmlLeafCreate("wicri:noRegion",beginZip));
	  return NULL;
	}
      if ((retNode=WicriAllemagneGetCityRegionFromCpos4(affiliation, beginZip-2))) return retNode;
      if (*(beginZip-2)=='D')
	{
	  static Buffer *bufZip=NULL;
	  if(!bufZip)bufZip=NewBuffer();
	  BufferStrcpy(bufZip,"W");
	  BufferStrncat(bufZip, beginZip-1,5);
	  retNode=WicriAllemagneGetCityRegionFromCpos4(affiliation, BufferString(bufZip));
	  if (retNode)return retNode;
	}
      SxmlAppendChild(affiliation, SxmlLeafCreate("wicri:noRegion",strRegion));
      return NULL;
    }
  retNode=WicriAllemagneGetCityFromTableFr(affiliation, strRegion);
  if (retNode)return retNode;
  retNode=WicriSetRegionOrgFromUniv(affiliation, strRegion);
  if (retNode)return retNode;

  SxmlAppendChild(affiliation, SxmlLeafCreate("wicri:noRegion",strRegion));
  return NULL; 
}
