package edu.calpoly.csc480.Wumpus.Agent;

public abstract class ActionValueSystem
{
	public static class Hunt extends ActionValueSystem {
		public final ActionRule.FleeMove getFleeMove() {
			return (ActionRule.FleeMove)rules[rules.length-2];
		}

		protected ActionRule[] makeRules() {
			final int numRules = 7;

			int ndx = 0;
			ActionRule rules[];

			rules = new ActionRule[numRules];
			rules[ndx++] = new ActionRule.Grab();
			rules[ndx++] = new ActionRule.Shoot();
			rules[ndx++] = new ActionRule.HuntMove();
			rules[ndx++] = new ActionRule.EchoMove();
			rules[ndx++] = new ActionRule.RiskMove();
			rules[ndx++] = new ActionRule.FleeMove();
			rules[ndx++] = new ActionRule.Climb();

			return rules;
		}
	}

	public static class Flee extends ActionValueSystem {
		protected ActionRule[] makeRules() {
			final int numRules = 2;

			int ndx = 0;
			ActionRule rules[];

			rules = new ActionRule[numRules];
			rules[ndx++] = new ActionRule.Climb();
			rules[ndx++] = new ActionRule.FleeMove();

			return rules;
		}

		public Action makeAction() {
			rules[0] = rules[0];
			return super.makeAction();
		}
	}

	public ActionValueSystem() {
		rules = makeRules();
	}

	public void setKnowledgeBase(KnowledgeBase kb) {
		this.kb = kb;

		for (int rule = 0; rule < rules.length; rule++) {
			rules[rule].setKnowledgeBase(kb);
		}
	}

	public Action makeAction() {
		Action a = null;

		for (int rule = 0; rule < rules.length && a == null; rule++) {
			if (rules[rule].test()) {
				a = rules[rule].make();
			}
		}

		return a;
	}

	protected ActionRule rules[];
	protected KnowledgeBase kb;

	protected abstract ActionRule[] makeRules();
}