use crate::board::Board;
use crate::movegen::{apply_move, generate_pseudo_legal_moves};
use crate::types::PieceType;
use super::attackers::with_side_to_move;
use super::danger_levels::move_creates_greater_threat;
use super::piece_safety::is_piece_safe;
use super::types::BoardPiece;
pub fn is_piece_trapped(board: &Board, piece: &BoardPiece, check_danger_levels: bool) -> bool {
let calibrated = with_side_to_move(board, piece.piece.color);
let standing_safe = is_piece_safe(&calibrated, piece);
let piece_moves: Vec<_> = generate_pseudo_legal_moves(&calibrated)
.into_iter()
.filter(|mv| mv.from == piece.square)
.collect();
if piece_moves.is_empty() {
return !standing_safe;
}
let all_moves_unsafe = piece_moves.iter().all(|mv| {
if let Some(target) = calibrated.piece_at(mv.to)
&& target.piece_type == PieceType::King {
return false;
}
if check_danger_levels && move_creates_greater_threat(&calibrated, piece, mv) {
return true;
}
let escape_board = apply_move(&calibrated, mv);
let escaped_piece = BoardPiece::new(piece.piece, mv.to);
!is_piece_safe(&escape_board, &escaped_piece)
});
!standing_safe && all_moves_unsafe
}