"""Smart sticker packs — auto-send stickers on keyword match."""
from __future__ import annotations

import logging
import random

from telegram import Update
from telegram.error import BadRequest, Forbidden
from telegram.ext import ContextTypes

from bot import db
from bot.decorators import admin_only
from bot.persian_router import register_mixed

logger = logging.getLogger(__name__)


async def _get_random_sticker(bot, set_name: str) -> str | None:
    """Get a random sticker file_id from a sticker set."""
    try:
        pack = await bot.get_sticker_set(set_name)
        if pack.stickers:
            sticker = random.choice(pack.stickers)
            return sticker.file_id
    except Exception as e:
        logger.warning(f"Sticker pack '{set_name}' error: {e}")
    return None


@admin_only
async def add_sticker_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """اضافه کردن پک استیکر [لینک] [کلمه کلیدی]"""
    chat = update.effective_chat
    message = update.message
    text = message.text or ""

    parts = text.split(maxsplit=2)
    if len(parts) < 3:
        await message.reply_text(
            "📦 **اضافه کردن پک استیکر هوشمند**\n\n"
            "بگو: `اضافه کردن پک استیکر [لینک] [کلمه]`\n"
            "مثال: `اضافه کردن پک استیکر https://t.me/addstickers/Friends یارو`\n\n"
            "هرکی بگه «یارو» یه استیکر رندوم از این پک میاد.",
            parse_mode=ParseMode.MARKDOWN,
        )
        return

    raw_link = parts[1].strip()
    keyword = parts[2].strip().lower()

    # Extract set_name from link or direct name
    set_name = raw_link
    if "addstickers/" in raw_link:
        set_name = raw_link.split("addstickers/")[-1].split("?")[0].strip()
    elif "t.me/" in raw_link:
        set_name = raw_link.split("t.me/")[-1].split("?")[0].strip()

    if not set_name:
        await message.reply_text("❌ لینک پک استیکر معتبر نیست.")
        return

    # Check sticker set exists and get count
    from telegram.error import BadRequest as TE_BadRequest

    sticker_count = 0
    try:
        pack = await context.bot.get_sticker_set(set_name)
        sticker_count = len(pack.stickers) if pack.stickers else 0
        # Send a sample
        sample = await _get_random_sticker(context.bot, set_name)
        if sample:
            await message.reply_sticker(sample)
    except TE_BadRequest:
        await message.reply_text(f"❌ پک استیکر `{set_name}` پیدا نشد!", parse_mode=ParseMode.MARKDOWN)
        return
    except Exception as e:
        await message.reply_text(f"❌ خطا در دریافت پک: {e}")
        return

    existed = await db.add_sticker_pack(chat.id, set_name, keyword, update.effective_user.id, sticker_count)
    if existed:
        await message.reply_text(f"➕ این پک قبلاً با کلمه «{keyword}» ذخیره شده بود.")
    else:
        await message.reply_text(
            f"✅ پک استیکر `{set_name}` با {sticker_count} تا استیکر ذخیره شد!\n"
            f"🔤 کلمه کلیدی: «{keyword}»\n"
            f"💡 هرکی بگه «{keyword}» یه استیکر رندوم میاد.",
            parse_mode=ParseMode.MARKDOWN,
        )


@admin_only
async def remove_sticker_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """حذف پک استیکر [لینک] [کلمه]"""
    chat = update.effective_chat
    text = (update.message.text or "")
    parts = text.split(maxsplit=2)

    set_name = None
    keyword = None

    if len(parts) >= 2:
        raw = parts[1].strip()
        if "addstickers/" in raw:
            set_name = raw.split("addstickers/")[-1].split("?")[0].strip()
        elif "t.me/" in raw:
            set_name = raw.split("t.me/")[-1].split("?")[0].strip()
        else:
            set_name = raw
    if len(parts) >= 3:
        keyword = parts[2].strip().lower()

    if not set_name:
        await update.message.reply_text("بگو: حذف پک استیکر [لینک]\nیا: حذف پک استیکر [لینک] [کلمه]")
        return

    count = await db.remove_sticker_pack(chat.id, set_name, keyword)
    if count:
        await update.message.reply_text(f"🗑 {count} مورد حذف شد.")
    else:
        await update.message.reply_text("چیزی برا حذف پیدا نکردم.")


async def list_stickers_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """پک استیکرها / استیکرها"""
    chat = update.effective_chat
    items = await db.get_sticker_packs(chat.id)
    if not items:
        await update.message.reply_text(
            "📭 هنوز پک استیکری اضافه نشده.\n"
            "با «اضافه کردن پک استیکر [لینک] [کلمه]» اضافه کن."
        )
        return
    keywords = await db.get_sticker_keywords(chat.id)
    text = f"📦 **پک استیکرهای هوشمند ({len(items)} تا)**\n"
    text += f"🔤 کلمات کلیدی: {', '.join(f'«{k}»' for k in keywords)}\n"
    text += "━━━━━━━━━━━━━━━\n"
    for item in items:
        text += f"📦 `{item['set_name']}` → «{item['keyword']}» ({item['uses_count']} بار)\n"
    text += "\n💡 هرکی این کلمات رو بگه، یه استیکر رندوم میاد."
    await update.message.reply_text(text, parse_mode=ParseMode.MARKDOWN)


async def check_sticker_match(update: Update, context: ContextTypes.DEFAULT_TYPE) -> bool:
    """Check message for sticker keywords — called from listener."""
    message = update.message
    if not message or not message.text:
        return False
    chat = update.effective_chat
    if not chat or chat.type == "private":
        return False

    match = await db.find_sticker_match(chat.id, message.text)
    if not match:
        return False

    file_id = await _get_random_sticker(context.bot, match["set_name"])
    if file_id:
        try:
            await message.reply_sticker(file_id)
            await db._exec(
                "UPDATE sticker_packs SET uses_count=uses_count+1 WHERE id=?",
                (match["id"],),
            )
            return True
        except (BadRequest, Forbidden):
            pass
    return False


def register(app) -> None:
    register_mixed(
        app,
        {
            "addstickers": add_sticker_cmd,
            "removestickers": remove_sticker_cmd,
            "stickers": list_stickers_cmd,
        },
        {
            "اضافه کردن پک استیکر": add_sticker_cmd,
            "پک استیکر جدید": add_sticker_cmd,
            "استیکر جدید": add_sticker_cmd,
            "ست کردن استیکر": add_sticker_cmd,
            "حذف پک استیکر": remove_sticker_cmd,
            "پاک کردن پک استیکر": remove_sticker_cmd,
            "پک استیکرها": list_stickers_cmd,
            "استیکرها": list_stickers_cmd,
        },
    )
