from typing import Tuple

from ruamel.yaml import CommentedMap

from app.core.config import settings
from app.plugins.autosignin.sites import _ISiteSigninHandler
from app.utils.http import RequestUtils
from app.utils.string import StringUtils


class MTorrent(_ISiteSigninHandler):
    """
    m-team签到
    """
    # 匹配的站点Url，每一个实现类都需要设置为自己的站点Url
    site_url = "m-team"

    @classmethod
    def match(cls, url: str) -> bool:
        """
        根据站点Url判断是否匹配当前站点签到类，大部分情况使用默认实现即可
        :param url: 站点Url
        :return: 是否匹配，如匹配则会调用该类的signin方法
        """
        return True if cls.site_url in url.split(".") else False

    def signin(self, site_info: CommentedMap) -> Tuple[bool, str]:
        """
        执行签到操作，馒头实际没有签到，非仿真模式下需要更新访问时间
        :param site_info: 站点信息，含有站点Url、站点Cookie、UA等信息
        :return: 签到结果信息
        """
        headers = {
            "Content-Type": "application/json",
            "User-Agent": site_info.get("ua"),
            "Accept": "application/json, text/plain, */*",
            "Authorization": site_info.get("token")
        }
        url = site_info.get('url')
        timeout = site_info.get("timeout")
        domain = StringUtils.get_url_domain(url)
        # 更新最后访问时间
        res = RequestUtils(headers=headers,
                           timeout=timeout,
                           proxies=settings.PROXY if site_info.get("proxy") else None,
                           referer=f"{url}index"
                           ).post_res(url=f"https://api.{domain}/api/member/updateLastBrowse")
        if res:
            return True, "模拟登录成功"
        elif res is not None:
            return False, f"模拟登录失败，状态码：{res.status_code}"
        else:
            return False, "模拟登录失败，无法打开网站"

    def login(self, site_info: CommentedMap) -> Tuple[bool, str]:
        """
        执行登录操作
        :param site_info: 站点信息，含有站点Url、站点Cookie、UA等信息
        :return: 登录结果信息
        """
        return self.signin(site_info)
