public void HandleInput(ChessGameController gameController)
    {
        if (piecePromotionIsActive)
        {
            HandlePromotion(gameController);
            return;
        }

        ChessPlayer player = gameController.ActivePlayer;
        Board       board  = gameController.Board;

        if (board.TurnIsActive || (gameController.State != GameState.Normal && gameController.State != GameState.Check))
        {
            return;
        }

        ChessPlayer   playerCopy = new ChessPlayer(null, player.TeamColor);
        ChessPlayer   enemyCopy  = new ChessPlayer(null, gameController.GetOppositeToActivePlayer().TeamColor);
        ChessGridInfo gridCopy   = playerCopy.TeamColor == TeamColor.White ? ChessGridInfo.CopyGrid(board.ChessGrid, playerCopy, enemyCopy) :
                                   ChessGridInfo.CopyGrid(board.ChessGrid, enemyCopy, playerCopy);

        Move foundMove = FindBestMove(gridCopy, playerCopy, enemyCopy);
        Move bestMove  = new Move(board.ChessGrid.GetPieceOnSquareIndex(foundMove.MovingPiece), foundMove.TargetSquare,
                                  board.ChessGrid.GetPieceOnSquareIndex(foundMove.TargetPiece), foundMove.PromotionFlag, foundMove.CastlingFlag,
                                  board.ChessGrid.GetPieceOnSquareIndex(foundMove.CastlingPiece), foundMove.CastlingTargetSquare);

        board.OnSelectPiece(bestMove.MovingPiece);
        board.OnSelectedPieceMove(bestMove);
        gameController.OnEnteredNormalMode();
        board.OnDeselectActivePiece();
    }
    public void GenerateAllPossibleMoves(ChessGridInfo grid, bool checkMovesValidity, bool checkSpecialMoves)
    {
        ChessGridInfo gridCopy   = null;
        ChessPlayer   enemyCopy  = null;
        ChessPlayer   playerCopy = null;

        if (checkMovesValidity)
        {
            TeamColor opponentColor = TeamColor == TeamColor.White ? TeamColor.Black : TeamColor.White;
            playerCopy = new ChessPlayer(null, TeamColor);
            enemyCopy  = new ChessPlayer(null, opponentColor);
            gridCopy   = opponentColor == TeamColor.White ? ChessGridInfo.CopyGrid(grid, enemyCopy, playerCopy)
                : ChessGridInfo.CopyGrid(grid, playerCopy, enemyCopy);
        }

        AllPossibleMoves.Clear();
        for (int i = 0; i < ActivePieces.Count; i++)
        {
            ActivePieces[i].GeneratePossibleMoves(grid, gridCopy, playerCopy, enemyCopy, checkMovesValidity, checkSpecialMoves);
            AllPossibleMoves.AddRange(ActivePieces[i].AvailableMoves);
        }
    }