import ipaddress
import re

from .util import get_config_value


class WxAccountMsgBase:

    @classmethod
    def new_msg(cls):
        return cls()

    def set_ip_address(self, server_ip, local_ip):
        pass

    def to_send_data(self):
        return "", {}


class WxAccountMsg(WxAccountMsgBase):
    def __init__(self):
        self.ip_address: str = ""
        self.thing_type: str = ""
        self.msg: str = ""
        self.next_msg: str = ""

    def set_ip_address(self, server_ip, local_ip):
        self.ip_address = "{}({})".format(server_ip, local_ip)
        if len(self.ip_address) > 32:
            self.ip_address = self.ip_address[:29] + "..."

    def to_send_data(self):
        res = {
            "first": {},
            "keyword1": {
                "value": self.ip_address,
            },
            "keyword2": {
                "value": self.thing_type,
            },
            "keyword3": {
                "value": self.msg,
            }
        }

        if self.next_msg != "":
            res["keyword4"] = {"value": self.next_msg}

        return "", res


class WxAccountLoginMsg(WxAccountMsgBase):
    tid = "RJNG8dBZ5Tb9EK6j6gOlcAgGs2Fjn5Fb07vZIsYg1P4"

    def __init__(self):
        self.login_name: str = ""
        self.login_ip: str = ""
        self.thing_type: str = ""
        self.login_type: str = ""
        self.address: str = ""
        self._server_name: str = ""

    def set_ip_address(self, server_ip, local_ip):
        if self._server_name == "":
            self._server_name = "服务器IP{}".format(server_ip)

    def _get_server_name(self):
        data = get_config_value("title")  # 若获得别名，则使用别名
        if data != "":
            self._server_name = data

    def to_send_data(self):
        self._get_server_name()
        if self.address.startswith(">Place of Ownership:"):
            self.address = self.address[5:]
        if self.address == "":
            self.address = "Unknown place of ownership"

        if not _is_ipv4(self.login_ip):
            self.login_ip = "ipv6-can not show"

        res = {
            "thing10": {
                "value": self._server_name,
            },
            "character_string9": {
                "value": self.login_ip,
            },
            "thing7": {
                "value": self.login_type,
            },
            "thing11": {
                "value": self.address,
            },
            "thing2": {
                "value": self.login_name,
            }
        }
        return self.tid, res


# 处理短信告警信息的不规范问题
def sms_msg_normalize(sm_args: dict) -> dict:
    for key, val in sm_args.items():
        sm_args[key] = _norm_sms_push_argv(str(val))
    return sm_args


def _norm_sms_push_argv(data):
    """
    @处理短信参数，否则会被拦截
    """
    if _is_ipv4(data):
        tmp1 = data.split('.')
        return '{}_***_***_{}'.format(tmp1[0], tmp1[3])

    data = data.replace(".", "_").replace("+", "＋")
    return data


def _is_ipv4(data: str) -> bool:
    try:
        ipaddress.IPv4Address(data)
    except:
        return False
    return True


def _is_domain(domain):
    rep_domain = re.compile(r"^([\w\-*]{1,100}\.){1,10}([\w\-]{1,24}|[\w\-]{1,24}\.[\w\-]{1,24})$")
    if rep_domain.match(domain):
        return True
    return False
