#!/usr/bin/env isis-script

private variable Script_Version_String = "0.1.0";

require ("cmdopt");

private define exit_version ()
{
   () = fprintf (stdout, "Version: %S\n", Script_Version_String);
   exit (0);
}

private define exit_usage ()
{
   variable fp = stderr;
   variable pgm = path_basename (__argv[0]);
   () = fprintf (fp, "Usage: %s [options] isis-par-file flux-file\n", pgm);

   variable opts = 
     [
      "Options:\n",
      " -v|--version               Print version\n",
      " -h|--help                  This message\n",
      " -e|--energy grid           Energy grid (keV)\n",
      " -l|--lambda grid           Wavelength grid (Angstroms)\n",
      " -s|--script                Script file\n",
      " -b|--bin-integral          Integrate the flux over bins\n",
      "\n",
      "The isis-par-file may be created using save_par in isis.\n",
      "The optional script may define the model if needed.\n",
      "If the energy grid is not specified, '[0.03:10:0.001]' will be used.\n",
      "\nExample:\n",
      "$pgm --energy '[0.01:12.0:0.03]' powerlaw.p flux.dat\n"$,
     ];

   foreach (opts)
     {
	variable opt = ();
	() = fputs (opt, fp);
     }
   exit (1);
}

define isis_main ()
{
   variable egrid = "[0.03:10.0:0.001]";
   variable lgrid = NULL;
   variable script = NULL;
   variable use_bin_integral = 0;

   variable c = cmdopt_new ();

   c.add("h|help", &exit_usage);
   c.add("v|version", &exit_version);
   c.add("s|script", &script; type="str");
   c.add("e|energy", &egrid; type="str");
   c.add("l|lambda", &lgrid; type="str");
   c.add("b|bin-integral", &use_bin_integral);

   variable i = c.process (__argv, 1);

   if (i + 2 != __argc)
     exit_usage ();
   
   variable par_file = __argv[i];
   variable out_file = __argv[i+1];

   if (script != NULL)
     {
	if (0 == path_is_absolute (script))
	  script = path_concat (".", script);
	() = evalfile (script);
     }
   
   if (lgrid != NULL)
     egrid = "_A($lgrid)"$;

   try
     {
	egrid = eval(egrid);
	if (typeof (egrid) != Array_Type)
	  throw TypeMismatchError, "Expecting an array";
     }
   catch AnyError:
     {
	() = fprintf (stderr, "Error parsing the energy grid spec as an array\n");
	exit (1);
     }

   load_par (par_file);
   variable egrid_hi = shift (egrid, 1);
   egrid_hi[-1] = egrid_hi[-2] + (egrid[-1]-egrid[-2]);

   variable s = eval_fun (_A(egrid, egrid_hi));
   if (use_bin_integral == 0)
     s = reverse(s)/(egrid_hi-egrid);

   writecol (out_file, egrid, s);
}
