"""Message lock detection helpers."""

from __future__ import annotations

import re
from typing import Optional

from bot.helpers import extract_links, is_english_only, is_emoji_only, is_persian_or_arabic


async def check_text_locks(message, locks: set[str]) -> Optional[str]:
    text = message.text or message.caption or ""

    if not text:
        return None

    text_locks = {
        "url": (lambda m: bool(extract_links(m.text or m.caption or "")), "url"),
        "forward": (lambda m: bool(m.forward_origin), "forward"),
        "mention": (lambda m: "@" in (m.text or ""), "mention"),
        "hashtag": (lambda m: "#" in (m.text or ""), "hashtag"),
        "english": (lambda m: is_english_only(m.text or m.caption or ""), "english"),
        "persian": (lambda m: is_persian_or_arabic(m.text or m.caption or ""), "persian"),
        "emoji": (lambda m: is_emoji_only(m.text or m.caption or ""), "emoji"),
        "arabic": (lambda m: bool(re.search(r"[\u0600-\u06FF]", m.text or m.caption or "")), "arabic"),
    }

    for check_fn, lock_key in text_locks.values():
        if lock_key in locks and check_fn(message):
            return lock_key

    return None


async def check_media_locks(message, locks: set[str]) -> Optional[str]:
    media_map = {
        "photo": message.photo,
        "video": message.video,
        "document": message.document,
        "sticker": message.sticker,
        "gif": message.animation,
        "voice": message.voice,
        "videonote": message.video_note,
        "audio": message.audio,
        "contact": message.contact,
        "location": message.location,
        "poll": message.poll,
        "game": message.game,
    }

    for lock_name, value in media_map.items():
        if value and lock_name in locks:
            return lock_name

    return None
