from datetime import datetime
from types import SimpleNamespace
from typing import Callable
from typing import TYPE_CHECKING
from typing import Union

from src.interface.template import API
from src.translation import _

if TYPE_CHECKING:
    from src.config import Parameter
    from src.testers import Params


class Hot(API):
    board_params = (
        SimpleNamespace(
            name=_("抖音热榜"),
            type=0,
            sub_type="",
        ),
        SimpleNamespace(
            name=_("娱乐榜"),
            type=2,
            sub_type=2,
        ),
        SimpleNamespace(
            name=_("社会榜"),
            type=2,
            sub_type=4,
        ),
        SimpleNamespace(
            name=_("挑战榜"),
            type=2,
            sub_type="hotspot_challenge",
        ),
    )

    def __init__(
        self,
        params: Union["Parameter", "Params"],
        cookie: str = "",
        proxy: str = None,
        *args,
        **kwargs,
    ):
        super().__init__(params, cookie, proxy, *args, **kwargs)
        self.headers = self.headers | {
            "Cookie": "",
        }
        self.api = f"{self.domain}aweme/v1/web/hot/search/list/"
        self.text = _("热榜")
        self.index = None
        self.time = None

    def generate_params(
        self,
    ) -> dict:
        return self.params | {
            "detail_list": "1",
            "source": "6",
            "board_type": self.board_params[self.index].type,
            "board_sub_type": self.board_params[self.index].sub_type,
            "version_code": "170400",
            "version_name": "17.4.0",
        }

    async def run(
        self,
        referer: str = "https://www.douyin.com/discover",
        single_page=True,
        data_key: str = None,
        error_text=None,
        cursor=None,
        has_more=None,
        params: Callable = lambda: {},
        data: Callable = lambda: {},
        method="GET",
        headers: dict = None,
        *args,
        **kwargs,
    ):
        self.time = f"{datetime.now():%Y_%m_%d_%H_%M_%S}"
        self.set_referer(referer)
        for index, space in enumerate(self.board_params):
            self.index = index
            self.text = _("{space_name}数据").format(space_name=space.name)
            await self.run_single(
                data_key,
                "",
                cursor,
                has_more,
                params=self.generate_params,
                data=data,
                method=method,
                headers=headers,
                index=index,
                *args,
                **kwargs,
            )
        return self.time, self.response

    def check_response(
        self,
        data_dict: dict,
        data_key: str = None,
        error_text=None,
        cursor=None,
        has_more=None,
        index: int = None,
        *args,
        **kwargs,
    ):
        try:
            if not (d := data_dict["data"]["word_list"]):
                self.log.info(error_text)
            else:
                self.response.append((index, d))
        except KeyError:
            self.log.error(
                _("数据解析失败,请告知作者处理: {data}").format(data=data_dict)
            )


async def test():
    from src.testers import Params

    async with Params() as params:
        i = Hot(
            params,
        )
        print(await i.run())


if __name__ == "__main__":
    from asyncio import run

    run(test())