"""Contains tests for chain module"""
import unittest

from shenzhen_solitaire.board import NumberCard, Position
from shenzhen_solitaire.solver import board_possibilities
from shenzhen_solitaire.solver.board_actions import (
    BunkerizeAction,
    GoalAction,
    HuaKillAction,
    MoveAction,
)

from .boards import TEST_BOARD


class ChainTest(unittest.TestCase):
    """Tests the chain class"""

    def test_sequence(self) -> None:
        """Tests a given sequence. Might break if I change the iterators"""

        self.assertTrue(TEST_BOARD.check_correct())
        sequence = [
            MoveAction(
                cards=[
                    NumberCard(suit=NumberCard.Suit.Red, number=7),
                    NumberCard(suit=NumberCard.Suit.Green, number=6),
                ],
                source_id=3,
                source_row_index=3,
                destination_id=7,
                destination_row_index=5,
            ),
            BunkerizeAction(
                card=NumberCard(suit=NumberCard.Suit.Red, number=6),
                bunker_id=0,
                field_id=2,
                field_row_index=4,
                to_bunker=True,
            ),
            GoalAction(
                card=NumberCard(suit=NumberCard.Suit.Green, number=1),
                source_id=2,
                source_row_index=3,
                source_position=Position.Field,
                obvious=True,
                goal_id=0,
            ),
            MoveAction(
                cards=[NumberCard(suit=NumberCard.Suit.Red, number=4)],
                source_id=2,
                source_row_index=2,
                destination_id=5,
                destination_row_index=5,
            ),
            GoalAction(
                card=NumberCard(suit=NumberCard.Suit.Red, number=1),
                source_id=2,
                source_row_index=1,
                source_position=Position.Field,
                obvious=True,
                goal_id=1,
            ),
            HuaKillAction(source_field_id=2, source_field_row_index=0),
            MoveAction(
                cards=[
                    NumberCard(suit=NumberCard.Suit.Black, number=9),
                    NumberCard(suit=NumberCard.Suit.Red, number=8),
                ],
                source_id=6,
                source_row_index=3,
                destination_id=2,
                destination_row_index=0,
            ),
            GoalAction(
                card=NumberCard(suit=NumberCard.Suit.Green, number=2),
                source_id=6,
                source_row_index=2,
                source_position=Position.Field,
                obvious=True,
                goal_id=0,
            ),
        ]
        for action in sequence:
            step = list(board_possibilities.possible_actions(TEST_BOARD))
            self.assertIn(action, step)
            action.apply(TEST_BOARD)
