#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "cgiutils.h"
#include "mgstuff.h"
#include "mg12direct.h"

int file_exists(char *name)
{
  struct stat buf ;

  if (!stat(name, &buf))
    return(1);
  else return(0) ;
}

void dump_with_query(char *fname, char *query)
{
  FILE *fp ;
  char s[1024], *t, *t2 ;
  fp = fopen(fname, "r") ;
  while (!feof(fp)) {
    fgets(s, 1024, fp) ;
    t = s ;
    while (strstr(t, "%q") != NULL) {
      t2 = t ;
      t = strstr(t, "%q") ;
      *t = '\0' ;
      t += 2 ;
      printf("%s%s", t2, query) ;
    }
    printf("%s", t) ;
  }
  putchar('\n') ;
  fclose(fp) ;
}


main()
{
  char *prefix, *query ;
  char fname_temp[FILENAME_MAX] ;
  char *mgdir, *mgname ;
  char s[1024] ;
  FILE *fp ;
  void *qd=NULL ;
  int seglen, segnum, num_ret ;
  char *seglen_in, *segnum_in ;

  decode_query_string("p", &prefix,
		      "q", &query, 
		      "seglen", &seglen_in,
		      "segnum", &segnum_in,
		      NULL) ;

  if (!(nonempty(prefix) && nonempty(query))) return_nothing() ;

  sprintf(fname_temp, "%s.mgf", prefix) ;

  if (!file_exists(fname_temp)) return_nothing() ;

  fp = fopen(fname_temp, "r") ;
  fgets(s, 1024, fp) ;
  *strrchr(s, '\n') = '\0' ;
  mgdir = strdup(s) ;
  fgets(s, 1024, fp) ;
  if (strrchr(s, '\n') != NULL) *strrchr(s, '\n') = '\0' ;
  mgname = strdup(s) ;
  fclose(fp) ;

  return_header("text/html") ;
  printf("<body bgcolor=\"#ffffff\">") ;

  if (!mg_db_available(mgdir, mgname)) {
    printf("<title>Sorry!</title><h1>Sorry!</h1>\n") ;
    printf("The MG collection needed to process your request is being ") ;
    printf("rebuilt. Please try again soon.\n") ;
    exit(1) ;
  }

  mg_bool_query(query, mgdir, mgname, &qd) ;

  sprintf(fname_temp, "%s.hd", prefix) ;
  if (file_exists(fname_temp)) {
    dump_with_query(fname_temp, query) ;
    printf("<p>") ;
  }

  num_ret = mg_get_num_returned(qd) ;
  if (num_ret == 0) {
    printf("<hr>") ;

    sprintf(fname_temp, "%s.no", prefix) ;
    if (file_exists(fname_temp)) 
      dump_with_query(fname_temp, query) ;
  }
  else {
    void *dlp=NULL ;
    char s[1024], *spacestr = "" ;
    int count = 0, i, nsegs, bottom, top ;

    if (nonempty(seglen_in))
      seglen = atoi(seglen_in) ;
    else seglen = -1 ;
    if (num_ret <= seglen) seglen = -1 ;


    if (seglen != -1) {
      if (nonempty(segnum_in))
	segnum = atoi(segnum_in) ;
      else segnum = 1 ;

      printf("<center><b>\n") ;
      bottom = (segnum-1) * seglen + 1 ;
      top = segnum*seglen > num_ret ? num_ret : segnum*seglen ;

      if (top-bottom == 0) 
	printf("Displaying item %d of %d items<br>", bottom, num_ret) ;
      else 
	printf("Displaying items %d-%d of %d items<br>", bottom, top, 
	       num_ret) ;
      if (segnum > 1) {
	printf("<a href=\"ruled_html_query2?p=%s&q=%s&seglen=%d&segnum=%d\">",
	       prefix, query, seglen, segnum-1) ;
	printf("Previous</a>") ;
	spacestr = " - " ;
      }
      nsegs = div(num_ret, seglen).quot + 
	(div(num_ret, seglen).rem == 0 ? 0 : 1) ;
      for (i=0 ; i < nsegs ; i++) {
	fputs(spacestr, stdout) ;
	if (i+1 != segnum) {
	  printf("<a href=\"ruled_html_query2") ;
	  printf("?p=%s&q=%s&seglen=%d&segnum=%d\">",
		 prefix, query, seglen, i+1) ;
	}
	printf("%d", i+1) ;
	if (i+1 != segnum) printf("</a> ") ;
	spacestr = " - " ;
      }

      if (segnum*seglen < num_ret) {
	fputs(spacestr, stdout) ;
	printf("<a href=\"ruled_html_query2?p=%s&q=%s&seglen=%d&segnum=%d\">",
	       prefix, query, seglen, segnum+1) ;
	printf("Next</a>") ;
      }

      printf("</b></center>\n") ;
    }

    printf("<hr>\n") ;

    do {
      if (seglen == -1 ||
	  count >= (segnum-1)*seglen &&
	  count < segnum*seglen) {
	if (dlp != NULL)
	  fputs("<hr>\n", stdout) ;
	mg_setup_doc_line_producer(qd, mg_get_doc_num(qd), &dlp) ;
	while (mg_dlp_more_lines(dlp)) {
	  mg_dlp_next_line(dlp, s) ;
	  fputs(s, stdout) ; 
	}
      }
      count++ ;
    } while (mg_goto_next_doc(qd)) ;
  }

  printf("<hr>\n") ;

  sprintf(fname_temp, "%s.ft", prefix) ;
  if (file_exists(fname_temp)) 
    dump_with_query(fname_temp, query) ;

  fflush(stdout) ;

}
