package com.editev.chess;

/** Constants defining the game of chess.
 *  @see See the source here.*/
abstract public class Chess {
    /** Represents no piece on a square. */
    public static final byte NO_PIECE    = 0;

    /** Represents no move from a list. */
    public static final byte NO_MOVE     = -1;

    /** A set of constants representing Black's pieces. */
    public static class Black {
        /** Black's home rank, also used as an identifier for Black */
        public static final byte BLACK   = 0; 
        
        /** Piece index for Black's King. */
        public static final byte KING    = 1;
        
        /** Piece index for Black's Queen. */
        public static final byte QUEEN   = 2;
        
        /** Piece index for Black's Rook. */
        public static final byte ROOK    = 3;
        
        /** Piece index for Black's Bishop. */
        public static final byte BISHOP  = 4;
        
        /** Piece index for Black's Knight. */
        public static final byte KNIGHT  = 5;
        
        /** Piece index for Black's Pawn. */
        public static final byte PAWN    = 6;

        /** @return true if the piece is Black (empty pieces are neither Black nor White). 
         * 
         *  @param piece the byte index of the Piece
         */
        public static final boolean is( byte piece ) { return piece >= KING && piece <= PAWN; }
    }     
    
    /** A set of constants representing White's pieces. */
    public static class White {    
        /** White's home rank, also used as an identifier for White */
        public static final byte WHITE   = 7; 
        
        /** Piece index for White's King. */
        public static final byte KING    = 8;
        
        /** Piece index for White's Queen. */
        public static final byte QUEEN   = 9;
        
        /** Piece index for White's Rook. */
        public static final byte ROOK    = 10;
        
        /** Piece index for White's Bishop. */
        public static final byte BISHOP  = 11;
        
        /** Piece index for White's Knight. */
        public static final byte KNIGHT  = 12;
        
        /** Piece index for White's Pawn. */
        public static final byte PAWN    = 13;

        /** @return true if the piece is White (empty pieces are neither Black nor White). 
         * 
         *  @param piece the byte index of the Piece
         */
        public static final boolean is( byte piece ) { return piece >= KING && piece <= PAWN; }
    }
    
    /** Black's home rank, also used as an identifier for Black */
    public static final byte BLACK = Black.BLACK;

    /** White's home rank, also used as an identifier for White */
    public static final byte WHITE = White.WHITE;
    
    /** Exchange WHITE and BLACK.  @parameter color a color, either BLACK or WHITE. @return the other color, White or Black.*/
    public static final byte notColor( byte color ) { return (byte) (WHITE - color); }
    
    /** Return either WHITE or BLACK. @parameter isWhite do we want BLACK or WHITE?  @return WHITE or BLACK depending on isWhite. */
    public static final byte toColor( boolean isWhite ) { return isWhite ? WHITE : BLACK; }
    
    /** Return either WHITE or BLACK. @parameter isWhite do we want BLACK or WHITE?  @return WHITE or BLACK depending on isWhite. */
    public static final byte toColor( boolean isWhite, byte piece ) { return (byte) (piece + toColor( isWhite )); }
    
    /** Return either "White" or "Black". @parameter isWhite do we want "Black" or "White"?  @return "White" or "Black" depending on isWhite. */
    public static final String toColorName( boolean isWhite ) { return isWhite ? "White" : "Black"; }
}