from Aops_Api_Auto_Test.config import conf
from Aops_Api_Auto_Test.utils.LogUtil import my_log
from Aops_Api_Auto_Test.config.conf import ConfigYaml
from Aops_Api_Auto_Test.utils.RequestsUtil import Request
from Aops_Api_Auto_Test.utils.YamlUtil import Yaml



class ApiZeus:

    def __init__(self):
        self.log = my_log()
        url = ConfigYaml().get_conf_url() + ':80/api/manage/account/login'
        data = {
            "username": ConfigYaml().get_user(),
            "password": ConfigYaml().get_login_password()
        }
        res = Request().post(url=url, json=data)
        token_access = res["body"]["data"]['token']
        self.log.info("Start get token: {}".format(token_access))
        Yaml(conf.get_common_yaml_path()).write_yaml({"token": token_access})

    def register_group(self, register_group_data: dict):
        """
        Register a host group
        :param register_group_data:{"host_group_name": "api_test_group", "description": "api_test_group"}
        :return: res
        """
        headers = {'Content-Type': 'application/json',
                   'Access-Token': Yaml(conf.get_common_yaml_path()).data()['token']}
        url = ConfigYaml().get_conf_url() + ":11111/manage/host/group/add"
        res = Request().post(url=url, json=register_group_data, headers=headers)
        return res

    def register_host(self, host_info: dict):
        """
        Register host
        :param host_info: {
            "host_name": "host_name",
            "host_group_name": "host_group_name",
            "host_ip": "host_ip",
            "ssh_port": ssh_port,
            "ssh_user": "ssh_user",
            "password": "password",
            "management": True/False
        }
        :return: res
        """
        headers = {'Content-Type': 'application/json',
                   'Access-Token': Yaml(conf.get_common_yaml_path()).data()['token']}
        url = ConfigYaml().get_conf_url() + ":11111/manage/host/add"
        res = Request().post(url=url, json=host_info, headers=headers)
        self.log.info("Get register host result: {}".format(res))
        return res

    def batch_register_host(self, host_list: list):
        """
        Register host
        :param host_list:
        [{
        host_ip: "1.1.1.1"
        ssh_port: 1
        ssh_user: "root"
        password: "openEuler12#$$"
        host_name: "batch_add_host_1"
        host_group_name: "host_group_name"
        management: false
        },
        {
        host_ip: "1.1.1.2"
        ssh_port: 2
        ssh_user: "root"
        password: "openEuler12#$$"
        host_name: "batch_add_host_2"
        host_group_name: "host_group_name"
        management: false}
        ]
        :return: res
        """
        headers = {'Content-Type': 'application/json',
                   'Access-Token': Yaml(conf.get_common_yaml_path()).data()['token']}
        url = ConfigYaml().get_conf_url() + ":11111/manage/host/add/batch"
        try:
            res = Request().post(url=url, json=host_list, headers=headers)
            self.log.info("Batch register host result: {}".format(res))

        except:
            self.log.error("Batch register host fail!")
            raise
        return res

    def update_host(self, host_info):
        """
        Register host
        :param host_info: {
            "host_name": "host_name",
            "host_group_name": "host_group_name",
            "host_ip": "host_ip",
            "ssh_port": ssh_port,
            "ssh_user": "ssh_user",
            "password": "password",
            "management": True/False
        }
        :return: res
        """
        headers = {'Content-Type': 'application/json',
                   'Access-Token': Yaml(conf.get_common_yaml_path()).data()['token']}
        url = ConfigYaml().get_conf_url() + ":11111/manage/host/update"
        res = Request().post(url=url, json=host_info, headers=headers)
        self.log.info("Update host result: {}".format(res))
        return res

    def query_host_info(self, host_list):
        """
        Register host
        :param     host_list{[host_id], basic: true}
        :return: res
        """
        headers = {'Content-Type': 'application/json',
                   'Access-Token': Yaml(conf.get_common_yaml_path()).data()['token']}
        url = ConfigYaml().get_conf_url() + ":11111/manage/host/info/query"
        res = Request().post(url=url, json=host_list, headers=headers)
        self.log.info("Query host info result: {}".format(res))
        return res

    def collect_host_config_info(self, info):
        """

        :param

        {
  "infos": [
    {
      "host_id": "$host_id",
      "config_list": [
        "/etc/gala-gopher/gala-gopher.conf",
        "/etc/yum.repos.d/openEuler.repo"
      ]
    }
  ]
}
        :return:
        """
        headers = {'Content-Type': 'application/json',
                   'Access-Token': Yaml(conf.get_common_yaml_path()).data()['token']}
        url = ConfigYaml().get_conf_url() + ":11111/manage/config/collect"
        res = Request().post(url=url, json=info, headers=headers)
        self.log.info("Collect host config info: {}".format(res))
        return res

    def download_template(self):
        """
        Download batch user template
        :return:
        """
        headers = {'Content-Type': 'application/json',
                   'Access-Token': Yaml(conf.get_common_yaml_path()).data()['token']}
        url = ConfigYaml().get_conf_url() + ":11111/manage/host/file/template"
        res = Request().get(url=url, params=None, headers=headers)
        self.log.info("Download template result: {}".format(res))
        return res

    def set_plugin_status(self, data):
        """
        :param
        {
  "host_id": "684",
  "plugins": {
    "gala-gopher": "inactive"
  }
}
        :return:
        """
        headers = {'Content-Type': 'application/json',
                   'Access-Token': Yaml(conf.get_common_yaml_path()).data()['token']}
        url = ConfigYaml().get_conf_url() + ":11111/manage/agent/plugin/set"
        res = Request().post(url=url, json=data, headers=headers)
        self.log.info("Set plugin status: {}".format(res))
        return res

    def set_metric_status(self, data):
        """
        :param
        {
  "host_id": "698",
  "plugins": {
    "gala-gopher": {
      "example": "off"
    }
  }
}
        :return:
        """
        headers = {'Content-Type': 'application/json',
                   'Access-Token': Yaml(conf.get_common_yaml_path()).data()['token']}
        url = ConfigYaml().get_conf_url() + ":11111/manage/agent/metric/set"
        res = Request().post(url=url, json=data, headers=headers)
        self.log.info("Set metric status: {}".format(res))
        return res

    def get_host_scene(self, data):
        """
        :param:
        host_id=698
        :return:
        """
        headers = {'Content-Type': 'application/json',
                   'Access-Token': Yaml(conf.get_common_yaml_path()).data()['token']}
        url = ConfigYaml().get_conf_url() + ":11111/manage/host/scene/get"
        res = Request().get(url=url, params=data, headers=headers)
        self.log.info("Get host scene: {}".format(res))
        return res