# include "relastro.h"

int main (int argc, char **argv) {

  int status, Ncatalog;
  Catalog *catalog;
  FITS_DB db;

  SkyList *skylist = NULL;

  /* get configuration info, args */
  initialize (argc, argv);

  /* register database handle with shutdown procedure */
  set_db (&db);

  /* lock and load the image db table */
  status = dvo_image_lock (&db, ImageCat, 60.0, (UPDATE ? LCK_XCLD : LCK_SOFT));
  if (!status) Shutdown ("ERROR: failure to lock image catalog %s", db.filename);
  if (db.dbstate == LCK_EMPTY) Shutdown ("ERROR: No images in catalog %s (1)", db.filename);
  if (!dvo_image_load (&db, VERBOSE, FALSE)) Shutdown ("can't read image catalog %s", db.filename);

  /* load regions and images based on specified sky patch */
  skylist = load_images (&db, &UserPatch);

  /* load catalog data from region files : subselect only if we are not doing the objects */
  catalog = load_catalogs (skylist, &Ncatalog, (FIT_TARGET != TARGET_OBJECTS));

  /* match measurements with images, mosaics */
  initImageBins  (catalog, Ncatalog);
  // initMosaicBins (catalog, Ncatalog);

  findImages (catalog, Ncatalog);
  // findMosaics (catalog, Ncatalog);  /* also sets Grid values */

  if (PLOTSTUFF) {
    // plot_star_coords (catalog, Ncatalog);
    plot_mosaic_fields (catalog);
  }

  /* major modes */
  switch (FIT_TARGET) {
    case TARGET_OBJECTS:
      UpdateObjects (catalog, Ncatalog);
      break;
    case TARGET_SIMPLE:
      UpdateSimple (catalog, Ncatalog);
      break;

    case TARGET_CHIPS:
      UpdateChips (catalog, Ncatalog);
      break;

    case TARGET_MOSAICS:
      UpdateMosaic (catalog, Ncatalog);
      break;
    default:
      fprintf (stderr, "programming error at %s:%s", __FILE__, __LINE__);
      exit (2);
  }

  /* put these types of functions inside the update functions
      plot_scatter (catalog, Ncatalog); 
      plot_grid (catalog); 
      plot_mosaics ();
      plot_images ();
      plot_stars (catalog, Ncatalog);
      plot_chisq (catalog, Ncatalog);
  */

  if (!UPDATE) exit (0);

  if (FIT_TARGET == TARGET_OBJECTS) {
    save_catalogs (catalog, Ncatalog);
  } else {
    dvo_image_update (&db, VERBOSE);
    dvo_image_unlock (&db); 
  }

  exit (0);
}

