"""
客户端分发分享链接：根据 id + created_at 生成固定且无规律的 share_id（可逆编码）。
不落库，仅用于公开下载页 URL。
"""
from datetime import datetime
from typing import Optional

import base64
from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

# 固定 salt，保证同一 SECRET_KEY 得到相同密钥（同一分发生成相同 share_id）
_DISTRIBUTION_SHARE_SALT = b"uap_dist_share_v1"


def _get_fernet() -> Fernet:
    from app.core.config import settings
    kdf = PBKDF2HMAC(
        algorithm=hashes.SHA256(),
        length=32,
        salt=_DISTRIBUTION_SHARE_SALT,
        iterations=100000,
    )
    key = base64.urlsafe_b64encode(kdf.derive(settings.SECRET_KEY.encode("utf-8")))
    return Fernet(key)


def encode_distribution_share_id(dist_id: int, created_at: datetime) -> str:
    """由分发 id 与创建时间生成固定、无规律的 share_id（URL 安全字符串）。"""
    # 统一为 ISO 字符串，避免时区序列化差异
    ts = created_at.isoformat() if created_at else ""
    payload = f"{dist_id}\t{ts}".encode("utf-8")
    token = _get_fernet().encrypt(payload)
    # Fernet 输出已是 base64url，可直接用于 URL
    return token.decode("ascii")


def decode_distribution_share_id(share_id: str) -> Optional[int]:
    """将 share_id 解码为分发 id；无效或篡改返回 None。"""
    if not share_id or not share_id.strip():
        return None
    share_id = share_id.strip()
    try:
        payload = _get_fernet().decrypt(share_id.encode("ascii"))
        parts = payload.decode("utf-8").split("\t", 1)
        return int(parts[0])
    except Exception:
        return None
