class PlayerProcessor:
    '''
        Contains a list of PlayerInfo and has all the logic with dealing with movement
    '''

    MISSING_PLAYER_ERROR = 2

    def __init__(self, map_name):
        # Local copy of Player
        self._players = {}
        self._map = Map(map_name)
        self._player_height = 20
        self._player_width = 10
        self._player_color = 'red'

    def check_req(self, req_body):
        if 'player_name' not in req_body:
            return self.MISSING_PLAYER_ERROR

    def process_post(self, req_type, req_body):
        error = self.check_req(req_body)
        if error:
            return {'rez': 'error', 'error_code': error}

        if req_type == 'add_player':
            dup_num = 0
            player_name = req_body['player_name']
            while player_name in self._players:
                dup_num += 1
                if dup_num == 1:
                    player_name += ' (1)'
                else:
                    player_name = player_name[:-4] + f' ({dup_num})'
            print(f'{self._map.spawn_point.x} {self._map.spawn_point.y}')
            self._players[player_name] = Player(self._map.spawn_point.clone(),
                                                self._player_height,
                                                self._player_width,
                                                self._player_color
                                                )
            self._map.spawn_player(self._players[player_name])
            return {'rez': 'success', 'map_name': self._map.map_name, 'new_name': player_name}
        if req_type == 'move_left':
            player_name = req_body['player_name']
            self._players[player_name].coord.x -= 1
        if req_type == 'move_right':
            player_name = req_body['player_name']
            self._players[player_name].coord.x += 1
        if req_type == 'kick_all':
            self._players = {}
        return {'rez': 'success'}

    def settle_players(self):
        # Physics (gravity) based changes to player pos
        pass

    def player_to_json(self):
        # Convert PlayerInfos to whatever info needs to be transmitted
        return {
            name: {'color': player_info.color,
                   'x_coord': player_info.coord.x,
                   'y_coord': player_info.coord.y,
                   'height': player_info.height,
                   'width': player_info.width
                   } for name, player_info in self._players.items()
        }