/*   -*- coding: utf-8 -*-  */
#include <stdlib.h> 
#include <string.h>
#include <ctype.h>
#include "Buffer.h"
#include "Wicri.h"
#include "CharSetBuffer.h"

RegExp *WicriRegExpZip5=NULL;
RegExp *WicriRegExpZip4=NULL;

StrDict  *WicriTableInterwiki=NULL;
char     *WicriDataRoot=NULL;

char *WicriGetDataRoot()
{
  static Buffer *bufName=NULL;
  char *dilibRoot;

  if(WicriDataRoot) return WicriDataRoot;
  if (!bufName)  bufName=NewBuffer();
  dilibRoot=getenv("DILIB");
  BufferStrcpy(bufName,dilibRoot);
  BufferStrcat(bufName,"/data/Wicri");
  WicriDataRoot=BufferString(bufName);
  return WicriDataRoot;
}

StrDict *WicriGetInterwikiTable()
{
  static Buffer *bufName=NULL;
  char *wicriDataRoot;

  if (WicriTableInterwiki) return WicriTableInterwiki;
  if (!bufName)  bufName=NewBuffer();
  wicriDataRoot=WicriGetDataRoot();
  BufferStrcpy(bufName,wicriDataRoot);
  BufferStrcat(bufName,"/interwiki.tab");
  /* WicriTableInterwiki=StrSearchGetTable(BufferString(bufName),100); */
  WicriTableInterwiki=StrDictFromFile(BufferString(bufName));
  return WicriTableInterwiki;
}

char *WicriBufferCatUrl(Buffer *bufName, char *link, char *pageName)
{
  if (!WicriTableInterwiki) WicriGetInterwikiTable();
  BufferStrcat(bufName, StrDictSearch(WicriTableInterwiki, link));
  BufferTailCut(bufName,2);
  CharSetUrlBufferCatFromStr(bufName,pageName);

  return BufferString(bufName);
}

char *WicriBufferCatWikiLink2A(Buffer *bufText, char*implicitInterwikiLink, char *wikiLinkArea)
{
  char *posPipe;
  char *posColon;
  char *effectiveInterwikiLink;
  char *linkTarget;
  char *linkLabel;
  static Buffer* bufInterLink=NULL;
  static Buffer* bufLink=NULL;

  if (!wikiLinkArea) return NULL;
  posPipe=strchr(wikiLinkArea,'|');
  posColon=strchr(wikiLinkArea,':');
  if (!islower(wikiLinkArea[0])) posColon=0;
  if (posColon)
    {
      if(!bufInterLink) bufInterLink=NewBuffer();
      BufferStrncpy(bufInterLink, wikiLinkArea, posColon-wikiLinkArea);
      effectiveInterwikiLink=BufferString(bufInterLink);
      if (posPipe)
	{
	  linkLabel=posPipe+1;
	  if(!bufLink) bufLink=NewBuffer();
	  BufferStrncpy(bufLink, posColon+1, posPipe-posColon-1);
	  linkTarget=BufferString(bufLink);
	}
      else
	{
	  linkLabel=posColon+1;
	  linkTarget=posColon+1;
	}
    }
  else 
    {
      effectiveInterwikiLink = implicitInterwikiLink;
      if (posPipe)
	{
	  linkLabel=posPipe+1;
	  if(!bufLink) bufLink=NewBuffer();
	  BufferStrncpy(bufLink, wikiLinkArea, posPipe-wikiLinkArea);
	  linkTarget=BufferString(bufLink);
	}
      else
	{
	  linkLabel=wikiLinkArea;
	  linkTarget=wikiLinkArea;
	}
    }
  BufferStrcat(bufText, "<a href=\"");
  WicriBufferCatUrl(bufText, effectiveInterwikiLink, linkTarget);
  BufferStrcat(bufText, "\">");
  BufferStrcat(bufText, linkLabel);
  BufferStrcat(bufText, "</a>");
  return BufferString(bufText);
}

SxmlNode *WicriGenerNoCountry(char *str, char* code)
{
  /*replacing & by &amp; for handling by php in indexes */
  static Buffer *bufStr=NULL;
  SxmlNode *retNode;
  int i;
  if (!bufStr)bufStr=NewBuffer();
  i=0;
  BufferReset (bufStr);
  while (i<strlen(str))
    {
      char c;
      c=str[i++];
      if (c=='&')BufferStrcat(bufStr,"&amp;");
      else BufferCharCat(bufStr, c);
    }
  retNode= SxmlLeafCreate("wicri:noCountry", BufferString(bufStr));
  SxmlSetAttribute(retNode,"code", code);
  return retNode;
}

void WicriAffiliationPutPlace(SxmlNode *affiliation, char *placeStr)
{
  SxmlNode *placeNode;
  SxmlNode *placeName;
  SxmlNode *inputPlaceName;
  SxmlNode *inputSettlement;
  SxmlNode *regionNode;
  char     *wicriLevel;

  placeNode= SxmlFromString(placeStr);
  inputPlaceName=SxmlGetFirstChildByTagName(placeNode, "placeName");
  SxmlAppendChild(affiliation, placeName=SxmlElementCreate("placeName"));
  regionNode=SxmlGetFirstChildByTagName(inputPlaceName, "region");
  inputSettlement=SxmlGetFirstChildByTagName(inputPlaceName, "settlement");

  wicriLevel=SxmlGetAttribute(affiliation,"wicri:level");
  if (inputSettlement)
    {
      if ((!wicriLevel)||(wicriLevel[0]<'3')) SxmlSetAttribute(affiliation,"wicri:level","3");
    }
  else
    {
      if (regionNode)
	{
	  if ((!wicriLevel)||(wicriLevel[0]<'2')) SxmlSetAttribute(affiliation,"wicri:level","2");
	}
    }
  
  while (regionNode)
    {
      SxmlAppendChild(placeName, SxmlClone(regionNode));
      regionNode=SxmlGetNextSiblingByTagName(regionNode, "region");
    }
  while (inputSettlement)
    {
      SxmlAppendChild(placeName, SxmlClone(inputSettlement));
      inputSettlement=SxmlGetNextSiblingByTagName(inputSettlement, "settlement");
    }
  SxmlFree(placeNode);
}

SxmlNode *WicriAffiliationPutRegion(SxmlNode *affiliation, char *strRegion)
{
  SxmlNode *nodeRegion;
  SxmlNode *placeName;
  nodeRegion=SxmlLeafCreate("region", strRegion);
  placeName=SxmlGetFirstChildByTagName(affiliation, "placeName");
  if (!placeName) 
    {
      SxmlAppendChild (affiliation, placeName=SxmlElementCreate("placeName"));
      SxmlSetAttribute (affiliation, "wicri:level", "2");
    }
  SxmlAppendChild(placeName, nodeRegion);
  return nodeRegion;
}

char *WicriFindZip4(char *str)
{
  char *beginZip;
    if (!WicriRegExpZip4)
    {
      WicriRegExpZip4=RegExpCreate("[0-9][0-9][0-9][0-9]");
    }
  beginZip=RegExpFind(WicriRegExpZip4, str);
  return beginZip;
}

char *WicriFindZip5(char *str)
{
  char *beginZip;
    if (!WicriRegExpZip5)
    {
      WicriRegExpZip5=RegExpCreate("[0-9][0-9][0-9][0-9][0-9]");
    }
  beginZip=RegExpFind(WicriRegExpZip5, str);
  return beginZip;
}
