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

/**********************************************************************
*
*  module   : Nlm
*  fichier  : NlmMeshFreToWiki.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 "HfdIndex.h"

SxmlNode *docInput;
SxPathResult *frePrefTermPath;
SxPathResult *engPrefTermPath;
HfdIndex  *indexTreeNumber;
Hfd    *hfdMeshFre;
Buffer    *bufPath;
Buffer    *bufTree;

void generWikiText(SxmlNode *descriptor)
{
  SxmlNode *frePrefTermNode;
  SxmlNode *engPrefTermNode;
  SxmlNode *listTree;
  SxmlNode *treeNode;
  char *frePrefTerm;
  char *engPrefTerm;
  frePrefTermNode=SxPathFirstResultNode(frePrefTermPath, descriptor);
  frePrefTerm=SxmlLeafText(frePrefTermNode);
  engPrefTermNode=SxPathFirstResultNode(engPrefTermPath, descriptor);
  engPrefTerm=SxmlLeafText(engPrefTermNode);

  printf("=== %s ===\n", frePrefTerm);
  printf("La catégorie ''%s'' est alignée ", frePrefTerm);
  printf("sur le [[Medical Subject Headings]]  (MeSH) dans sa traduction française. Voir :\n");
  listTree=SxmlGetFirstChildByTagName(descriptor, "TreeNumberList");
  while ((treeNode=SxmlNextNode(listTree)))
    {
      printf("*{{MeSH français lien|code=%s}}\n", SxmlLeafText(treeNode));
    }
  SxmlReset (listTree);
   while ((treeNode=SxmlNextNode(listTree)))
    {
      char *treeNumber;
      char *posColon;
      treeNumber=SxmlLeafText(treeNode);
      posColon=strrchr(treeNumber,'.');
      if (posColon)
	{
	  SxmlNode *indexNode;
	  BufferStrcpy(bufTree, treeNumber);
	  BufferTailCut(bufTree,4);
	  indexNode=HfdIndexReadSxml(indexTreeNumber, BufferString(bufTree));
	  if (indexNode)
	    {
	      SxmlNode *lNode; 
	      SxmlNode *newDesc;
	      char *hfdNumber;
	      SxmlNode *upTermNode;
	      lNode=SxmlGetFirstChildByTagName(indexNode,"l");
	      hfdNumber=SxmlLeafText(SxmlFirstChild(lNode));
	      newDesc=HfdSxmlReadKey(hfdMeshFre, hfdNumber);
	      upTermNode=SxPathFirstResultNode(frePrefTermPath, newDesc);
	      printf("[[Catégorie:%s (MeSH)]]\n", SxmlLeafText(upTermNode));
	      putchar('\n');
	    }
	}
    }
   printf("[[en:Category:%s (MeSH)]]\n",engPrefTerm);
}


int main()
{
  frePrefTermPath=SxPathFirstCompile("concept@type=preferred/term@type=preferred@xml:lang=fr/string");
  engPrefTermPath=SxPathFirstCompile("concept@type=preferred/term@type=preferred@xml:lang=en/string");
  bufPath=NewBuffer();
  bufTree=NewBuffer();
  BufferStrcpy(bufPath,getenv("DILIB_BOTTOM"));
  BufferStrcat (bufPath, "/Bases/Nlm/MeshFreIndexTreeNumber.i");
  indexTreeNumber=HfdIndexOpenRead(BufferString(bufPath));

  BufferStrcpy(bufPath,getenv("DILIB_BOTTOM"));
  BufferStrcat (bufPath, "/Bases/Nlm/MeshFre");
  hfdMeshFre=HfdOpenReadKey(BufferString(bufPath));


  while ((docInput=SxmlInputNextDocumentElement()))
     { 
       generWikiText(docInput);
     }
   exit(EXIT_SUCCESS);
}
