import numpy as np
from random import shuffle

lands = {'C': 'Castle', 'F': 'Forrest', 'G': 'Grass', 'L': 'Lake', 'M': 'Mountain', 'S': 'Swamp', 'W': 'Wheat'}


class card:
    def __init__(self, tile_a, crown_a, tile_b, crown_b, rotation, inverse=None):
        self.tile_a = tile_a
        self.crown_a = crown_a
        self.tile_b = tile_b
        self.crown_b = crown_b
        self.rotation = rotation
        if inverse is None:
            self.inverse = card(self.tile_b, self.crown_b, self.tile_a, self.crown_a, (self.rotation + 2) % 4, self)
        else:
            self.inverse = inverse

    def rotate(self):
        self.rotation = (self.rotation + 1) % 4

    def offset(self):
        rot = [(0, 1), (1, 0), (0, -1), (-1, 0)]
        return rot[self.rotation]

    def __eq__(self, other):
        return self.tile_a == other.tile_a

    def __repr__(self):
        rot = [(' ', '='), ('.', '.'), ('=', ' '), ('`', '´')]
        a, b = rot[self.rotation]
        if self.tile_a == 'C':
            a, b = ('<', '>')
        return a + self.tile_a + str(self.crown_a) + b


class board:
    _board = []

    def __init__(self):
        self._board = np.empty(shape=(13, 13), dtype=card)
        # self._board.fill()
        self._board[6][6] = card('C', 0, '', 0, 1)

    def place(self, new_card, coords):
        x1, y1 = coords
        dx2, dy2 = new_card.offset()
        x2 = x1 + dx2
        y2 = y1 + dy2

        if self._board[x1][y1] is not None:
            print('geht nicht')
            return
        if self._board[x2][y2] is not None:
            print('geht auch nicht')
            return
        self._board[x1][y1] = new_card
        self._board[x2][y2] = new_card.inverse

    def available_slots(self, new_card):
        b = new_card == self._board
        return b

    def __repr__(self):
        return str(self._board)


deck = list(range(1, 49))
shuffle(deck)
deck = np.reshape(deck, (12, 4))
for row in deck:
    row.sort()


if __name__ == '__main__':
    b = board()
    c1 = card('F', 0, 'W', 0, 0)
    b.place(c1, (5, 6))
    c2 = card('F', 0, 'S', 0, 0)
    print(b.available_slots(c2))
    # print(b)
    # print(deck)
    # print(c)
    # print(c.inverse)
