/* simple anyone server controller program for an MH environment */

#include <stddef.h>
#include <assert.h>

#include "folder.h"
#include "al.h"
#include "a1server.h"
#include "bool.h"
#include "verbs.h"
#include "rulerun.h"
#include "registry.h"

static Bool do_anyone_rules PROTOTYPE((Registry));
static const char *return_address;

main(argc, argv)
     int argc;
     char *argv[];
{
  Registry all_rules;

  Al_init();
  AlTime_set("unknown");		/* Set lens time (operating mode) */

  if (AlA1S_init() != Bool_TRUE)
    Al_fatal_error("Anyone server init failed.");

  if (AlProfile_has_value(ALPROF_ANYONE_RET_ADDR) == Bool_FALSE)
    Al_fatal_error("Anyone server return address not configured in profile");

  return_address = AlProfile_get_CP_val(ALPROF_ANYONE_RET_ADDR);

  all_rules = Registry_create(Registry_strcmp, Registry_strhash);

  if (AlA1S_read_rules(all_rules) != Bool_TRUE)
    Al_fatal_error("Anyone server could not read rule library");

  while (1) {
    if (AlA1S_process_changes(all_rules) != Bool_TRUE)
      Al_fatal_error("Anyone server change processing failed");

    (NORET)system("inc");	/* The return status does not appear 
				   to be useful */

    if (do_anyone_rules(all_rules) != Bool_TRUE)
      Al_fatal_error("Anyone server rule running failed");

    (NORET)system("rmm +inbox all");

    sleep(60);
  }
}

static Msg cur_msg;
static AlFolder cur_folder;
static Darray temp_args = (Darray)NULL;

static NORET do_1_user_a1_rules(arg1, arg2, arg3)
     VOIDP arg1, arg2, arg3;
{
  const char *username = (const char *)arg1;
  AlRuleSet ruleset = (AlRuleSet)arg2;
  
  AlVerbs_sendme_username = username;
  AlRuleRun_do_rules(cur_folder, cur_msg, ruleset);
  AlVerbs_send_to_all_recepients(return_address);
}

static Bool do_anyone_rules(all_rules)
     Registry all_rules;
{
  AlFolderType folder_type;

  if ((folder_type = AlFolderT_get_folder_type("mh")) == NULL)
     Al_fatal_error("Anyone folder type failure");

  if ((cur_folder = AlFolder_create_from_file("inbox",
					      folder_type,
					      Bool_FALSE,
					      Bool_TRUE,
					      Bool_TRUE,
					      FOLDER_OPEN_RW))
      == NULL)
    Al_fatal_error("Anyone unable to create inbox folder");
  AlVerbs_current_folder = cur_folder;

  cur_msg = AlFolder_get_next_msg(cur_folder);
  while (cur_msg != (Msg)NULL) {
    AlVerbs_current_msg = cur_msg;
    Registry_traverse(all_rules, do_1_user_a1_rules, (VOIDP)NULL);
    cur_msg = AlFolder_get_next_msg(cur_folder);
  }
  AlFolder_destroy(cur_folder);
  return Bool_TRUE;
}

