"""
CloudSearch Transfer — UC网盘凭证管理 v1.0.0

UC网盘使用 Cookie 直传（与夸克高度相似），无需 token 刷新机制。
验证方式：检查 Cookie 字符串长度是否 >= 50。
"""

from __future__ import annotations

import logging
from typing import Dict

logger = logging.getLogger(__name__)


class UcCredentialManager:
    """UC 网盘凭证管理器。

    UC 网盘的转存 API 直接从 Cookie 中读取认证信息，
    与夸克网盘机制完全一致，只是 API 域名不同（pc-api.uc.cn）。

    Attributes:
        cookie: 存储的 UC Cookie 字符串。
    """

    # UC Cookie 最小长度阈值（与夸克一致）
    MIN_COOKIE_LENGTH: int = 50

    # UC 网盘 Referer
    REFERER: str = "https://drive.uc.cn/"

    def __init__(self, cookie: str = "") -> None:
        """初始化凭证管理器。

        Args:
            cookie: UC 网盘的 Cookie 字符串。
        """
        self.cookie: str = cookie

    def validate(self) -> bool:
        """验证 Cookie 是否满足最小长度要求。

        Returns:
            True 表示 Cookie 长度 >= MIN_COOKIE_LENGTH，否则为 False。
        """
        if not self.cookie:
            logger.warning("[UcCredential] Cookie is empty")
            return False

        valid = len(self.cookie) >= self.MIN_COOKIE_LENGTH
        if not valid:
            logger.warning(
                "[UcCredential] Cookie too short: len=%d, min=%d",
                len(self.cookie),
                self.MIN_COOKIE_LENGTH,
            )
        return valid

    def is_valid(self) -> bool:
        """validate() 的别名，便于适配器层调用。"""
        return self.validate()

    def get_headers(self) -> Dict[str, str]:
        """构建带 Cookie 认证的 HTTP 请求头。

        UC API 需要在每次请求头中携带完整的 Cookie 字符串，
        以及 Referer: https://drive.uc.cn/。

        Returns:
            包含 Cookie 和 Referer 字段的请求头字典。
            Cookie 无效时仍返回空字典。
        """
        if not self.validate():
            logger.warning("[UcCredential] Cannot build headers: cookie invalid")
            return {}

        return {
            "Cookie": self.cookie,
            "Referer": self.REFERER,
        }

    def update_cookie(self, cookie: str) -> None:
        """更新 Cookie 字符串（用于手动刷新场景）。

        Args:
            cookie: 新的 Cookie 字符串。
        """
        self.cookie = cookie
        logger.info("[UcCredential] Cookie updated, new length=%d", len(cookie))

    def __repr__(self) -> str:
        return (
            f"UcCredentialManager(cookie_len={len(self.cookie) if self.cookie else 0}, "
            f"valid={self.validate()})"
        )
