"""
منطق فیلتر مخصوص هر کانال + تشخیص قیمت.
"""
import re
import config


def normalize_channel_entry(entry):
    """فرمت رشته‌ای ساده یا دیکشنری را به دیکشنری استاندارد تبدیل می‌کند."""
    if isinstance(entry, str):
        return {"channel": entry, "policy": "all", "keywords": []}
    return {
        "channel": entry["channel"],
        "policy": entry.get("policy", "all"),
        "keywords": entry.get("keywords", []),
    }


def get_channel_configs():
    """لیست تنظیمات کانال‌ها به‌صورت استاندارد."""
    return [normalize_channel_entry(e) for e in config.SOURCE_CHANNELS]


def get_source_identifiers():
    """فقط شناسه‌ی کانال‌ها (برای ثبت در هندلر Telethon)."""
    return [c["channel"] for c in get_channel_configs()]


# ---------- تشخیص قیمت ----------
# عدد (با جداکننده‌ی هزارگان فارسی/انگلیسی) که نزدیک یک واحد پول باشد
_DIGITS = r"[\d۰-۹]"
_NUMBER = rf"{_DIGITS}{{1,3}}(?:[.,،]{_DIGITS}{{3}})*(?:[.,]{_DIGITS}+)?"


def _has_currency_amount(text: str) -> bool:
    low = text.lower()
    for cur in config.PRICE_CURRENCY_WORDS:
        cur_l = cur.lower()
        # عدد ... واحد پول   یا   واحد پول ... عدد  (در فاصله‌ی نزدیک)
        pat1 = re.compile(_NUMBER + r"\s*" + re.escape(cur_l))
        pat2 = re.compile(re.escape(cur_l) + r"\s*" + _NUMBER)
        if pat1.search(low) or pat2.search(low):
            return True
    # اعداد خیلی بزرگ با جداکننده‌ی هزارگان (مثل 12,500,000) معمولاً قیمت‌اند
    if re.search(rf"{_DIGITS}{{1,3}}(?:[,،]{_DIGITS}{{3}}){{2,}}", text):
        return True
    return False


def _has_price_keyword(text: str) -> bool:
    low = text.lower()
    return any(kw.lower() in low for kw in config.PRICE_KEYWORDS)


def contains_price(text: str) -> bool:
    """آیا متن شامل قیمت است؟ (هر دو روش: عدد+واحد پول، یا کلمات قیمتی)"""
    if not text:
        return False
    return _has_currency_amount(text) or _has_price_keyword(text)


# ---------- اعمال سیاست کانال ----------
def passes_channel_policy(channel_cfg: dict, text: str) -> bool:
    """آیا این پیام طبق سیاست کانالش باید بیاید؟"""
    policy = channel_cfg.get("policy", "all")
    text = text or ""

    if policy == "all":
        return True

    if policy == "whitelist":
        kws = channel_cfg.get("keywords", [])
        if not kws:
            return True  # اگر کلیدواژه‌ای تعریف نشده، رد نکن
        low = text.lower()
        return any(kw.lower() in low for kw in kws)

    if policy == "exclude_price":
        return not contains_price(text)

    return True


def general_skip(text: str) -> bool:
    """فیلترهای عمومی که برای همه‌ی کانال‌ها اعمال می‌شوند."""
    if config.SKIP_IF_NO_TEXT and not (text and text.strip()):
        return True
    if text and len(text.strip()) < config.MIN_TEXT_LENGTH:
        return True
    low = (text or "").lower()
    return any(kw.lower() in low for kw in config.BLOCK_KEYWORDS)
