#ifndef CHESSBOARD_H_INCLUDED
#define CHESSBOARD_H_INCLUDED

/* players
 */
enum player {WHITE, BLACK};

/* status return by move()
 */
enum mstatus {INVALID, VALID, CHECK, CHECK_MATE};

enum pieces {
    EMPTY=0,
    WHITE_PAWN=1, WHITE_KNIGHT=2, WHITE_BISHOP=3, WHITE_ROOK=4, WHITE_QUEEN=5, WHITE_KING=6,
    BLACK_PAWN=7, BLACK_KNIGHT=8, BLACK_BISHOP=9, BLACK_ROOK=10, BLACK_QUEEN=11, BLACK_KING=12 };

/* UTF8 representation of the pieces, should be used to print the board
 */
const static char* utf_8_pieces[13] = {
    " ", "♙", "♘", "♗", "♖", "♕", "♔", "♟", "♞", "♝", "♜", "♛", "♚" };

/* chess board with values defined in enum pieces
 */
struct chessboard {
    enum pieces position[8][8];
};

/* set the initial position of the pieces on the board
 */
void init_chessboard(struct chessboard * cb);

/* print the board like this:

     a   b   c   d   e   f   g   h
   ┌───┬───┬───┬───┬───┬───┬───┬───┐
8  │ ♜ │ ♞ │ ♝ │ ♛ │ ♚ │ ♝ │ ♞ │ ♜ │
   ├───┼───┼───┼───┼───┼───┼───┼───┤
7  │ ♟ │ ♟ │ ♟ │ ♟ │ ♟ │ ♟ │ ♟ │ ♟ │
   ├───┼───┼───┼───┼───┼───┼───┼───┤
6  │   │   │   │   │   │   │   │   │
   ├───┼───┼───┼───┼───┼───┼───┼───┤
5  │   │   │   │   │   │   │   │   │
   ├───┼───┼───┼───┼───┼───┼───┼───┤
4  │   │   │   │   │   │   │   │   │
   ├───┼───┼───┼───┼───┼───┼───┼───┤
3  │   │   │   │   │   │   │   │   │
   ├───┼───┼───┼───┼───┼───┼───┼───┤
2  │ ♙ │ ♙ │ ♙ │ ♙ │ ♙ │ ♙ │ ♙ │ ♙ │
   ├───┼───┼───┼───┼───┼───┼───┼───┤
1  │ ♖ │ ♘ │ ♗ │ ♕ │ ♔ │ ♗ │ ♘ │ ♖ │
   └───┴───┴───┴───┴───┴───┴───┴───┘
     a   b   c   d   e   f   g   h

 */
void print_chessboard(struct chessboard * cb);

/* apply the move informed by player p, from/to positions and returns
 * the corresponding status
 */
enum mstatus move(struct chessboard * cb, enum player p, const char * from, const char * to);

#endif
