import json
from urllib import request


class RLAPI:
    def __init__(self, url):
        self.url = url

    def post(self, route, data):
        response = request.urlopen(url=f"{self.url}/{route}", data=bytes(data, "utf8"))  # noqa: S310
        return response.read()

    def step(self, commands):
        post_data = "\n".join(f"{player};{json.dumps(action)}" for (player, action) in commands)
        return self.post("step", post_data)

    def reset(self, scenario_config, player_id, save_replay):
        path = "reset?"
        if save_replay:
            path += "saveReplay=1&"
        if player_id:
            path += f"playerID={player_id}&"

        return self.post(path, scenario_config)

    def get_templates(self, names):
        post_data = "\n".join(names)
        response = self.post("templates", post_data)
        return zip(names, response.decode().split("\n"), strict=False)

    def evaluate(self, code):
        response = self.post("evaluate", code)
        return json.loads(response.decode())
