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

/*
 NlmPubMedGetCorpus/c
 
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Nlm.h"
#include "CharSetBuffer.h"

extern char *optarg;
extern int   optind;
int getopt();

int main (int argc, char **argv)
{
  int cOption;
 
  char *query;
  char *sizeParam;
  int output;
  int size;

  SxmlNode *idList;
  SxmlNode *idNode;
  Buffer *bufIdList;
  char *urlQuery;
  char *idListStr;
  int id1;
  static SxmlNode *resultDoc;

  NlmCurlInit();

  NlmTraceMode=0;
  sizeParam=NULL;
  size=1000;

  output =1;  /* just print result */

  while((cOption=getopt(argc,argv,"s:q:xT:"))!=EOF)
    {switch (cOption)
	{
	case 'q':
	  query=optarg;
	  break;
	case 'T':
	  NlmTraceMode=atoi(optarg);
	  break;
	case 'x':   /* result in xml coding */
	  output=2;
	  break;
	case 's':
	  sizeParam=optarg;
	  size=atoi(sizeParam);
	  if (size > 9999) 
	    {
	      fprintf(stderr, "** size: %s too big\n",sizeParam);
	      return 0;
	    }
	  break;
	}
    }

  resultDoc=NlmPerformSearch("pubmed", query, size);
  if(resultDoc)
    {
      if (output==1)
	{
	  SxmlPrint(resultDoc);
	  putchar('\n');
	  curl_easy_cleanup(NlmCurlHandle);
	  return 0;
	}
      idList=SxmlGetFirstChildByTagName(resultDoc,"IdList");
      if (NlmTraceMode > 1)
	{
	SxmlPrint(idList);
	putchar('\n');
	}
      SxmlReset (idList);
      bufIdList=NewBuffer();
      if (size < 100)
	{
	  id1=1;
	  while((idNode=SxmlNextNode(idList)))
	    {
	      if (SxmlIsLeaf(idNode))
		{
		  if (id1==1)id1=0;
		  else BufferStrcat(bufIdList,",");
		  BufferStrcat(bufIdList,SxmlLeafText(idNode));
		}
	    }
	  idListStr=BufferString(bufIdList);
	  NlmPerformFetch("pubmed", idListStr);
	}
      else
	{
	  int subListSize;
	  subListSize=0;
	  id1=1;
	  while((idNode=SxmlNextNode(idList)))
	    {
	      if (SxmlIsLeaf(idNode))
		{
		  if (id1==1)id1=0;
		  else BufferStrcat(bufIdList,",");
		  BufferStrcat(bufIdList,SxmlLeafText(idNode));
		  if (subListSize>99)
		    {
		      idListStr=BufferString(bufIdList);
		      NlmPerformFetch("pubmed", idListStr);
		      BufferReset(bufIdList);
		      id1=1;
		      subListSize=0;
		    }
		  else subListSize++;
		}
	    }
	  if (subListSize>0)
	    {
	      idListStr=BufferString(bufIdList);
	      NlmPerformFetch("pubmed", idListStr);
	    }
	}
      NlmCurlEnd();
    }
  return 0;
}
