import json

import main
from core.relay import sendRelayNotification
from modules import userinfo
from utils.dedup import dedup

order = [
    "type",
    "net",
    "num",
    "channel",
    "msg",
    "nick",
    "ident",
    "host",
    "mtype",
    "user",
    "mode",
    "modearg",
    "realname",
    "server",
    "status",
    "ts",
]


def parsemeta(numName, c):
    if "channel" not in c.keys():
        c["channel"] = None
    # metadata scraping
    # need to check if this was received from a relay
    #  in which case, do not do this
    if c["type"] in ["msg", "notice", "action", "topic", "mode"]:
        if "muser" in c.keys():
            userinfo.editUser(c["net"], c["muser"])
        # if c["type"] == "mode":
        #    userinfo.updateMode(c)
    elif c["type"] == "nick":
        userinfo.renameUser(
            c["net"],
            c["nick"],
            c["muser"],
            c["user"],
            c["user"] + "!" + c["ident"] + "@" + c["host"],
        )
    elif c["type"] == "kick":
        userinfo.editUser(c["net"], c["muser"])
        userinfo.delUserByNick(c["net"], c["channel"], c["user"])
    elif c["type"] == "quit":
        userinfo.delUserByNetwork(c["net"], c["nick"], c["muser"])
    elif c["type"] == "join":
        userinfo.addUser(c["net"], c["channel"], c["nick"], c["muser"])
    elif c["type"] == "part":
        userinfo.delUser(c["net"], c["channel"], c["nick"], c["muser"])

    if "mtype" in c.keys():
        if c["mtype"] == "nick":
            userinfo.renameUser(
                c["net"],
                c["nick"],
                c["muser"],
                c["user"],
                c["user"] + "!" + c["ident"] + "@" + c["host"],
            )


def queue_message(c):
    message = json.dumps(c)
    main.g.lpush("queue", message)


def event(
    numName, c
):  # yes I'm using a short variable because otherwise it goes off the screen
    if dedup(numName, c):
        return

    # make a copy of the object with dict() to prevent sending notifications with channel of None
    parsemeta(numName, dict(c))

    if "muser" in c.keys():
        del c["muser"]
    # sortedKeys = {k: c[k] for k in order if k in c}  # Sort dict keys according to order
    # sortedKeys["src"] = "irc"
    c["src"] = "irc"
    if main.config["Ingest"]["Enabled"]:
        queue_message(c)
    sendRelayNotification(c)
