"""Ingest videos/documents from registered source chats."""

from __future__ import annotations

import logging

from aiogram import F, Router
from aiogram.types import Message

from app.context import AppContext
from app.services.media_service import IncomingMedia

logger = logging.getLogger(__name__)
router = Router(name="ingest")

_VIDEO_EXTENSIONS = {".mp4", ".mkv", ".mov", ".webm", ".m4v", ".avi"}


def _from_message(message: Message) -> IncomingMedia | None:
    if message.video is not None:
        video = message.video
        return IncomingMedia(
            chat_id=message.chat.id,
            message_id=message.message_id,
            chat_type=message.chat.type,
            chat_title=message.chat.title,
            file_id=video.file_id,
            file_unique_id=video.file_unique_id,
            media_type="video",
            mime_type=video.mime_type,
            file_name=video.file_name,
            file_size=video.file_size,
            duration_seconds=float(video.duration) if video.duration else None,
            width=video.width,
            height=video.height,
            thumbnail_file_id=video.thumbnail.file_id if video.thumbnail else None,
            caption=message.caption,
        )
    if message.document is not None:
        document = message.document
        name = (document.file_name or "").lower()
        mime = (document.mime_type or "").lower()
        suffix = "." + name.rsplit(".", 1)[-1] if "." in name else ""
        if not mime.startswith("video/") and suffix not in _VIDEO_EXTENSIONS:
            return None
        return IncomingMedia(
            chat_id=message.chat.id,
            message_id=message.message_id,
            chat_type=message.chat.type,
            chat_title=message.chat.title,
            file_id=document.file_id,
            file_unique_id=document.file_unique_id,
            media_type="document",
            mime_type=document.mime_type,
            file_name=document.file_name,
            file_size=document.file_size,
            duration_seconds=None,
            width=None,
            height=None,
            thumbnail_file_id=document.thumbnail.file_id if document.thumbnail else None,
            caption=message.caption,
        )
    return None


@router.channel_post(F.video | F.document)
async def ingest_channel_post(message: Message, ctx: AppContext) -> None:
    await _ingest(message, ctx)


@router.message(F.chat.type.in_({"group", "supergroup"}), F.video | F.document)
async def ingest_group_message(message: Message, ctx: AppContext) -> None:
    await _ingest(message, ctx)


async def _ingest(message: Message, ctx: AppContext) -> None:
    incoming = _from_message(message)
    if incoming is None:
        return
    try:
        result = await ctx.media.ingest(incoming)
    except Exception as exc:
        logger.warning(
            "media ingest failed in chat %s message %s: %s",
            message.chat.id,
            message.message_id,
            type(exc).__name__,
        )
        await ctx.repos.media.update_source(
            message.chat.id, last_error="دریافت یک فایل ناموفق بود."
        )
        return
    if result.status == "created":
        logger.info(
            "ingested media id=%s from chat=%s message=%s",
            result.media.id if result.media else "?",
            message.chat.id,
            message.message_id,
        )
    elif result.status == "invalid":
        await ctx.repos.media.update_source(
            message.chat.id,
            last_error=result.reason or "فایل نامعتبر است.",
        )
        logger.info(
            "invalid media from chat=%s message=%s: %s",
            message.chat.id,
            message.message_id,
            result.reason,
        )
