"""
parsed_sync.py — клиент общей БД парсингов на сервере TelePush.
Отправляет результаты парсинга, запрашивает 'чаты юзера' у сервера.
"""
import logging
import threading
from typing import Optional

from config import TELEPUSH_SERVER_URL

logger = logging.getLogger("telepush.parsed_sync")

_MAX_USERS_PER_CHAT = 10000
_MAX_CHATS_PER_UPLOAD = 20


def _get_key() -> str:
    try:
        from utils.license import LicenseManager
        return LicenseManager().get_key() or ""
    except Exception:
        return ""


def upload_user_chats(user_id: int, user_username: str, chats: list):
    """Отправить связь 'юзер состоит в чатах' на общий сервер — для режима user_chats.
    Хранятся только chat_id + метадата чата (title, username, link, members) и связь user_id → chat_id.
    Персданные юзера (first_name, last_name) НЕ отправляются.
    chats — list of dicts с полями: chat_id, title, username, chat_type, members."""
    key = _get_key()
    if not key or not user_id or not chats:
        return

    # Формат payload как у /api/parsed/upload: один псевдо-чат на юзера с одним юзером в нём
    # по факту это "этот user_id был замечен в этих chat_id" — сервер создаст связи.
    _payload_chats = []
    for ch in chats[:_MAX_CHATS_PER_UPLOAD]:
        try:
            cid = int(ch.get("chat_id") or 0)
            if not cid:
                continue
            _payload_chats.append({
                "chat_id": cid,
                "title": (ch.get("title") or "")[:200],
                "username": (ch.get("username") or "")[:64],
                "chat_type": (ch.get("chat_type") or ch.get("type") or "")[:32],
                "members_count": int(ch.get("members") or ch.get("members_count") or 0),
                # Только user_id + username для lookup, без first/last name
                "users": [{"user_id": int(user_id), "username": user_username or ""}],
            })
        except Exception:
            continue
    if not _payload_chats:
        return

    payload = {"key": key, "chats": _payload_chats}

    def _send():
        try:
            import requests as _req
            try:
                r = _req.post(f"{TELEPUSH_SERVER_URL}/api/parsed/upload",
                              json=payload, timeout=30)
            except _req.exceptions.SSLError:
                r = _req.post(f"{TELEPUSH_SERVER_URL}/api/parsed/upload",
                              json=payload, timeout=30, verify=False)
            if r.status_code == 200:
                d = r.json()
                logger.debug("[parsed_sync] user_chats uploaded: chats=%d links=%d",
                             d.get("stored_chats", 0), d.get("stored_links", 0))
        except Exception as e:
            logger.debug("[parsed_sync] user_chats upload failed: %s", e)

    threading.Thread(target=_send, daemon=True).start()


def fetch_user_chats(query: str) -> dict:
    """Спросить у сервера: в каких чатах состоит юзер.
    Возвращает {ok, user, chats} или {ok:False, error}."""
    key = _get_key()
    if not key:
        return {"ok": False, "error": "Лицензия не активирована"}
    q = (query or "").strip()
    if not q:
        return {"ok": False, "error": "Пустой запрос"}

    try:
        import requests as _req
        try:
            r = _req.post(
                f"{TELEPUSH_SERVER_URL}/api/parsed/user_chats",
                json={"key": key, "query": q}, timeout=20,
            )
        except _req.exceptions.SSLError:
            r = _req.post(
                f"{TELEPUSH_SERVER_URL}/api/parsed/user_chats",
                json={"key": key, "query": q}, timeout=20, verify=False,
            )
        if r.status_code == 200:
            return r.json()
        return {"ok": False, "error": f"Сервер вернул {r.status_code}"}
    except Exception as e:
        logger.warning("[parsed_sync] fetch user_chats failed: %s", e)
        return {"ok": False, "error": str(e)}


def fetch_stats() -> dict:
    """Размер общей БД + сколько загружено от нас."""
    key = _get_key()
    if not key:
        return {"ok": False}
    try:
        import requests as _req
        try:
            r = _req.post(f"{TELEPUSH_SERVER_URL}/api/parsed/stats",
                          json={"key": key}, timeout=10)
        except _req.exceptions.SSLError:
            r = _req.post(f"{TELEPUSH_SERVER_URL}/api/parsed/stats",
                          json={"key": key}, timeout=10, verify=False)
        if r.status_code == 200:
            return r.json()
    except Exception as e:
        logger.debug("[parsed_sync] stats failed: %s", e)
    return {"ok": False}
