import os
import json

from tabulate import tabulate

from ATRI import __version__
from ATRI.rule import to_bot
from ATRI.service import Service, SERVICES_DIR, ServiceTools
from ATRI.config import BotSelfConfig
from ATRI.exceptions import ReadFileError


SERVICE_INFO_FORMAT = """
服务名:{service}
说明:{docs}
可用命令:\n    {cmd_list}
是否全局启用:{enabled}
Tip: @bot 帮助 [服务] [命令] 以查看对应命令详细信息
""".strip()

COMMAND_INFO_FORMAT = """
命令:{cmd}
类型:{cmd_type}
说明:{docs}
更多触发方式:{aliases}
""".strip()


class Helper(Service):
    def __init__(self):
        Service.__init__(self, "帮助", "bot的食用指南~", rule=to_bot())

    @staticmethod
    def menu() -> str:
        return (
            "哦呀?~需要帮助?\n"
            "关于 -查看bot基本信息\n"
            "服务列表 -以查看所有可用服务\n"
            "帮助 [服务] -以查看对应服务帮助\n"
            "Tip: 均需要at触发。@bot 菜单 以打开此页面"
        )

    @staticmethod
    def about() -> str:
        temp_list = list()
        for i in BotSelfConfig.nickname:
            temp_list.append(i)
        nickname = "、".join(map(str, temp_list))
        return (
            "唔...是来认识咱的么\n"
            f"可以称呼咱:{nickname}\n"
            f"咱的型号是:{__version__}\n"
            "想进一步了解:\n"
            "atri.kyomotoi.moe\n"
            "进不去: project-atri-docs.vercel.app"
        )

    @staticmethod
    def service_list() -> str:
        files = os.listdir(SERVICES_DIR)
        services = list()
        for f in files:
            prefix = f.replace(".json", "")
            f = os.path.join(SERVICES_DIR, f)
            with open(f, "r", encoding="utf-8") as r:
                service = json.load(r)
                services.append(
                    [
                        prefix,
                        "√" if service["enabled"] else "×",
                        "√" if service["only_admin"] else "×",
                    ]
                )
        table = tabulate(
            services,
            headers=["服务名称", "开启状态(全局)", "仅支持管理员"],
            tablefmt="plain",
            showindex=True,
        )
        repo = f"咱搭载了以下服务~\n{table}\n@bot 帮助 [服务] -以查看对应服务帮助"
        return repo

    @staticmethod
    def service_info(service: str) -> str:
        try:
            data = ServiceTools().load_service(service)
        except ReadFileError:
            return "请检查是否输入错误呢...@bot 帮助 [服务]"

        service_name = data.get("service", "error")
        service_docs = data.get("docs", "error")
        service_enabled = data.get("enabled", True)

        _service_cmd_list = list(data.get("cmd_list", {"error"}))
        service_cmd_list = "\n".join(map(str, _service_cmd_list))

        repo = SERVICE_INFO_FORMAT.format(
            service=service_name,
            docs=service_docs,
            cmd_list=service_cmd_list,
            enabled=service_enabled,
        )
        return repo

    @staticmethod
    def cmd_info(service: str, cmd: str) -> str:
        try:
            data = ServiceTools().load_service(service)
        except ReadFileError:
            return "请检查是否输入错误..."

        cmd_list: dict = data["cmd_list"]
        cmd_info = cmd_list.get(cmd, dict())
        if not cmd_info:
            return "请检查命令是否输入错误..."
        cmd_type = cmd_info.get("type", "ignore")
        docs = cmd_info.get("docs", "ignore")
        aliases = cmd_info.get("aliases", "ignore")

        repo = COMMAND_INFO_FORMAT.format(
            cmd=cmd, cmd_type=cmd_type, docs=docs, aliases=aliases
        )
        return repo