import json

import dpath.util
from typing_extensions import Type

from envs.monkey_zoo.blackbox.config_templates.config_template import ConfigTemplate
from envs.monkey_zoo.blackbox.island_client.monkey_island_client import MonkeyIslandClient


class IslandConfigParser:
    @staticmethod
    def get_raw_config(
        config_template: Type[ConfigTemplate], island_client: MonkeyIslandClient
    ) -> str:
        response = island_client.get_config()
        config = IslandConfigParser.apply_template_to_config(
            config_template, response["configuration"]
        )
        return json.dumps(config)

    @staticmethod
    def apply_template_to_config(config_template: Type[ConfigTemplate], config: dict) -> dict:
        for path, value in config_template.config_values.items():
            dpath.util.set(config, path, value, ".")
        return config

    @staticmethod
    def get_ips_of_targets(raw_config):
        return dpath.util.get(json.loads(raw_config), "basic_network.scope.subnet_scan_list", ".")