import java.util.*;
import Board;
import Parser;

// class: Piece
// This class is used to provide the chess logic needed to parse the PGN file. This
// class is only utilized suring the parsing of the file, and is not used while
// running the animation.

// this class is abstract, the Pawn,Rook,Knight,Bishop,King, and Queen classes
// override the GetLegalMoves function.

public abstract class Piece
{	
	//define constants
	static final int PAWN = 0;
	static final int KING = 1;
	static final int QUEEN = 2;
	static final int BISHOP = 3;
	static final int KNIGHT = 4;
	static final int ROOK = 5;

	static final int WHITE = 0;
	static final int BLACK = 1;
	
		
	// define member variables
	int                   m_xPos = 0;
	int                   m_yPos = 0;
	int		                m_type;
	int	                  m_color;
	boolean               m_moved = false;
	
	// method definitions
	Piece( int mycolor, int x, int y){
		this.m_xPos = x;
		this.m_yPos = y;
		this.m_color = mycolor;
	}
	
	
	int GetX() { return m_xPos; }
	int GetY() { return m_yPos; }

	abstract Vector GetLegalMoves();
	
  void Move(int x, int y){  
		m_moved = true;
		m_xPos = x;
		m_yPos = y;
	}
	
	
	boolean IsOccupiable(int x,int y){
		
		if (!Parser.board().IsOnBoard(x,y)) {
			return false; 
		}
		if (Parser.board().GetPiece(x,y) == null) return true;
			
		if (Parser.board().GetPiece(x,y).GetColor() != m_color) return true;
		
		return false;
			
	}
	
	void GetSlideMoves(int xStart, int yStart, int yDelta, int xDelta, Vector result) {

	  int x = xStart;
	  int y = yStart;
	  
	  while (true) {
		  x += xDelta;
		  y += yDelta;
		  
		  // if we're off the board, just stop.
		  if (!Parser.board().IsOnBoard(x,y)) {
			  break; }
		  
		  if (Parser.board().GetPiece(x,y) != null) {
			  //if there is a piece there add it as a move (if capturable) and stop the loop
			  if (Parser.board().GetPiece(x,y).GetColor() != m_color)
				  result.insertElementAt(Board.CoordToString(x,y), result.size());
			  break;
		  } else {
			  //otherwise add the piece and keep going
			  result.insertElementAt(Board.CoordToString(x,y), result.size());
		  }
	  }
	}
	

	boolean CanMoveTo(int x, int y){
		Vector moves = null;
		int i = 0;
		boolean result = false;
		
		String theMove = Board.CoordToString(x,y);
		
		moves = GetLegalMoves();
		
		for (i = 0; i < moves.size(); i++) {
			if (theMove.equals(moves.elementAt(i))){
				result = true;
				break;
			}
		}
		
		return result;
	};
	
	
	int GetColor()              { return m_color; };
	int GetType()           { return m_type; };
}

