from datetime import datetime, timezone as py_tz
from telegram import Update
from telegram.ext import ContextTypes
from django.utils import timezone
from .models import TelegramChat

def _now_aware():
    return timezone.now()

async def upsert_chat_from_update(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """
    Вызывайте в message-хендлерах, чтобы обновлять last_message_at и тайтл.
    """
    chat = update.effective_chat
    if not chat:
        return

    obj, created = TelegramChat.objects.update_or_create(
        id=chat.id,
        defaults={
            "type": chat.type,
            "title": chat.title or "",
            "username": chat.username or "",
            "is_member": True,  # если есть сообщения — бот, скорее всего, в чате
            "last_message_at": _now_aware(),
        }
    )
    # created можно игнорировать; при необходимости — логировать


async def on_my_chat_member(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """
    Ловим изменение статуса бота в чатах (добавили/кикнули).
    """
    if not update.my_chat_member:
        return

    chat = update.my_chat_member.chat
    new_status = update.my_chat_member.new_chat_member.status  # "member"/"administrator"/"kicked"/"left"/...
    is_in_chat = new_status in ("member", "administrator")

    defaults = {
        "type": chat.type,
        "title": chat.title or "",
        "username": getattr(chat, "username", "") or "",
        "is_member": is_in_chat,
        "last_message_at": _now_aware(),
    }

    if is_in_chat:
        defaults["left_at"] = None
        defaults.setdefault("joined_at", _now_aware())

    obj, _ = TelegramChat.objects.update_or_create(
        id=chat.id,
        defaults=defaults
    )

    if not is_in_chat and obj.left_at is None:
        obj.left_at = _now_aware()
        obj.save(update_fields=["is_member", "left_at"])
