import chess

from chess_detect import ChessDetector
from chess_detect.context import MoveContext
from chess_detect.detectors.tactics.double_check import DoubleCheckDetector


class TestDoubleCheckDetector:
    """Тесты для детектора двойного шаха."""

    def test_double_check_detected(self):
        """Двойной шах: конь уходит и открывает ладью."""
        # Позиция: белый конь d4 блокирует ладью d1, черный король d8
        # После Nc6+ конь шахует И ладья шахует
        board = chess.Board("3k4/8/8/8/3N4/8/8/3RK3 w - - 0 1")
        move = chess.Move.from_uci("d4c6")  # Nc6+

        ctx = MoveContext(board, move)
        detector = DoubleCheckDetector()

        assert detector.detect(ctx) is True
        assert ctx.attackers_count == 2

    def test_single_check_not_detected(self):
        """Обычный шах (одна фигура) — не двойной."""
        # Простой шах ладьёй
        board = chess.Board("3k4/8/8/8/8/8/8/3RK3 w - - 0 1")
        move = chess.Move.from_uci("d1d7")  # Rd7+

        ctx = MoveContext(board, move)
        detector = DoubleCheckDetector()

        assert detector.detect(ctx) is False
        assert ctx.attackers_count == 1

    def test_no_check_not_detected(self):
        """Ход без шаха — не двойной шах."""
        board = chess.Board("3k4/8/8/8/8/8/8/3RK3 w - - 0 1")
        move = chess.Move.from_uci("d1d2")  # Rd2 (без шаха)

        ctx = MoveContext(board, move)
        detector = DoubleCheckDetector()

        assert detector.detect(ctx) is False


class TestChessDetectorIntegration:
    """Интеграционные тесты ChessDetector."""

    def test_analyze_adds_comment_ru(self):
        """Проверяем что analyze добавляет комментарий на русском."""
        detector = ChessDetector(lang="ru")

        # PGN с двойным шахом на ходе Nc6+
        pgn = """[Event "Test"]
[Result "*"]

1. Nc6+"""

        # Устанавливаем начальную позицию через FEN
        pgn_with_fen = """[Event "Test"]
[FEN "3k4/8/8/8/3N4/8/8/3RK3 w - - 0 1"]
[Result "*"]

1. Nc6+"""

        result = detector.analyze(pgn_with_fen)

        assert "Двойной шах" in result

    def test_analyze_adds_comment_en(self):
        """Проверяем что analyze добавляет комментарий на английском."""
        detector = ChessDetector(lang="en")

        pgn_with_fen = """[Event "Test"]
[FEN "3k4/8/8/8/3N4/8/8/3RK3 w - - 0 1"]
[Result "*"]

1. Nc6+"""

        result = detector.analyze(pgn_with_fen)

        assert "Double Check" in result

    def test_no_modification_without_tactics(self):
        """Если тактики нет — комментарии не добавляются."""
        detector = ChessDetector(lang="ru")

        pgn = """[Event "Test"]
[Result "*"]

1. e4 e5 2. Nf3 Nc6"""

        result = detector.analyze(pgn)

        # Не должно быть комментариев с тактикой
        assert "Двойной шах" not in result
