from typing import Literal, TypeVar, NamedTuple

from pydantic import BaseModel


class CeobeTextPic(NamedTuple):
    text: str
    pics: list[bytes | str]


class CeobeTarget(BaseModel):
    """账户结构"""

    avatar: str
    """数据源头像"""
    datasource: str
    """数据源类型"""
    db_unique_key: str
    """数据源相关唯一id"""
    nickname: str
    """数据源昵称"""
    platform: str
    """平台代码"""
    unique_id: str
    """数据源唯一标识(用于前后端交互标识)"""
    jump_url: str | None = None
    """跳转url(null就是没办法跳转)"""


class DataSourceResponse(BaseModel):
    code: int
    message: str
    data: list[CeobeTarget]


class CeobeImage(BaseModel):
    origin_url: str
    """原图"""
    compress_url: str | None = None
    """压缩图,为null就是没有原图对应压缩图"""


class CeobeDefaultCookie(BaseModel):
    text: str
    images: list[CeobeImage] | None


class CeobeRetweeted(BaseModel):
    author_name: str
    author_avatar: str
    text: str
    images: list[CeobeImage] | None = None


class CeobeItem(BaseModel):
    id: str
    """单条id"""
    url: str
    """跳转链接"""
    type: str | None = None
    """类型"""
    is_long_text: bool | None = None
    """是否长文"""
    is_retweeted: bool = False
    """是否转发"""
    retweeted: CeobeRetweeted | None = None
    """展示类型,公告类型的数据源有这个字段"""
    display_type: int | None = None

    class Config:
        extra = "allow"


class CeobeSource(BaseModel):
    data: str
    """数据源id"""
    type: str
    """数据源类型"""


class CeobeTimestamp(BaseModel):
    fetcher: int
    """蹲饼时间,毫秒"""
    platform_precision: Literal["none", "day", "hour", "minute", "second", "ms"]
    """平台时间精度,不足的长度补0"""
    platform: int | None = None
    """平台时间戳,毫秒"""


class CeobeCookie(BaseModel):
    datasource: str
    """数据源名字"""
    icon: str
    """数据源头像"""
    timestamp: CeobeTimestamp
    """时间戳"""
    default_cookie: CeobeDefaultCookie
    """原始饼"""
    item: CeobeItem
    """数据源信息,有平台的特殊字段"""
    source: CeobeSource
    """数据源"""


class CeobeData(BaseModel):
    cookies: list[CeobeCookie]
    next_page_id: str | None = None


class CookiesResponse(BaseModel):
    code: int
    message: str
    data: CeobeData


class CombIdResponse(BaseModel):
    code: int
    message: str
    data: dict[Literal["datasource_comb_id"], str]


class CookieIdResponse(BaseModel):
    cookie_id: str
    update_cookie_id: str


ResponseModel = TypeVar("ResponseModel", bound=CookiesResponse | CombIdResponse | CookieIdResponse | DataSourceResponse)