"""
Логирование TelePush — публичные хелперы log_spam_*/log_join_*.

Раньше всё писалось через единый `getLogger("telepush")` → попадало в
категорию «Системные» в UI-консоли. Теперь функции рассылки пишут под
`telepush.spam`, подписки — под `telepush.join`. UI-фильтр (см. _MODULE_SHORT
в web/app.py) разнесёт их по соответствующим вкладкам РАС / ПОД.
"""
import logging

# Базовый логгер модуля (для backward-compat: from bot_ui.logger_setup import logger)
logger = logging.getLogger("telepush")
_spam_log = logging.getLogger("telepush.spam")
_join_log = logging.getLogger("telepush.join")


# Карта перевода технических статусов в русские человекопонятные.
# Используется в логах рассылки/подписки чтобы клиент видел «спам-блок»
# вместо «spamfilter» и т.п.
_STATUS_RU = {
    "sent": "отправлено",
    "spamfilter": "спам-блок",
    "flood": "флуд",
    "slowmode": "медленный режим",
    "failed": "ошибка",
    "joined": "вступил",
    "joined:invite": "вступил по инвайту",
    "joined:public": "вступил по ссылке",
    "already_member": "уже состоит",
    "already_participant": "уже состоит",
    "privacy": "приватность",
    "no_rights": "нет прав",
    "peer_flood": "вечный спам-блок",
    "not_found": "не найден",
    "ignored:broadcast_no_write": "пропущено — канал без чата",
    "failed:account_dead": "ошибка — аккаунт мёртв",
    "failed:account_disabled": "ошибка — аккаунт отключён",
    "failed:account_frozen": "ошибка — аккаунт заморожен",
    "failed:client_not_connected": "ошибка — не подключён",
    "failed:network": "ошибка сети",
    "failed:FrozenMethodInvalidError": "заморожен (FrozenMethod)",
    "failed:banned_in_channel": "забанен в чате",
    "failed:invite_expired": "инвайт устарел",
    "failed:invite_invalid": "инвайт невалидный",
    "failed:invite_private": "инвайт приватный",
    "running": "работает",
    "paused": "пауза",
    "finished": "завершено",
    "stopped": "остановлено",
    "idle": "ожидание",
}


def _ru_status(status):
    """Перевести технический статус в русский. Если в карте нет — возвращаем
    как есть (бывают коды вида 'failed:custom_text' с подробностями)."""
    if not status:
        return status
    s = str(status)
    if s in _STATUS_RU:
        return _STATUS_RU[s]
    # «failed:something» — берём префикс «ошибка» + хвост
    if s.startswith("failed:"):
        suffix = s[len("failed:"):]
        return f"ошибка ({suffix})"
    if s.startswith("joined:"):
        return _STATUS_RU.get(s, "вступил")
    return s


def log_spam_start(phone, total, owner_id):
    _spam_log.info("[рассылка:%s] СТАРТ — %d целей | uid/%s", phone, total, owner_id)

def log_spam_result(phone, idx, total, title, status):
    _spam_log.info("[рассылка:%s] %d/%d  %s  →  %s", phone, idx, total, title[:50], _ru_status(status))

def log_spam_finish(phone, status, counts):
    _spam_log.info("[рассылка:%s] ЗАВЕРШЕНО — %s | отправлено: %d | спам: %d | ошибок: %d",
                   phone, _ru_status(status), counts.get("sent", 0), counts.get("spamfilter", 0), counts.get("failed", 0))

def log_join_start(phone, total, dup_removed=0, owner_id=None):
    _join_log.info("[подписка:%s] СТАРТ — %d ссылок (-%d дублей) | uid/%s", phone, total, dup_removed or 0, owner_id)

def log_join_result(phone, idx, total, link, status):
    _join_log.info("[подписка:%s] %d/%d  %s  →  %s", phone, idx, total, link[:50], _ru_status(status))

def log_join_finish(phone, status, counts):
    _join_log.info("[подписка:%s] ЗАВЕРШЕНО — %s | вступил: %d | ошибок: %d",
                   phone, _ru_status(status), counts.get("joined", 0), counts.get("failed", 0))
