/************************************************/
/*                                              */
/* File        : dmap2html.c                    */
/* Description : html document creator          */
/*                                              */
/* Author: Sfiligoi Igor                        */
/*                                              */
/* Created      : 07.04.1997                    */
/* Last modified: 11.07.1997                    */
/*                                              */
/************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <Error.h>
#include <GeoVme.h>
#include <dmap.h>

/* write the map as a html file */
int dmap_write_html(char *file_prefix,
		    char *dir_name,
		    char *system_name)
{
  char tmpstr[16*1024];
  int dir_ok;   /* if true(1), dir_name end in / */

  if ((dir_name==NULL)||(strlen(dir_name)==0))
    {
      ErrorSet(DMAP_ERROR_UNKNOWN,"dmap_write_html","Dir_name empty!");
      return DMAP_ERROR_UNKNOWN;
    }
  dir_ok = (dir_name[strlen(dir_name)-1]=='/');

  {
    FILE *fmain;
    int chain_nr;

    if (dir_ok)
      sprintf(tmpstr,"%s%s.html",dir_name,file_prefix);
    else
      sprintf(tmpstr,"%s/%s.html",dir_name,file_prefix);

    fmain = fopen(tmpstr,"w");

    if (fmain==NULL)
      {
	ErrorSetF(DMAP_ERROR_UNKNOWN,"dmap_write_html","Error creating file %s.",tmpstr);
	return DMAP_ERROR_UNKNOWN;
      }

    fprintf(fmain,"<HTML>\n\n<HEAD>\n<TITLE>%s</TITLE>\n</HEAD>\n\n<BODY>\n",system_name);
    fprintf(fmain,"\n<H1>%s</H1>\n\n",system_name);

    fprintf(fmain,"<UL>\n");


    for (chain_nr=1; chain_nr<=dmap_query_nr_chains(); chain_nr++)
      {
	int crate_nr;

	/* write in the previous level file */
	fprintf(fmain,"<LI>Chain %i\n\t<UL>\n",chain_nr);

	for (crate_nr=1; crate_nr<dmap_query_nr_crates(chain_nr); crate_nr++)
	  {
	    int board_nr;
	    FILE *fcrate;
	    
	    sprintf(tmpstr,"%s_%i_%i.html",file_prefix,chain_nr,crate_nr);
	    
	    /* write in the previous level file */
	    fprintf(fmain,"\t<LI><A HREF=\"%s\">Crate %i</A>\n",tmpstr,crate_nr);
	    
	    if (dir_ok)
	      sprintf(tmpstr,"%s%s_%i_%i.html",dir_name,file_prefix,chain_nr,crate_nr);
	    else
	      sprintf(tmpstr,"%s/%s_%i_%i.html",dir_name,file_prefix,chain_nr,crate_nr);

	    fcrate = fopen(tmpstr,"w");
	    
	    if (fcrate==NULL)
	      {
		ErrorSetF(DMAP_ERROR_UNKNOWN,"dmap_write_html","Error creating file %s.",tmpstr);
		return DMAP_ERROR_UNKNOWN;
	      }
	    
	    
	    fprintf(fcrate,"<HTML>\n\n<HEAD>\n<TITLE>%s Chain %i Crate %i</TITLE>\n</HEAD>\n\n<BODY>\n",system_name,chain_nr,crate_nr);
	    fprintf(fcrate,"\n<H1>%s Chain %i Crate %i</H1>\n\n",system_name,chain_nr,crate_nr);
	    
	    /* write the internal links */
	    fprintf(fcrate,"<UL>\n");
	    
	    for (board_nr=0; board_nr<dmap_query_nr_slots(chain_nr,crate_nr); board_nr++)
	      if (dmap_query_btype(chain_nr,crate_nr,board_nr)!=DMAP_ERROR_EMPTY)
		fprintf(fcrate,"<LI><A HREF=\"#slot_%i\">Slot %i</A>\n",board_nr,board_nr);

	    fprintf(fcrate,"</UL>\n");

	    /* write the data */
	    for (board_nr=0; board_nr<dmap_query_nr_slots(chain_nr,crate_nr); board_nr++)
	      {
		int btype = dmap_query_btype(chain_nr,crate_nr,board_nr);

		if (btype!=DMAP_ERROR_EMPTY)
		  {
		    fprintf(fcrate,"<P>\n<HR>\n<A NAME=\"slot_%i\">\n<H2>%s Chain %i Crate %i Slot %i</H2>\n\n",board_nr,system_name,chain_nr,crate_nr,board_nr);
		    
		    /* write the board type */
		    fprintf(fcrate,"Board type: ");
		    switch (btype)
		      {
		      case DMAP_BTYPE_CALTDC:
			fprintf(fcrate,"Calorimeter TDC");
			break;
		      case DMAP_BTYPE_CALADC:
			fprintf(fcrate,"Calorimeter ADC");
			break;
		      case DMAP_BTYPE_CHATDC:
			fprintf(fcrate,"Chamber TDC");
			break;
		      case DMAP_BTYPE_QCALTDC:
			fprintf(fcrate,"QCAL TDC");
			break;
		      case DMAP_BTYPE_QCALADC:
			fprintf(fcrate,"QCAL ADC");
			break;
		      }
		    fprintf(fcrate,"\n\n<P>\n\n");

		    
		    /* write the board content */
		    switch (btype)
		      {
		      case DMAP_BTYPE_CALTDC:
		      case DMAP_BTYPE_CALADC:
			{
			  int chan_nr;

			  fprintf(fcrate,"<TABLE BORDER>\n");
			  fprintf(fcrate,"<TR><TH>Channel</TH><TH>Detector</TH><TH>Module</TH><TH>Plane</TH><TH>Column</TH><TH>Side</TH></TR>\n");

			  for (chan_nr=0; chan_nr<dmap_query_nr_chans(chain_nr,crate_nr,board_nr); chan_nr++)
			    {
			      DMAP_CHAN_EL chan_el;

			      if (dmap_get(chain_nr,crate_nr,board_nr,chan_nr,&chan_el)!=DMAP_ERROR_EMPTY)
				{
				  int amodule,aplane,acolumn,aside;
				  char adetector[64];
				  DMAP_CAL_EL *el;
				  
				  el = &(chan_el.data.cal);
				  
				  if (el->detector == DMAP_DET_ECAPA)
				    strcpy(adetector,"ECAPA");
				  else if (el->detector == DMAP_DET_ECAPB)
				    strcpy(adetector,"ECAPB");
				  else if (el->detector == DMAP_DET_BARREL)
				    strcpy(adetector,"BARR");

				  amodule = el->module;
				  aplane = el->plane;
				  acolumn = el->column;
				  aside = el->side;

				  fprintf(fcrate,"<TR><TD>%i</TD><TD>%s</TD><TD>%i</TD><TD>%i</TD><TD>%i</TD><TD>%i</TD></TR>\n",
					  chan_nr,adetector,amodule,aplane,acolumn,aside);
				}
			    }
			  fprintf(fcrate,"</TABLE>\n\n");
			}
			break;
		      case DMAP_BTYPE_CHATDC:
			{
			  int chan_nr;

			  fprintf(fcrate,"<TABLE BORDER>\n");
			  fprintf(fcrate,"<TR><TH>Channel</TH><TH>Layer</TH><TH>Wire</TH></TR>\n");

			  for (chan_nr=0; chan_nr<dmap_query_nr_chans(chain_nr,crate_nr,board_nr); chan_nr++)
			    {
			      DMAP_CHAN_EL chan_el;

			      if (dmap_get(chain_nr,crate_nr,board_nr,chan_nr,&chan_el)!=DMAP_ERROR_EMPTY)
				{
				  int alayer,awire;
				  DMAP_CHAMBER_EL *el;

				  el = &(chan_el.data.chamber);
				  
				  alayer = el->layer;
				  awire = el->wire;

				  fprintf(fcrate,"<TR><TD>%i</TD><TD>%i</TD><TD>%i</TD></TR>\n",
					  chan_nr,alayer,awire);
				}
			    }
			  fprintf(fcrate,"</TABLE>\n\n");
			}
			break;
		      case DMAP_BTYPE_QCALTDC:
		      case DMAP_BTYPE_QCALADC:
			{
			  int chan_nr;

			  fprintf(fcrate,"<TABLE BORDER>\n");
			  fprintf(fcrate,"<TR><TH>Channel</TH><TH>Detector</TH><TH>Module</TH></TR>\n");

			  for (chan_nr=0; chan_nr<dmap_query_nr_chans(chain_nr,crate_nr,board_nr); chan_nr++)
			    {
			      DMAP_CHAN_EL chan_el;

			      if (dmap_get(chain_nr,crate_nr,board_nr,chan_nr,&chan_el)!=DMAP_ERROR_EMPTY)
				{
				  int amodule;
				  char adetector[64];
				  DMAP_QCAL_EL *el;

				  el = &(chan_el.data.qcal);

				  if (el->detector == DMAP_DET_QCALA)
				    strcpy(adetector,"QCALA");
				  else if (el->detector == DMAP_DET_QCALB)
				    strcpy(adetector,"QCALB");

				  amodule = el->module;

				  fprintf(fcrate,"<TR><TD>%i</TD><TD>%s</TD><TD>%i</TD></TR>\n",
					  chan_nr,adetector,amodule);
				}
			    }
			  fprintf(fcrate,"</TABLE>\n\n");
			}
			break;
		      }
		  }
	      }
	  }
    
	fprintf(fmain,"\t</UL>\n");
      }


    fprintf(fmain,"</UL>\n");
    fprintf(fmain,"</BODY>\n\n</HTML>\n");
    fclose(fmain);
  }


  return DMAP_ERROR_OK;
}

int main(int argc, char *argv[])
{
  int res;
  DMAP_CHAN_EL data;

  if (argc!=6)
    {
      printf("Use: dmap2html GeoVmeMap dmap file_prefix outdir title\n");
      return 1;
    }

  GeoVmeLoadMap(argv[1]);

  if (dmap_load(argv[2])!=DMAP_ERROR_OK)
    {
      printf("Error in dmap_load\n");
      return 2;
    }

  if (dmap_write_html(argv[3],argv[4],argv[5])!=DMAP_ERROR_OK)

    {
      printf("Error in dmap_write_html\n");
      return 3;
    }

  return 0;
}