package edu.calpoly.csc480.Corral.Agent.Util;

import java.awt.*;

public class Direction extends Point
{
	static final public int numDirections = 8;
	static final public int
	 north     = 0, northEast = 1,
	 east      = 2, southEast = 3,
	 south     = 4, southWest = 5,
	 west      = 6, northWest = 7;
	 
	static public int angles[];
	static public Point points[];
	static public String names[];
	static public Direction directions[];
	
	static {
		angles     = new int[numDirections];
		points     = new Point[numDirections];
		names      = new String[numDirections];
		directions = new Direction[numDirections];
		
		angles[east]      = 0;
		angles[northEast] = 45;
		angles[north]     = 90;
		angles[northWest] = 135;
		angles[west]      = 180;
		angles[southWest] = 225;
		angles[south]     = 270;
		angles[southEast] = 315;

		points[east]      = new Point( 1,  0);
		points[northEast] = new Point( 1, -1);
		points[north]     = new Point( 0, -1);
		points[northWest] = new Point(-1, -1);
		points[west]      = new Point(-1,  0);
		points[southWest] = new Point(-1,  1);
		points[south]     = new Point( 0,  1);
		points[southEast] = new Point( 1,  1);

		names[east]       = "east";
		names[northEast]  = "north-east";
		names[north]      = "north";
		names[northWest]  = "north-west";
		names[west]       = "west";
		names[southWest]  = "south-west";
		names[south]      = "south";
		names[southEast]  = "south-east";

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

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

	final public void setPoint(Point 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() {
		final int halfDrift = numDirections / 2;
		setDrift((drift < halfDrift ? drift + halfDrift : drift - halfDrift));
	}
	
	final public void rotateClockwise() {
		drift++;
	}

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