import re
from random import choice, random

from nonebot.typing import T_State
from nonebot.adapters.cqhttp import Bot, MessageEvent

from ATRI.utils.limit import FreqLimiter
from .data_source import Encrypt, Utils, Yinglish


roll = Utils().on_command("/roll", "骰子~用法:1d10 或 2d10+2d10+more")


@roll.args_parser  # type: ignore
async def _get_roll(bot: Bot, event: MessageEvent, state: T_State):
    msg = str(event.message).strip()
    quit_list = ["算了", "罢了"]
    if msg in quit_list:
        await roll.finish("好吧...")
    if not msg:
        await roll.reject("参数呢?!格式:1d10 或 2d10+2d10+more")
    else:
        state["roll"] = msg


@roll.handle()
async def _ready_roll(bot: Bot, event: MessageEvent, state: T_State):
    msg = str(event.message).strip()
    if msg:
        state["roll"] = msg


@roll.got("roll", "参数呢?!格式:1d10 或 2d10+2d10+more")
async def _deal_roll(bot: Bot, event: MessageEvent, state: T_State):
    text = state["roll"]
    match = re.match(r"^([\dd+\s]+?)$", text)

    if not match:
        await roll.finish("阿——!参数不对!格式:1d10 或 2d10+2d10+more")

    msg = Utils().roll_dice(text)
    await roll.finish(msg)


encrypt_en = Utils().on_command("加密", "我们之前的秘密❤")


@encrypt_en.args_parser  # type: ignore
async def _get_encr_en_text(bot: Bot, event: MessageEvent, state: T_State):
    msg = str(event.message).strip()
    quit_list = ["算了", "罢了"]
    if msg in quit_list:
        await roll.finish("好吧...")
    if not msg:
        await roll.reject("内容呢?!")
    else:
        state["encr_en_text"] = msg


@encrypt_en.handle()
async def _ready_en(bot: Bot, event: MessageEvent, state: T_State):
    msg = str(event.message).strip()
    if msg:
        state["encr_en_text"] = msg


@encrypt_en.got("encr_en_text", "内容呢?!")
async def _deal_en(bot: Bot, event: MessageEvent, state: T_State):
    text = state["encr_en_text"]
    is_ok = len(text)
    if is_ok < 10:
        await encrypt_en.reject("太短不加密!")
    en = Encrypt()
    result = en.encode(text)
    await encrypt_en.finish(result)


encrypt_de = Utils().on_command("解密", "解开我们的秘密❤")


@encrypt_de.args_parser  # type: ignore
async def _get_encr_de_text(bot: Bot, event: MessageEvent, state: T_State):
    msg = str(event.message).strip()
    quit_list = ["算了", "罢了"]
    if msg in quit_list:
        await encrypt_de.finish("好吧...")
    if not msg:
        await encrypt_de.reject("内容呢?!")
    else:
        state["encr_de_text"] = msg


@encrypt_de.handle()
async def _ready_de(bot: Bot, event: MessageEvent, state: T_State):
    msg = str(event.message).strip()
    if msg:
        state["encr_de_text"] = msg


@encrypt_de.got("encr_de_text", "内容呢?!")
async def _deal_de(bot: Bot, event: MessageEvent, state: T_State):
    text = state["encr_de_text"]
    en = Encrypt()
    result = en.decode(text)
    await encrypt_de.finish(result)


sepi = Utils().on_command("涩批一下", "将正常的句子涩一涩~")

_sepi_flmt = FreqLimiter(3)
_sepi_flmt_notice = ["涩批爬", "✌🥵✌"]


@sepi.args_parser  # type: ignore
async def _get_sepi(bot: Bot, event: MessageEvent, state: T_State):
    msg = str(event.message).strip()
    quit_list = ["算了", "罢了", "取消"]
    if msg in quit_list:
        await sepi.finish("好吧...")
    if not msg:
        await sepi.reject("内容呢?!")
    else:
        state["sepi_text"] = msg


@sepi.handle()
async def _ready_sepi(bot: Bot, event: MessageEvent, state: T_State):
    user_id = event.get_user_id()
    if not _sepi_flmt.check(user_id):
        await sepi.finish(choice(_sepi_flmt_notice))

    msg = str(event.message).strip()
    if msg:
        state["sepi_text"] = msg


@sepi.got("sepi_text", "内容呢?!")
async def _deal_sepi(bot: Bot, event: MessageEvent, state: T_State):
    user_id = event.get_user_id()
    msg = state["sepi_text"]
    if len(msg) < 4:
        await sepi.finish("这么短?涩不起来!")

    result = Yinglish.deal(msg, random())
    _sepi_flmt.start_cd(user_id)
    await sepi.finish(result)