package edu.calpoly.csc480.Wumpus.Agent;

import java.awt.*;

import com.bcurry.www.awt.*;

import edu.calpoly.csc480.Wumpus.Tile.*;

public class Husks extends Tiles
{
	public Husks() {
		lones = new Husk[Fact.numFacts];
	}

	public final Husk getHusk(Point point) {
		return (Husk)getTile(point);
	}

	public final Husk getHusk(int drift, Husk husk) {
		return (Husk)getTile(BasicPoint.add(Direction.points[drift], husk));
	}

	public final Husk getSecludedHusk(int factType) {
		return lones[factType];
	}

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

	public void resolveWalls(Dimension size) {
		setSize(size);
		makeTiles();
		setKnowledgeBase(this.kb);

		for (curr.y = 0; curr.y < height; curr.y++) {
			for (curr.x = 0; curr.x < width; curr.x++) {
				getHusk(curr).setKnowledgeBase(kb);
				getHusk(curr).getFact(Fact.wall).set(false);
			}
		}

		for (curr.y = 0; curr.y < height; curr.y+=height-1) {
			for (curr.x = 0; curr.x < width; curr.x++) {
				getHusk(curr).getFact(Fact.wall).set(true);
			}
		}

		for (curr.x = 0; curr.x < width; curr.x+=width-1) {
			for (curr.y = 0; curr.y < height; curr.y++) {
				getHusk(curr).getFact(Fact.wall).set(true);
			}
		}
	}

	public void resolveExit(Point exit) {
		getHusk(exit).getFact(Fact.exit).set(true);
		secludeHusk(Fact.exit, getHusk(exit));
	}

	public void resolveDawn(Point dawn) {
		kb.setHusk(getHusk(dawn));
	}

	public void secludeHusk(int factType, Husk trueHusk) {
		lones[factType] = trueHusk;

		for (curr.y = 0; curr.y < height; curr.y++) {
			for (curr.x = 0; curr.x < width; curr.x++) {
				if (getHusk(curr) != trueHusk) {
					getHusk(curr).getFact(factType).set(false);
				}
			}
		}
	}

	protected Husk lones[];
	protected KnowledgeBase kb;

	protected Tile[][] makeTileArray()			{return new Husk[height][width];}
	protected Tile makeTile(BasicPoint curr)	{return new Husk(curr);}
}