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

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

SxmlNode *docInput;

void dateReplace(SxmlNode *dateNode, char *type)
{
  static Buffer *bufDate=NULL;
  SxmlNode *dateTarget;
  SxmlNode *yearNode;
  SxmlNode *monthNode;
  SxmlNode *dayNode;
  if (!bufDate) bufDate=NewBuffer();
  dateTarget=SxmlElementCreate ("date");
  SxmlSetAttribute(dateTarget, "type", type);
  if ((yearNode=SxmlGetFirstChildByTagName(dateNode, "Year")))
    BufferStrcpy(bufDate, SxmlLeafText(yearNode));
  if ((monthNode=SxmlGetFirstChildByTagName(dateNode, "Month")))
    {
      BufferStrcat(bufDate, "-");
      BufferStrcat(bufDate, SxmlLeafText(monthNode));
    }
  if ((dayNode=SxmlGetFirstChildByTagName(dateNode, "Day")))
    {
      BufferStrcat(bufDate, "-");
      BufferStrcat(bufDate, SxmlLeafText(dayNode));
    }
  SxmlAppendChild(dateTarget, SxmlTextCreate(BufferString(bufDate)));
  SxmlSetAttribute(dateTarget, "when", BufferString(bufDate));
  SxmlReplaceChild(dateNode, dateTarget);
}

void qualifierReplace(SxmlNode *listNode)
{
  SxmlNode *qualifiersList;
  SxmlNode *inputQualifier;
  SxmlNode *targetQualifier;
  qualifiersList=SxmlElementCreate ("qualifiersList");
  SxmlReset(listNode);
  while ((inputQualifier=SxmlNextNode(listNode)))
    {
      if (SxmlNodeHasName(inputQualifier, "AllowableQualifier"))
	{
	  SxmlNode *QR;
	  if ((QR=SxmlGetFirstChildByTagName(inputQualifier, "QualifierReferredTo")))
	    {
	      SxmlNode *name;
	      if ((name=SxmlGetFirstChildByTagName(QR, "QualifierName")))
		{
		  SxmlNode *string;
		  if ((string=SxmlGetFirstChildByTagName(name, "String")))
		    {
		      SxmlNode *UI;
		      SxmlAppendChild(qualifiersList, targetQualifier=SxmlLeafCreate ("qualifier", SxmlLeafText(string)));
		      if ((UI=SxmlGetFirstChildByTagName(QR, "QualifierUI")))
			{
			  SxmlSetAttribute( targetQualifier, "UI", SxmlLeafText(UI));
			}
		    }
		}
	    }
	}
      else
	{
	  SxmlAppendChild(qualifiersList, targetQualifier=SxmlLeafCreate ("error", "no AQ"));
	}
    }
  SxmlReplaceChild(listNode, qualifiersList);
}

void pharmacoReplace(SxmlNode *listNode)
{
  SxmlNode * pharmacoList;
  SxmlNode * action;
  SxmlNode *targetAction;
  pharmacoList=SxmlElementCreate ("pharmacologicalActionList");
  SxmlReset(listNode);
  while ((action=SxmlNextNode(listNode)))
    {
      if (SxmlNodeHasName(action, "PharmacologicalAction"))
	{
	  SxmlNode *DR;
	  if ((DR=SxmlGetFirstChildByTagName(action, "DescriptorReferredTo")))
	    {
	      SxmlNode *name;
	      if ((name=SxmlGetFirstChildByTagName(DR, "DescriptorName")))
		{
		  SxmlNode *string;
		  if ((string=SxmlGetFirstChildByTagName(name, "String")))
		    {
		      SxmlNode *UI;
		      SxmlAppendChild(pharmacoList, targetAction=SxmlLeafCreate ("action", SxmlLeafText(string)));
		      if ((UI=SxmlGetFirstChildByTagName(DR, "DescriptorUI")))
			{
			  SxmlSetAttribute( targetAction, "UI", SxmlLeafText(UI));
			}
		    }
		}
	    }
	}
      else
	{
	  SxmlAppendChild(pharmacoList, targetAction=SxmlLeafCreate ("error", "no action"));
	}
    }
  SxmlReplaceChild(listNode, pharmacoList);
}

void conceptMoveHead(SxmlNode *inputConcept, SxmlNode *outputConcept)
{
  SxmlNode *inputName;
  SxmlNode *UI;
  if ((inputName=SxmlGetFirstChildByTagName(inputConcept, "ConceptName")))
    {
      SxmlNode *string;
      if ((string=SxmlGetFirstChildByTagName(inputName, "String")))
	{
	  SxmlAppendChild(outputConcept, SxmlLeafCreate("name", SxmlLeafText(string)));
	}
      SxmlFree(inputName);
    }
  if ((UI=SxmlGetFirstChildByTagName(inputConcept, "ConceptUI")))
    {
      SxmlSetAttribute(outputConcept, "UI", SxmlLeafText(UI));
      SxmlFree(UI);
    }
}

SxmlNode *findFrePrefTerm(SxmlNode *listTerms)
{
  SxmlNode *term;
  SxmlReset (listTerms);
  while ((term=SxmlNextNode(listTerms)))
    {
      SxmlNode *termUI;
      if (SxmlHasAttribute(term, "ConceptPreferredTermYN","N")) continue;
      termUI=SxmlGetFirstChildByTagName(term, "TermUI");
      if (strncmp(SxmlLeafText(termUI), "fre", 3)==0) return term;
    }
  return NULL;
}

SxmlNode *findEngPrefTerm(SxmlNode *listTerms)
{
  SxmlNode *term;
  SxmlReset (listTerms);
  while ((term=SxmlNextNode(listTerms)))
    {
      SxmlNode *termUI;
      if (SxmlHasAttribute(term, "ConceptPreferredTermYN","N")) continue;
      termUI=SxmlGetFirstChildByTagName(term, "TermUI");
      if (strncmp(SxmlLeafText(termUI), "fre", 3)!=0) return term;
    }
  return NULL;
}

void conceptListReplace(SxmlNode *listNode)
{
  SxmlNode *preferredConcept;
  SxmlNode *targetPreferredConcept;
  SxmlNode *otherConcepts;
  SxmlNode *termList;
  
  preferredConcept=SxmlGetFirstChildTagAtt(listNode, "Concept", "PreferredConceptYN", "Y");
  if (!preferredConcept) return;
  SxmlRemoveChild(preferredConcept);
  SxmlRemoveChild(listNode);
  SxmlAppendChild(docInput, targetPreferredConcept=SxmlElementCreate("concept"));
  SxmlSetAttribute(targetPreferredConcept, "type", "preferred");
  conceptMoveHead(preferredConcept, targetPreferredConcept);
  if ((termList=SxmlGetFirstChildByTagName(preferredConcept, "TermList")))
    {
      SxmlNode *frenchInputTerm;
      SxmlNode *engInputTerm;
      SxmlNode *targetTerm;
      SxmlNode *termUI;
      SxmlNode *string;

      if ((frenchInputTerm=findFrePrefTerm(termList)))
	{
	  SxmlAppendChild (targetPreferredConcept, targetTerm=SxmlElementCreate("term"));
	  SxmlSetAttribute(targetTerm, "xml:lang", "fr");
	  SxmlSetAttribute(targetTerm, "type", "preferred");
	  termUI=SxmlGetFirstChildByTagName(frenchInputTerm, "TermUI");
	  SxmlSetAttribute(targetTerm, "UI", SxmlLeafText(termUI));
	  string=SxmlGetFirstChildByTagName(frenchInputTerm, "String");
	  SxmlAppendChild(targetTerm, SxmlLeafCreate("string", SxmlLeafText(string)));
	  SxmlFree(frenchInputTerm);
	}
      if ((engInputTerm=findEngPrefTerm(termList)))
	{
	  SxmlAppendChild (targetPreferredConcept, targetTerm=SxmlElementCreate("term"));
	  SxmlSetAttribute(targetTerm, "xml:lang", "en");
	  SxmlSetAttribute(targetTerm, "type", "preferred");
	  termUI=SxmlGetFirstChildByTagName(engInputTerm, "TermUI");
	  SxmlSetAttribute(targetTerm, "UI", SxmlLeafText(termUI));
	  string=SxmlGetFirstChildByTagName(engInputTerm, "String");
	  SxmlAppendChild(targetTerm, SxmlLeafCreate("string", SxmlLeafText(string)));
	  SxmlFree(engInputTerm);
	}
    }
  if (SxmlFirstChild(listNode))
    {
      SxmlNode *inputConcept;
      SxmlNode *outputConcept;
      SxmlAppendChild(docInput, otherConcepts=SxmlElementCreate("othersConcepts"));
      SxmlReset(listNode);
      while ((inputConcept=SxmlNextNode(listNode)))
	{
	  SxmlAppendChild(otherConcepts, outputConcept=SxmlElementCreate("concept"));
	  conceptMoveHead(inputConcept, outputConcept);
	}
    }
  SxmlFree(listNode);
  SxmlFree(preferredConcept);
}

int main()
{
   while ((docInput=SxmlInputNextDocumentElement()))
     { 
       SxmlNode *dateNode;
       SxmlNode *listNode;
       if ((dateNode=SxmlGetFirstChildByTagName(docInput, "DateCreated")))
	 dateReplace(dateNode,"created");
       if ((dateNode=SxmlGetFirstChildByTagName(docInput, "DateRevised")))
	 dateReplace(dateNode,"revised");
       if ((dateNode=SxmlGetFirstChildByTagName(docInput, "DateEstablished")))
	 dateReplace(dateNode,"established");
       if ((listNode=SxmlGetFirstChildByTagName(docInput, "AllowableQualifiersList")))
	 qualifierReplace(listNode);
       if ((listNode=SxmlGetFirstChildByTagName(docInput, "PharmacologicalActionList")))
	 pharmacoReplace(listNode);
       if ((listNode=SxmlGetFirstChildByTagName(docInput, "ConceptList")))
	 conceptListReplace(listNode);
       SxmlPrint (SxmlInputRecord);

     }
   exit(EXIT_SUCCESS);
}
