#include "assert.h"   /* must be first for use eith hc2 */
#include "ru.h"
#include "verbrgy.h"
#include "end.h"
#include "string.h"
#include "rap.h"
#include "rem.h"
#include "ruleeditor.h"
#include "action.h"
#include "FieldCore.h"
#include "FTreg.h"
#include "help.h"
#include "ruleset.h"
#include "RSreg.h"
#include "al.h"
#include "a1client.h"

/*-----------------------------*/
void ru_Init(argc,argv)
int *argc;
char **argv;
{
  int i;
  EditOrCreate_GR=RU_NIL;
  RuleNumber_GR=(-1);

  for (i=1;i<*argc;i++) {

    /* look for deletion command */
    if (((strcmp(ALHfull_elim,argv[i])==0) ||
	 (strcmp(ALHabbrev_elim,argv[i])==0)) && 
	(*argc>i) && 
	RuleSet_GR!=NULL) {
      if (RapStr_is_int(argv[i+1])==Bool_TRUE) {
	int n;
	n=atoi(argv[i+1]);
	if (n>AlRuleSet_number_of_rules(RuleSet_GR) 
	    || n<=0) {
	  Al_warning("ruleeditor: invalid index for deletion.");
	  Al_warning2("            there are only %d rule(s) in the rule set '%s'\n",
		      (const char*)AlRuleSet_number_of_rules(RuleSet_GR),
		      (const char*)RuleSetName_GR);
	  ruleeditor_Cleanup(-1);
	}
	AlRuleSet_remove_rule(RuleSet_GR,n-1);
	if (AsClient_GR!=NULL)
	  AlA1C_write_rules(RuleSet_GR,AsClient_GR); 
	else
	  AlRSreg_save(RuleSetName_GR);
	printf("ruleeditor: deleted rule %d of rule set '%s'\n",
	       n,RuleSetName_GR);
	ruleeditor_Cleanup(0);
      }
      else {
	Al_warning("ruleeditor: -e[lim] option requires a rule number.\n");
	ruleeditor_Usage();
	ruleeditor_Cleanup(-1);
      }
    }
    
    /* look for rule number */
    if ((((strcmp(ALHfull_rule,argv[i])==0) ||
	  (strcmp(ALHabbrev_rule,argv[i])==0)) && (*argc>i))  ||
	(RapStr_is_int(argv[i])==Bool_TRUE)) {
      if (EditOrCreate_GR==RU_NIL) {
	if (RapStr_is_int(argv[i])==Bool_TRUE)
	  RuleNumber_GR=atoi(argv[i]);
	else {
	  if (RapStr_is_int(argv[i+1])==Bool_FALSE) {
	    Al_warning("ruleeditor: -r[ule] option must be followed by a number.\n");
	    ruleeditor_Usage();
	    ruleeditor_Cleanup(-1);
	  }
	  RuleNumber_GR=atoi(argv[i+1]);
	  i++;
	}
	EditOrCreate_GR=RU_EDIT;
      }
      else {
	Al_warning("ruleeditor: the -r[ule] -b[efore] and -a[fter] options are mutually exclusive.\n");
	ruleeditor_Usage();
	ruleeditor_Cleanup(-1);
      }
    }

    /* look for insert after option */
    else if (((strcmp(ALHabbrev_after,argv[i])==0) ||
	      (strcmp(ALHfull_after,argv[i])==0)) &&
	     (*argc>i))  {
      if (EditOrCreate_GR==RU_NIL) {
	if (RapStr_is_int(argv[i+1])==Bool_FALSE) {
	  Al_warning("ruleeditor: -a[fter] option must be followed by a number.\n");
	  ruleeditor_Usage();
	  ruleeditor_Cleanup(-1);
	}
	RuleNumber_GR=atoi(argv[i+1]);
	EditOrCreate_GR=RU_IA;
	i++;
      }
      else {
	Al_warning("ruleeditor: the -r[ule] -b[efore] and -a[fter] options are mutually exclusive.\n");
	ruleeditor_Usage();
	ruleeditor_Cleanup(-1);
      }
    }

    /* look for insert before option */
    else if (((strcmp(ALHabbrev_before,argv[i])==0) ||
	      (strcmp(ALHfull_before,argv[i])==0)) &&
	     (*argc>i))  {
      if (EditOrCreate_GR==RU_NIL)  {
	if (RapStr_is_int(argv[i+1])==Bool_FALSE) {
	  Al_warning("ruleeditor: -b[efore] option must be followed by a number.\n");
	  ruleeditor_Cleanup(-1);
	}
	RuleNumber_GR=atoi(argv[i+1]);
	EditOrCreate_GR=RU_IB;
	i++;
      }
      else {
	Al_warning("ruleeditor: the -r[ule] -b[efore] and -a[fter] options are mutually exclusive.\n");
	ruleeditor_Usage();
	ruleeditor_Cleanup(-1);
      }
    }
  }

  if (EditOrCreate_GR==RU_NIL)
    EditOrCreate_GR=RU_CREATE;
  else if (EditOrCreate_GR==RU_EDIT) {
    if (RuleNumber_GR>AlRuleSet_number_of_rules(RuleSet_GR) ||
	RuleNumber_GR<1)  {
      EditOrCreate_GR=RU_CREATE;
      printf("ruleeditor: couldn't find rule number %d in rule set %s\n",
	     RuleNumber_GR,
	     RuleSetName_GR);
      printf("            Creating new rule instead of editing one.\n");
    }
  }
  else if (EditOrCreate_GR==RU_IB  ||
	   EditOrCreate_GR==RU_IA) {
    if (RuleNumber_GR>AlRuleSet_number_of_rules(RuleSet_GR) ||
	RuleNumber_GR<1)  {
      printf("ruleeditor: couldn't find rule number %d in rule set %s\n",
	     RuleNumber_GR,
	     RuleSetName_GR);
      if (EditOrCreate_GR==RU_IB)
	printf("             to insert a new rule before\n");
      else
	printf("             to insert a new rule after\n");
      printf("             Creating new rule to append to end of rule set instead of editing\n            one.\n");
      EditOrCreate_GR=RU_CREATE;
    }
  }

  if (EditOrCreate_GR==RU_CREATE)
    RuleNumber_GR=AlRuleSet_number_of_rules(RuleSet_GR)+1;

  if (EditOrCreate_GR==RU_EDIT)
    Rule_GR=AlRuleSet_get_rule(RuleSet_GR,RuleNumber_GR-1);
  else 
    Rule_GR=AlRule_create_default_rule();
}

