package edu.calpoly.csc480.Wumpus.Agent;

import com.bcurry.www.awt.*;

public class Direction extends BasicPoint
{
	static final public int numDirections = 4;
	static final public int
	 east      = 0,
	 south     = 1,
	 west      = 2,
	 north     = 3;
	 
	static public int reverses[];
	static public int angles[];
	static public BasicPoint points[];
	static public String names[];
	static public Direction directions[];
	
	static {
		reverses   = new int[numDirections];
		angles     = new int[numDirections];
		points     = new BasicPoint[numDirections];
		names      = new String[numDirections];
		directions = new Direction[numDirections];
		
		reverses[east]		= west;
		reverses[north]	= south;
		reverses[west]		= east;
		reverses[south]	= north;

		angles[east]      = 0;
		angles[north]     = 90;
		angles[west]      = 180;
		angles[south]     = 270;

		points[east]      = new BasicPoint( 1,  0);
		points[north]     = new BasicPoint( 0, -1);
		points[west]      = new BasicPoint(-1,  0);
		points[south]     = new BasicPoint( 0,  1);

		names[east]       = "east";
		names[north]      = "north";
		names[west]       = "west";
		names[south]      = "south";

		for (int drift = 0; drift < numDirections; drift++) {
			directions[drift] = new Direction(drift);
		}
	}
	
	public Direction()						{this(north);}
	public Direction(int drift)			{setDrift(drift);}
	public Direction(BasicPoint point)	{setPoint(point);}
	
	final public int getDrift()			{return drift;}
	final public int getAngle()			{return angles[drift];}
	final public BasicPoint getPoint()	{return points[drift];}
	
	final public String toString()	{return names[drift];}

	final public void setDirection(Direction head) {
		setDrift(head.getDrift());
	}

	final public void setDrift(int drift) {
		this.drift = drift;
		x = points[drift].x;
		y = points[drift].y;
	}

	final public void setPoint(BasicPoint point) {
		for (int drift = 0; drift < numDirections; drift++) {
			if (point.equals(points[drift])) {
				setDrift(drift);
				break;
			}
		}
	}

	final public boolean equals(Object obj) {
		return (
		 obj instanceof Direction && (drift == ((Direction)obj).getDrift()));
	}

	final public void reverse() {
		setDrift(reverses[drift]);
	}
	
	final public void rotateClockwise() {
		drift++;
	}

	final public void rotateCounterClockwise() {
		drift--;
	}
	
	protected int drift;
}