import pygame.draw

from utilities.constants import SQUARE_SIZE, GREY, CROWN, GREEN


class Piece:
    def __init__(self, row: int, col: int, colour: int) -> None:
        """
        Initialises the piece class, which represents a piece on the board. Constructor for the piece class
        :param row: Row of the piece
        :param col: Column of the piece
        :param colour: Colour of the piece
        """
        self.row = row
        self.col = col
        self.colour = colour
        self.king = False
        self.x = 0
        self.y = 0
        self.calcPosition()
        self.padding = 20
        self.border = 2
        self.green = (144, 184, 59)
        self.white = (255, 255, 255)

    def calcPosition(self) -> None:
        """
        Calculates the position of the piece
        :return: None
        """
        self.x = SQUARE_SIZE * self.col + SQUARE_SIZE // 2
        self.y = SQUARE_SIZE * self.row + SQUARE_SIZE // 2

    def makeKing(self) -> None:
        """
        Makes the piece a king
        :return: None
        """
        self.king = True

    def draw(self, win) -> None:
        """
        Draws the piece
        :param win: The window to draw the piece on
        :return: None
        """
        radius = SQUARE_SIZE // 2 - self.padding
        pygame.draw.circle(win, GREY, (self.x, self.y), radius + self.border)
        pygame.draw.circle(win, self.green if self.colour == GREEN else self.white, (self.x, self.y), radius)
        if self.king:
            win.blit(CROWN, (self.x - CROWN.get_width() // 2, self.y - CROWN.get_height() // 2))

    def move(self, row: int, col: int) -> None:
        """
        Moves the piece to a new position
        :param row: Row to move to
        :param col: Column to move to
        :return: None
        """
        self.row = row
        self.col = col
        self.calcPosition()

    def __repr__(self) -> str:
        """
        String representation of the piece
        :return: String representation of the colour
        """
        return str(self.colour)
