#!/usr/cs/bin/perl 
#
# File: mits.pl  (Multipurpose Interactive Trec Script)
#
# Purpose: Provides an easy and fast interface for processing trec
#          data.  This handles map files, merits, ranks, comparisons,
#          summary matrices, evaluations versus random ranks, etc.
#
# Modifications:
#   11-MAY-1998  txe  Initial creation
#   15-MAY-1998  txe  Added CompareVsRandom, includes handler.pm
#   18-MAY-1998  txe  Added random weights file, directory
#   19-MAY-1998  txe  Added axes indexes, SaveSettings/LoadSettings
#   20-MAY-1998  txe  Using references to functions
#   21-MAY-1998  txe  Added masks, merits, ranks
#

require "subs/ir_subs.pm";
require "subs/handler.pm";

$version = "0.14";
$date    = "21 May 1998";

print "+----------------------------------------------------------+\n";
print "|           Multipurpose Interactive Trec Script           |\n";
print "|           ~~~~~~~~~~~~ ~~~~~~~~~~~ ~~~~ ~~~~~~           |\n";
print "|                Version $version - $date                |\n";
print "+----------------------------------------------------------+\n";

&Initialize ();

while (MainMenu ()) {}

print "Done.\n";
1;

##############################################################################

sub Initialize {
  &InitData ("D", \\$data_dir,    \\&Handle_ChangeDataDir,    "Data Directory");
  &InitData ("M", \\$merits_dir,  \\&Handle_ChangeMeritsDir,  "Merits Directory");  
  &InitData ("R", \\$ranks_dir,   \\&Handle_ChangeRanksDir,   "Ranks Directory");  
  &InitData ("W", \\$wts_dir,     \\&Handle_ChangeWtsDir,     "Weights Directory");
  &InitData ("C", \\$coll_tree,   \\&Handle_ChangeCollTree,   "Collection File Tree");

  &InitData ("m", \\$map_file,    \\&Handle_ChangeMapFile,    "Collection Map File");
  &InitData ("f", \\$f_file,      \\&Handle_ChangeFFile,      "F (term freq) File");
  &InitData ("w", \\$w_file,      \\&Handle_ChangeWFile,      "W (term wts) File");
  &InitData ("c", \\$cids_file,   \\&Handle_ChangeCollIndex,  "Collection ID Index");
  &InitData ("q", \\$qids_file,   \\&Handle_ChangeQueryIndex, "Query ID Index");
  &InitData ("k", \\$mask_file,   \\&Handle_ChangeMaskFile,   "Mask File");
  &InitData ("u", \\$query_file,  \\&Handle_ChangeQueryFile,  "Query File");
  &InitData ("r", \\$qrels_file,  \\&Handle_ChangeQrelsFile,  "Qrels File");
  &InitData ("t", \\$wts_file,    \\&Handle_ChangeWtsFile,    "Weights File");

  &InitData ("1", \\$build_map,   \\&Handle_BuildMap, "Build Collection Map");
  &InitData ("2", \\$do_merits,   \\&Handle_DoMerits, "Generate Merits");
  &InitData ("3", \\$do_ranks,    \\&Handle_DoRanks,  "Generate Ranks");
  &InitData ("5", \\$build_wts,   \\&Handle_BuildWts, "Build Weights");
  &InitData ("d", \\$done,        \\&Handle_Done,     "Done w/ Orders, Now Execute");

  &InitData ("V", \\$verbose,     \\&Handle_Verbose,  "Verbose Mode");
  &InitData ("T", \\$reset_cfg,   \\&Handle_ResetCfg, "Reset MITS Configuration");
  &InitData ("L", \\$load_cfg,    \\&Handle_LoadCfg,  "Load MITS Configuration");
  &InitData ("S", \\$save_cfg,    \\&Handle_SaveCfg,  "Save MITS Configuration");
  &InitData ("E", \\$quit_save,   \\&Handle_QuitSave, "Exit (Saves Configuration)"); 
  &InitData ("Q", \\$quit_only,   \\&Handle_QuitOnly, "Quit without Saving"); 
  
  @cmds = keys (%unsorted_cmds);

  $data_dir = "test";
  $cfg_file = "mits.cfg";

  &Handle_LoadCfg ();
}

##############################################################################

sub MainMenu {
  my ($choice, $cmd);

  print "\n==================== M A I N   M E N U =====================\n";
  &PrintOptions ("Directories", "DMRWC");
  &PrintOptions ("Files",       "mfwcqkurt");
  &PrintOptions ("Orders",      "1235d");
  &PrintOptions ("Commands",    "VTLSEQ");

  while (1) {
    print "Enter letter of option/order to change: ";

    $choice = substr (<STDIN>, 0, 1);

    foreach $cmd (@cmds) {
      if ($choice eq $cmd) {
	&{$handlers {$cmd}} ();
        return 1;
      }
    }

    print "\nInvalid choice '$choice', try again\n"; 
  }
}

##############################################################################

sub PrintOptions {
  my ($label, $cmd_str) = @_;
  my (@cmds) = split (//, $cmd_str);
  my ($cmd);
  
  print "$label:\n";

  foreach $cmd (@cmds) {
    printf " $cmd) %-30s  [%s]\n", $labels{$cmd}, ${$values{$cmd}};
  }

  print "\n";
}

##############################################################################

sub InitData {
  my ($cmd, $label);
  ($cmd, *ref, *handler, $label) = @_;

  $unsorted_cmds{$cmd} = 1;

  $values   {$cmd} = $ref;
  $handlers {$cmd} = $handler;
  $labels   {$cmd} = $label;

  ${$values {$cmd}} = "";
}

##############################################################################

