/*
 *
 *      Copyright (C) 1991 by the Massachusetts Institute of Technology
 *      Developed by the MIT Student Information Processing Board (SIPB).
 *      For copying information, see the file mit-copyright.h in this release.
 *
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <time.h> /* nuke this */
#include <sys/types.h>
#include <sys/file.h>
#include <errno.h>
#include <malloc.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <discuss/discuss.h>
#include "proto.h"

extern tfile http_tfile();

extern char *sys_errlist[];
extern int sys_nerr;

int bsize;
char *buffer;

void dsread(char* host, char* path, int trans_num, int out)
{
  name_blk meetings;
  mtg_info meeting_info;
  int result;
  tfile tf;
  trn_info2 trn_info;

  initialize_dsc_error_table();

  meetings.hostname = host;
  meetings.pathname = path;
  meetings.user_id = "";
  meetings.aliases = NULL;
  meetings.status = 0;
  meetings.date_attended = 0;
  meetings.last = 0;

  tf = http_tfile(out);   /* Wrap socket in a tfile.  Grooooooooooossss. */

  dsc_get_mtg_info(&meetings,&meeting_info,&result);
  if (result != 0) {
    fd_print(out, "error getting meeting info for meeting '%s:%s': %s\r\n",
	    meetings.hostname, meetings.pathname,
	    error_message(result));
  }

  dsc_get_trn_info2(&meetings,trans_num,&trn_info,&result);
  if (result != 0) {
    fd_print(out, "error getting transaction info for %s[%d]: %s\r\n",
	     (char *) (rindex(meetings.pathname,'/')+1), trans_num,
	     error_message(result));
  }

  fd_print(out, "<HEAD><TITLE>discuss@%s: [%d] in \"%s\"</TITLE>\r\n",
	   meetings.hostname, trans_num, meeting_info.long_name);
  fd_print(out, "<H1>[%d] in %s</H1></HEAD>\r\n",
	   trans_num, meeting_info.long_name);

      /***  print out help and back-out stuff  ***/

  /* fd_print(out, "<A HREF=\"%d\">%d</A><P>\r\n",); */

  fd_print(out,
	   "<A HREF=\"%s/\"><IMG SRC=\"%s/i-d.gif\" ALT=\"root\"></A>\r\n",
	   SRV_SELF, SRV_SELF);

  fd_print(out,
   "<A HREF=\"?%d\"><IMG SRC=\"%s/i-back.gif\" ALT=\"meeting\"></A>\r\n",
	   trans_num, SRV_SELF);

  fd_print(out,
   "<A HREF=\"%s/help.html\"><IMG SRC=\"%s/i-help.gif\" ALT=\"help\"></A>\r\n",
	   SRV_SELF, SRV_SELF);

      /***  print out prev/next/pref/nref/... pointers  ***/

  if (meeting_info.first && (meeting_info.first != trans_num))
    fd_print(out,
           "<A HREF=\"%d\"><IMG SRC=\"%s/i-first.gif\" ALT=\"first\"></A>\r\n",
	     meeting_info.first, SRV_SELF);
  else fd_print(out, "<IMG SRC=\"%s/n-first.gif\" ALT=\"\">\r\n", SRV_SELF);

  if (trn_info.fref && (trn_info.fref != trans_num))
    fd_print(out,
   "<A HREF=\"%d\"><IMG SRC=\"%s/i-fref.gif\" ALT=\"first in chain\"></A>\r\n",
	     trn_info.fref, SRV_SELF);
  else fd_print(out, "<IMG SRC=\"%s/n-fref.gif\" ALT=\"\">\r\n", SRV_SELF);

  if (trn_info.pref)
    fd_print(out,
"<A HREF=\"%d\"><IMG SRC=\"%s/i-pref.gif\" ALT=\"previous in chain\"></A>\r\n",
	     trn_info.pref, SRV_SELF);
  else fd_print(out, "<IMG SRC=\"%s/n-pref.gif\" ALT=\"\">\r\n", SRV_SELF);

  if (trn_info.prev)
    fd_print(out,
         "<A HREF=\"%d\"><IMG SRC=\"%s/i-prev.gif\" ALT=\"previous\"></A>\r\n",
	     trn_info.prev, SRV_SELF);
  else fd_print(out, "<IMG SRC=\"%s/n-prev.gif\" ALT=\"\">\r\n", SRV_SELF);

  if (trn_info.next)
    fd_print(out,
             "<A HREF=\"%d\"><IMG SRC=\"%s/i-next.gif\" ALT=\"next\"></A>\r\n",
	     trn_info.next, SRV_SELF);
  else fd_print(out, "<IMG SRC=\"%s/n-next.gif\" ALT=\"\">\r\n", SRV_SELF);

  if (trn_info.nref)
    fd_print(out,
    "<A HREF=\"%d\"><IMG SRC=\"%s/i-nref.gif\" ALT=\"next in chain\"></A>\r\n",
	     trn_info.nref, SRV_SELF);
  else fd_print(out, "<IMG SRC=\"%s/n-nref.gif\" ALT=\"\">\r\n", SRV_SELF);

  if (trn_info.lref && (trn_info.lref != trans_num))
    fd_print(out,
    "<A HREF=\"%d\"><IMG SRC=\"%s/i-lref.gif\" ALT=\"last in chain\"></A>\r\n",
	     trn_info.lref, SRV_SELF);
  else fd_print(out, "<IMG SRC=\"%s/n-lref.gif\" ALT=\"\">\r\n", SRV_SELF);

  if (meeting_info.last && (meeting_info.last != trans_num))
    fd_print(out,
           "<A HREF=\"%d\"><IMG SRC=\"%s/i-last.gif\" ALT=\"last\"></A>\r\n",
	     meeting_info.last, SRV_SELF);
  else fd_print(out, "<IMG SRC=\"%s/n-last.gif\" ALT=\"\">\r\n", SRV_SELF);

      /***  print out the transaction  ***/

  if (!(trn_info.flags & TRN_FDELETED)) {
    char *tdate, *datep, *dateq, *datee;

    fd_write(out, "<HR><H2>");
    fd_write_quoted(out, trn_info.subject);
    fd_write(out, "</H2>\r\n<H3>");

    fd_write_quoted(out, trn_info.author);
    fd_write(out, " (");

    tdate = ctime(&trn_info.date_entered);
    datep = strpbrk(tdate, " \t\r\n"); /* day of week */
    while ((*datep==' ') || (*datep=='\t')) datep++;
    datep = strpbrk(datep, " \t\r\n"); /* month */
    while ((*datep==' ') || (*datep=='\t')) datep++;
    datep = strpbrk(datep, " \t\r\n"); /* date */
    if (datep && (*datep)) { (*datep) = '\0'; datep++; }

    if (tdate) fd_write(out, tdate);
    fd_write(out, " ");

    while ((*datep==' ') || (*datep=='\t')) datep++;
    dateq = strpbrk(datep, " \t\r\n"); /* time */
    if (dateq && (*dateq)) { (*dateq) = '\0'; dateq++; }
    while ((*dateq==' ') || (*dateq=='\t')) dateq++;
    datee = strpbrk(dateq, " \t\r\n"); /* time */
    if (datee && (*datee)) (*datee) = '\0';

    if (dateq) fd_write(out, dateq);
    fd_write(out, "   ");
    if (datep) fd_write(out, datep);
    fd_write(out, ")</H3>\r\n");

    free(tdate);

    fd_write(out, "<PRE>\r\n");
    dsc_get_trn(&meetings,trans_num,tf,&result);
    fd_write(out, "</PRE>\r\n");
    if (result != 0)
      fd_print(out,"error getting transaction %s[%d]: %s\r\n",
	       (char *) (rindex(meetings.pathname,'/')+1), trans_num,
	       error_message(result));
  }
}

void dslist(char* host, char* path, int lo, int hi, int num_tr, int out)
{
  name_blk meetings;
  mtg_info meeting_info;
  int result;
  trn_info2 trn_info;
  int tr;

  initialize_dsc_error_table();

  meetings.hostname = host;
  meetings.pathname = path;
  meetings.user_id = "";
  meetings.aliases = NULL;
  meetings.status = 0;
  meetings.date_attended = 0;
  meetings.last = 0;

  --num_tr;

  dsc_get_mtg_info(&meetings,&meeting_info,&result);
  if (result != 0) {
    fd_print(out, "error getting meeting info for meeting '%s:%s': %s\r\n",
	    meetings.hostname, meetings.pathname,
	    error_message(result));
  }

  if (lo > 0) {
    if (lo < meeting_info.lowest)  lo = meeting_info.lowest;
    if (lo > meeting_info.highest) lo = meeting_info.highest;
    if (hi <= -2) {
      hi = lo + num_tr;
    } else if (hi <= 0) {
      hi = meeting_info.highest;
    }
    if (hi > meeting_info.highest) hi = meeting_info.highest;
  } else {
    hi = meeting_info.highest;
    lo = (hi - num_tr);
    if (lo < meeting_info.lowest)  lo = meeting_info.lowest;
  }

  fd_print(out, "<HEAD><TITLE>discuss@%s: %d-%d in \"%s\"</TITLE>\r\n",
	   meetings.hostname, lo, hi, meeting_info.long_name);
  fd_print(out, "<H1>%s</H1></HEAD>\r\n", meeting_info.long_name);

  fd_print(out,
	   "<A HREF=\"%s/\"><IMG SRC=\"%s/i-d.gif\" ALT=\"root\"></A>\r\n",
	   SRV_SELF, SRV_SELF);

  fd_print(out,
   "<A HREF=\"%s/help.html\"><IMG SRC=\"%s/i-help.gif\" ALT=\"help\"></A>\r\n",
	   SRV_SELF, SRV_SELF);

  if (lo > meeting_info.lowest) {
    tr = lo - num_tr - 1;
    if (tr < meeting_info.lowest) tr = meeting_info.lowest;
    fd_print(out,
	     "<A HREF=\"?%d-%d\"><IMG SRC=\"%s/i-up.gif\" ALT=\"up\"></A>\r\n",
	     tr, lo-1, SRV_SELF);
  } else fd_print(out, "<IMG SRC=\"%s/n-up.gif\" ALT=\"\">\r\n", SRV_SELF);

  if (hi < meeting_info.highest) {
    tr = hi + num_tr + 1;
    if (tr > meeting_info.highest) tr = meeting_info.highest;
    fd_print(out,
	 "<A HREF=\"?%d-%d\"><IMG SRC=\"%s/i-down.gif\" ALT=\"down\"></A>\r\n",
	     hi+1, tr, SRV_SELF);
  } else fd_print(out, "<IMG SRC=\"%s/n-down.gif\" ALT=\"\">\r\n", SRV_SELF);

  fd_write(out, "<PRE>\r\n");
  for (tr = lo; tr <= hi; tr++) {
    dsc_get_trn_info2(&meetings,tr,&trn_info,&result);
    if (result != 0) {
      if (result != DELETED_TRN)
	fd_print(out, "error getting transaction info for %s[%d]: %s\r\n",
		 (char *) (rindex(meetings.pathname,'/')+1), result,
		 error_message(result));
    } else {
      fd_print(out, "<A HREF=\"%d\">[%04d]</A> ", tr, tr);
      fd_print_quoted(out, "%-25s %s\r\n", trn_info.author, trn_info.subject);
    }
  }
  fd_write(out, "</PRE>\r\n");
}
