package Rectangles;

import java.util.Stack;
import java.util.Enumeration;
import Rectangles.Rectangles;

public class Trail extends Stack implements Cloneable {
	private int _playerIndex;

	public Trail( int playerIndex ) {
		super();	
		_setPlayerIndex( playerIndex );
	}

	public Trail( int playerIndex, int x, int y ) throws Exception {
		super();
		_setPlayerIndex( playerIndex );
		push( new Segment( x, y ) );
	}

	public Trail( int playerIndex, Point start ) throws Exception {
		super();
		_setPlayerIndex( playerIndex );
		push( new Segment( start ) );
	}

	public Object clone() {
		Trail copy = new Trail( _playerIndex );
		copy.addAll( this );
		return( copy );
	}

	private void _setPlayerIndex( int playerIndex ) {
		_playerIndex = playerIndex;
	}

	public int playerIndex() {
		return( _playerIndex );
	}

	/*
	public Segment peek() {
		return( ( Segment )super.peek() );
	}

	public Segment pop() {
		return( ( Segment )super.pop() );
	}
	*/

	public int search( Object segment ) {
		return( size() - super.search( segment ) );

	}

	public int length() throws Exception {
		Enumeration segmentsEnum = elements();
		int distance = 0;

		while( segmentsEnum.hasMoreElements() ) {
			Segment segment = ( Segment )segmentsEnum.nextElement();
			distance += segment.length();
		}

		return( distance );
	}

	public Segment closestSegment( Point point, Rectangles rectangles ) 
		throws Exception {
		return( closestSegment( point.xpos(), point.ypos(), rectangles ) );
	}

	public Segment closestSegment( int x, int y, Rectangles rectangles ) 
		throws Exception {
		Enumeration segmentsEnum = elements();
		Segment closestSegment = null;

		int distanceToClosestSegment = 2 * rectangles.size() + 1; // infinity

		while( segmentsEnum.hasMoreElements() ) {
			Segment segment = ( Segment )segmentsEnum.nextElement();
			int segmentDist = segment.shortestDistanceTo( x, y );

			if( segmentDist < distanceToClosestSegment ) {
				closestSegment = segment;
				distanceToClosestSegment = segmentDist;
			}
		}

		return( closestSegment );
	}

	public Point closestPoint( Point point, Rectangles rectangles ) 
		throws Exception {
		return( closestPoint( point.xpos(), point.ypos(), rectangles ) );
	}

	public Point closestPoint( int x, int y, Rectangles rectangles ) 
		throws Exception {
		return( closestSegment( x, y, rectangles ).closestPoint( x, y ) );
	}
}
