class GameInstanceServer(GameInstanceServerPDUCodec, ITCPInd):

    def __init__(self, clients):
        shuffle(clients)
        self.socket_player_white = clients[0]
        self.socket_player_black = clients[1]
        self.request = GameInstanceServerTCP(self.socket_player_white, self.socket_player_black, self)
        self.WHITE_TURN = WHITE_TURN()
        self.BLACK_TURN = BLACK_TURN()
        self.boardmodel = BoardModel(8, True)
        # black player starts according to reversi rules
        self.state = self.BLACK_TURN
        self.turn = self.socket_player_black

    def game_init(self):
        self.request.send_req(self.socket_player_white, GameClientPDUCodec.connect_ok_pdu(Player.WHITE))
        self.request.send_req(self.socket_player_black, GameClientPDUCodec.connect_ok_pdu(Player.BLACK))

        initial_board = GameLogic.initial_board_as_affected_positions(8)
        self.request.send_req(self.socket_player_white, GameClientPDUCodec.update_board_pdu(Player.WHITE, initial_board[0]))
        self.request.send_req(self.socket_player_white, GameClientPDUCodec.update_board_pdu(Player.BLACK, initial_board[1]))
        self.request.send_req(self.socket_player_black, GameClientPDUCodec.update_board_pdu(Player.WHITE, initial_board[0]))
        self.request.send_req(self.socket_player_black, GameClientPDUCodec.update_board_pdu(Player.BLACK, initial_board[1]))

        self.request.send_req(self.socket_player_black, GameClientPDUCodec.turn_pdu())

    def start(self):
        self.game_init()
        self.request.run()

    # input delegated to states
    def turn_req(self):
        self.state.turn_req(self)

    def place_pdu(self, socket, x, y):
        self.state.place_pdu(self, socket, x, y)

    def end_game(self):
        self.state.end_game(self)

    def error_req(self, socket):
        self.state.error_req(self, socket)

    # ITCPInd implementation
    def recv_ind(self, client, data):
        print "[GAME INSTANCE] Data indication"
        (pdu_id, pdu_size, pdu_data) = self.decode(data)
        print (pdu_id, pdu_size, pdu_data)
        if pdu_id == PDUCodes.PLACE:
            self.place_pdu(client, pdu_data[0], pdu_data[1])
        elif pdu_id == PDUCodes.CLIENT_QUIT:
            self.state.disconnection_ind(self, client)
        else:
            print "ALGO RARO", data
        return pdu_size

    def disconnection_ind(self, client):
        self.state.disconnection_ind(self, client)
 def __init__(self, clients):
     shuffle(clients)
     self.socket_player_white = clients[0]
     self.socket_player_black = clients[1]
     self.request = GameInstanceServerTCP(self.socket_player_white, self.socket_player_black, self)
     self.WHITE_TURN = WHITE_TURN()
     self.BLACK_TURN = BLACK_TURN()
     self.boardmodel = BoardModel(8, True)
     # black player starts according to reversi rules
     self.state = self.BLACK_TURN
     self.turn = self.socket_player_black