# include "dvoshell.h"

/* time concepts */
static time_t TimeReference;
static int TimeFormat;

void dbExtractMeasuresInit () {
  GetTimeFormat (&TimeReference, &TimeFormat);
}

/* return measure.field based on the selection */
double dbExtractMeasures (Average *average, SecFilt *secfilt, Measure *measure, dbField *field) {

  int i;
  double value;
  double ra, dec, x, y;

  Image *image;
  Coords *mosaic;

  value = NO_MAG;

  switch (field->ID) {
    // XXX not sure how to apply the photcode here....
    case MEAS_MAG: /* magnitudes are already determined above */
      switch (field->magMode) {
	case MAG_INST:
	  value = PhotInst (measure);  
	  break;
	case MAG_CAT:
	  value = PhotCat  (measure); 
	  break;
	case MAG_SYS:
	  value = PhotSys  (measure, average, secfilt); 
	  break;
	case MAG_REL:
	  value = PhotRel  (measure, average, secfilt); 
	  break;
	case MAG_CAL:
	  value = PhotCal  (measure, average, secfilt, measure, GetPhotcodeEquivbyCode (measure[0].photcode)); 
	  break;
	case MAG_AVE:
	  value = PhotAve  (GetPhotcodeEquivbyCode (measure[0].photcode), average, secfilt); 
	  break;
	case MAG_REF:
	  value = PhotRef  (GetPhotcodeEquivbyCode (measure[0].photcode), average, secfilt, measure); 
	  break;
      }
      break;
    case MEAS_RA: /* OK */
      value = average[0].R - measure[0].dR / 3600.0;
      break;
    case MEAS_DEC: /* OK */
      value = average[0].D - measure[0].dD / 3600.0;
      break;
    case MEAS_dMAG: /* OK */
      value = measure[0].dM;
      break;
    case MEAS_AIRMASS: /* OK */
      value = measure[0].airmass;
      break;
    case MEAS_EXPTIME: /* OK */
      value = pow (10.0, measure[0].dt * 0.4);
      break;
    case MEAS_PHOTCODE: /* OK */
      value = measure[0].photcode;
      break;
    case MEAS_TIME: /* OK */
      value = TimeValue (measure[0].t, TimeReference, TimeFormat);
      break;
    case MEAS_dR: /* OK */
      value = measure[0].dR;
      break;
    case MEAS_dD: /* OK */
      value = measure[0].dD;
      break;
    case MEAS_FWHM: /* OK */
      value = 0.01*measure[0].FWx;
      break;
    case MEAS_DOPHOT: /* OK */
      value = measure[0].dophot;
      break;
    case MEAS_FLAGS: /* ? */
      value = measure[0].flags;
      break;
    case MEAS_XCCD: /* OK */
/* I need to perform this conversion for ELIXIR and LONEOS formats on load */      
# if 0
      value = measure[0].Xccd;
# else
      ra  = average[0].R - measure[0].dR / 3600.0;
      dec = average[0].D - measure[0].dD / 3600.0;
      image = MatchImage (measure[0].t, measure[0].photcode);
      if (image == NULL) break;
      RD_to_XY (&x, &y, ra, dec, &image[0].coords);
      value = x;
# endif
      break;
    case MEAS_YCCD: /* OK */
/* I need to perform this conversion for ELIXIR and LONEOS formats on load */      
# if 0
      value = measure[0].Yccd;
# else
      ra  = average[0].R - measure[0].dR / 3600.0;
      dec = average[0].D - measure[0].dD / 3600.0;
      image = MatchImage (measure[0].t, measure[0].photcode);
      if (image == NULL) break;
      RD_to_XY (&x, &y, ra, dec, &image[0].coords);
      value = y;
# endif
      break;
    case MEAS_XMOSAIC: /* OK */
      ra  = average[0].R - measure[0].dR / 3600.0;
      dec = average[0].D - measure[0].dD / 3600.0;
      mosaic = MatchMosaic (measure[0].t, measure[0].photcode);
      if (mosaic == NULL) break;
      RD_to_XY (&x, &y, ra, dec, mosaic);
      value = x;
      break;
    case MEAS_YMOSAIC: /* OK */
      ra  = average[0].R - measure[0].dR / 3600.0;
      dec = average[0].D - measure[0].dD / 3600.0;
      mosaic = MatchMosaic (measure[0].t, measure[0].photcode);
      if (mosaic == NULL) break;
      RD_to_XY (&x, &y, ra, dec, mosaic);
      value = y;
      break;
  }
  return (value);
}

/** the mosaic entries do not use the registered mosaic found 
    by MatchImage (via FindMosaicForImage).  Rather, they use
    a coordinate frame saved by SetImageSelection 
**/
