import time

from nonebot import require
from nonebot.message import event_postprocessor

from liteyuki.utils.base.data import Database, LiteModel
from liteyuki.utils.base.ly_typing import v11, v12, satori

from liteyuki.utils.base.ly_typing import T_Bot, T_MessageEvent

from .common import MessageEventModel, msg_db
from liteyuki.utils import event as event_utils

require("nonebot_plugin_alconna")


async def general_event_monitor(bot: T_Bot, event: T_MessageEvent):
    print("POST PROCESS")
    # if isinstance(bot, satori.Bot):
    #     print("POST PROCESS SATORI EVENT")
    #     return await satori_event_monitor(bot, event)
    # elif isinstance(bot, v11.Bot):
    #     print("POST PROCESS V11 EVENT")
    #     return await onebot_v11_event_monitor(bot, event)


@event_postprocessor
async def onebot_v11_event_monitor(bot: v11.Bot, event: v11.MessageEvent):
    if event.message_type == "group":
        event: v11.GroupMessageEvent
        group_id = str(event.group_id)
    else:
        group_id = ""
    mem = MessageEventModel(
        time=int(time.time()),
        bot_id=bot.self_id,
        adapter="onebot.v11",
        group_id=group_id,
        user_id=str(event.user_id),

        message_id=str(event.message_id),

        message=[ms.__dict__ for ms in event.message],
        message_text=event.raw_message,
        message_type=event.message_type,
    )
    msg_db.save(mem)


@event_postprocessor
async def onebot_v12_event_monitor(bot: v12.Bot, event: v12.MessageEvent):
    if event.message_type == "group":
        event: v12.GroupMessageEvent
        group_id = str(event.group_id)
    else:
        group_id = ""
    mem = MessageEventModel(
        time=int(time.time()),
        bot_id=bot.self_id,
        adapter="onebot.v12",
        group_id=group_id,
        user_id=str(event.user_id),

        message_id=[ms.__dict__ for ms in event.message],

        message=event.message,
        message_text=event.raw_message,
        message_type=event.message_type,
    )
    msg_db.save(mem)


@event_postprocessor
async def satori_event_monitor(bot: satori.Bot, event: satori.MessageEvent):
    if event.guild is not None:
        event: satori.MessageEvent
        group_id = str(event.guild.id)
    else:
        group_id = ""

    mem = MessageEventModel(
        time=int(time.time()),
        bot_id=bot.self_id,
        adapter="satori",
        group_id=group_id,
        user_id=str(event.user.id),
        message_id=[ms.__str__() for ms in event.message],
        message=event.message,
        message_text=event.message.content,
        message_type=event_utils.get_message_type(event),
    )
    msg_db.save(mem)