import numpy as np

class Move:
    def __init__(self, from_: int, to_: int, promote: int = 0, castle: int = 0): ...
    
    @property
    def from_(self) -> int: ...
    
    @property
    def to_(self) -> int: ...
    
    @property
    def promote(self) -> int: ...
    
    @property
    def castle(self) -> int: ...
    
    @property
    def is_enpassant(self) -> bool: ...
    
    @property
    def is_promotion(self) -> bool: ...

class Board:
    def __init__(self, fen: str = None): ...

    @property
    def white_pawns(self) -> int: ...
    
    @property
    def white_knights(self) -> int: ...
    
    @property
    def white_bishops(self) -> int: ...
    
    @property
    def white_rooks(self) -> int: ...
    
    @property
    def white_queens(self) -> int: ...
    
    @property
    def white_king(self) -> int: ...

    @property
    def black_pawns(self) -> int: ...
    
    @property
    def black_knights(self) -> int: ...
    
    @property
    def black_bishops(self) -> int: ...
    
    @property
    def black_rooks(self) -> int: ...
    
    @property
    def black_queens(self) -> int: ...
    
    @property
    def black_king(self) -> int: ...

    @property
    def white_occ(self) -> int: ...

    @property
    def black_occ(self) -> int: ...

    @property
    def all_occ(self) -> int: ...

    @property
    def castles(self) -> int: ...

    @property
    def castles_str(self) -> str: ...
    
    @property
    def nmoves(self) -> int: ...

    @property
    def fifty_counter(self) -> int: ...

    @property
    def en_passant_sqr(self) -> int: ...

    def step(self, step: Move | str | int) -> None: ...
    def undo(self) -> None: ...
    def perft(self, deep: int, pretty: bool = False, no_print: bool = False) -> int: ...
    def generate_legal_moves(self) -> list[Move]: ...
    def as_array(self, reversed: bool = False, as_list: bool = False) -> list | np.ndarray: ...
    def as_table(self, reversed: bool = False, as_list: bool = False) -> list | np.ndarray: ...
    def on_square(self, square: int) -> Move: ...
    def owned_by(self, square: int) -> int: ...
    def get_played_moves(self) -> list[Move]: ...
    def reset(self) -> None: ...
    def is_check(self) -> bool: ...
    def is_insufficient_material(self) -> bool: ...
    def is_threefold(self) -> bool: ...
    def is_fifty_moves(self) -> bool: ...
    def get_attackers_map(self, square: int) -> int: ...
    def get_moves_of(self, square: int) -> list[Move]: ...
    def copy(self) -> Board: ...
    def state(self, can_move: bool) -> int: ...
    def find(self, piece: int) -> list[int]: ...

