/**
 * @mainpage EnsFcstComb
 *
 * This application combines grids of probabilities  that a given field 
 * has a value greater than a user specified threshold based on evaluation 
 * of ensemble forecasts. 
 */

/**
 * @file MainEnsFcstComb.cc
 */

#define _ENS_FCST_COMB_

#include <cstdlib>
#include <ConvWx/InterfaceLL.hh>
#include <ConvWxIO/InterfaceIO.hh>
#include "EnsFcstCombMgr.hh"

/**
 * Return value of program to indicate success
 */
const static int success = 0;

/**
 *  Return value of program to indicate failure
 */
const static int failure = 1;

/**
 * Exit program, return signal to operating system
 * @param[in] sig  Signal
 */
static void cleanExit (int sig);

/**
 * New handler function
 */
static void outOfStore(void);

/**
 * Create algorithm manager and run algorithm 
 * @param[in] argc  Number of command line arguments is generally three for
 *                  real-time or six for archive mode.
 * @param[in] argv  Typical real-time and archive mode command lines are:
 *                  'EnsFcstComb -params EnsFcstComb.params' or
 *                  'EnsFcstComb -params EnsFcstComb.params -interval
 *                  yyyymmddhhmmdss yyyymmddhhmmdss'
 *
 * @return integer status
 */

int main(int argc, char **argv)
{
  //
  // set new() memory failure handler function
  //
  std::set_new_handler(outOfStore);

  //
  // Read in parameters
  //
  ParmsEnsFcstCombIO params(argc, argv);

  //
  // Create object that runs the algorithm               
  //
  EnsFcstCombMgr ensFcstCombMgr(params, cleanExit);


  InterfaceIO::startup(params.main.pProcessName, 
                       params.main.pInstance,
                       params.main.pRegistrationSeconds);
	
  
  //
  // Run the program
  //  
  int iret;
  if ( ensFcstCombMgr.run() == EnsFcstCombMgr::ENSFCSTCOMB_SUCCESS)
   {
    iret = success;
  }
  else
  {
    iret = failure;
  }

  cleanExit(iret);

  return iret;
}

static void cleanExit (int sig)
{
  InterfaceLL::finish();

  exit(sig);
}

static void outOfStore()
{
  std::cerr << "FATAL ERROR - program EnsFcstComb " << std::endl;

  std::cerr << "Operator new failed - out of store" << std::endl;

  exit(failure);
}