# tools/image_chess_solver.py import chess import chess.engine import tempfile from PIL import Image # Path to your Stockfish binary (update if needed) STOCKFISH_PATH = "/usr/bin/stockfish" def analyze_position_from_fen(fen: str, time_limit: float = 1.0) -> str: """ Uses Stockfish to analyze the best move from a given FEN string. Args: fen (str): Forsyth–Edwards Notation of the board. time_limit (float): Time to let Stockfish think. Returns: str: Best move in algebraic notation. """ try: board = chess.Board(fen) engine = chess.engine.SimpleEngine.popen_uci(STOCKFISH_PATH) result = engine.play(board, chess.engine.Limit(time=time_limit)) engine.quit() return board.san(result.move) except Exception as e: return f"Stockfish error: {e}" def solve_chess_image(image_path: str) -> str: """ Stub function for image-to-FEN. Replace with actual OCR/vision logic. Args: image_path (str): Path to chessboard image. Returns: str: Best move or error. """ # Placeholder FEN for development (e.g., black to move, guaranteed mate) sample_fen = "6k1/5ppp/8/8/8/8/5PPP/6K1 b - - 0 1" try: print(f"Simulating FEN extraction from image: {image_path}") # Replace the above with actual OCR image-to-FEN logic best_move = analyze_position_from_fen(sample_fen) return f"Detected FEN: {sample_fen}\nBest move for Black: {best_move}" except Exception as e: return f"Image analysis error: {e}"