"""Locks — content-type restrictions per chat."""
from __future__ import annotations

import logging

from telegram import ChatPermissions, InlineKeyboardButton, InlineKeyboardMarkup, Update
from telegram.constants import ParseMode
from telegram.error import BadRequest, Forbidden
from telegram.ext import CallbackQueryHandler, CommandHandler, ContextTypes

from bot import db
from bot.decorators import admin_only
from bot.constants import E, LOCK_TYPES, MSG
from bot.persian_router import register_mixed

logger = logging.getLogger(__name__)


# All lockable types (Persian aliases)
LOCK_ALIASES = {
    # Media
    "photo": "photo", "عکس": "photo",
    "video": "video", "فیلم": "video",
    "voice": "voice", "ویس": "voice",
    "videonote": "videonote", "فیلم سلفی": "videonote",
    "audio": "audio", "آهنگ": "audio", "موزیک": "audio",
    "document": "document", "فایل": "document",
    "sticker": "sticker", "استیکر": "sticker",
    "sticker_animation": "sticker_animation", "استیکر متحرک": "sticker_animation",
    "gif": "gif", "گیف": "gif",
    "contact": "contact", "مخاطب": "contact",
    "location": "location", "مکان": "location", "لوکیشن": "location",
    "game": "game", "بازی": "game",
    "poll": "poll", "نظرسنجی": "poll",
    "text": "text", "متن": "text",
    "emoji": "emoji", "ایموجی": "emoji",
    # Special
    "link": "link", "لینک": "link",
    "forward": "forward", "فوروارد": "forward", "فروارد": "forward",
    "tag": "tag", "تگ": "tag",
    "hashtag": "hashtag", "هشتگ": "hashtag",
    "persian": "persian", "فارسی": "persian",
    "english": "english", "انگلیسی": "english",
    "arabic": "arabic", "عربی": "arabic",
    "bot": "bot", "ربات": "bot",
    "addbot": "addbot", "افزودن ربات": "addbot", "اد ربات": "addbot",
    "join": "join", "عضو جدید": "join", "عضوجدید": "join",
    "tgservice": "tgservice", "سرویس": "tgservice", "سرویس تلگرام": "tgservice",
    "media": "media", "رسانه": "media",
    "mention": "mention", "منشن": "mention",
    "command": "command", "دستور": "command",
    "webpage": "webpage", "پیش نمایش": "webpage",
    "rtl": "rtl",
}


def _resolve_lock(name: str) -> str | None:
    return LOCK_ALIASES.get(name.lower().strip())


def _is_persian_lock(name: str) -> bool:
    return any(ch in "\u0600-\u06FF\u0750-\u077F\uFB50-\uFDFF\uFE70-\uFEFF" for ch in name)


@admin_only
async def lock_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    chat = update.effective_chat
    args = (update.message.text or "").split(maxsplit=1)
    if len(args) < 2:
        await update.message.reply_text(
            "❌ باید بگی چی رو قفل کنم! مثلاً: قفل کن لینک\nبرای دیدن انواع: انواع قفل",
            parse_mode=ParseMode.HTML,
        )
        return
    name = _resolve_lock(args[1])
    if not name:
        await update.message.reply_text(
            f"❌ این نوع قفل رو نمی‌شناسم!\nانواع موجود: <code>{', '.join(LOCK_ALIASES.keys())}</code>",
            parse_mode=ParseMode.HTML,
        )
        return
    await db.add_lock(chat.id, name)
    label = LOCK_TYPES.get(name, (name, "🔒"))[0]
    await update.message.reply_text(f"🔒 قفل «{label}» فعال شد. دیگه کسی نمی‌تونه بفرسته!")


@admin_only
async def unlock_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    chat = update.effective_chat
    args = (update.message.text or "").split(maxsplit=1)
    if len(args) < 2:
        await update.message.reply_text(
            "❌ باید بگی چی رو باز کنم! مثلاً: باز کن لینک", parse_mode=ParseMode.HTML
        )
        return
    name = _resolve_lock(args[1])
    if not name:
        await update.message.reply_text("❌ این نوع قفل رو نمی‌شناسم.")
        return
    await db.remove_lock(chat.id, name)
    label = LOCK_TYPES.get(name, (name, "🔓"))[0]
    await update.message.reply_text(f"🔓 قفل «{label}» باز شد. از این به بعد آزاده!")


@admin_only
async def locks_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    chat = update.effective_chat
    active = await db.get_locks(chat.id)
    if not active:
        await update.message.reply_text("📋 هیچ قفلی فعال نیست. همه چی بازه!")
        return
    text = "📋 <b>قفل‌های فعال گروه:</b>\n\n"
    for lock in active:
        label, icon = LOCK_TYPES.get(lock, (lock, "🔒"))
        text += f"{icon} {label}\n"
    await update.message.reply_text(text, parse_mode=ParseMode.HTML)


@admin_only
async def locktypes_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    text = "🔒 <b>انواع قفل‌هایی که می‌تونم ببندم:</b>\n\n"
    for name, (label, icon) in LOCK_TYPES.items():
        text += f"{icon} <code>{name}</code> → {label}\n"
    text += "\n💡 مثلاً: «قفل کن استیکر» یا «ببند لینک»"
    await update.message.reply_text(text, parse_mode=ParseMode.HTML)


@admin_only
async def unlockall_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    await db.clear_locks(update.effective_chat.id)
    await update.message.reply_text("✅ همه قفل‌ها باز شدن! دیگه هیچ محدودیتی وجود نداره.")


# ───────── Strict mode ─────────
@admin_only
async def strictlock_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """قفل سختگیرانه: ارسال لینک/فوروارد = سکوت دائمی"""
    chat = update.effective_chat
    await db.add_lock(chat.id, "link")
    await db.add_lock(chat.id, "forward")
    await db.set_setting(chat.id, "strict_lock", True)
    await update.message.reply_text(
        "🔒 <b>حالت سختگیرانه فعال شد!</b>\n\n"
        "از این به بعد:\n"
        "• هرکس لینک بفرسته → سکوت دائمی\n"
        "• هرکس فوروارد کنه → سکوت دائمی\n\n"
        "فقط ادمین‌ها می‌تونن لینک و فوروارد بفرستن.\n"
        "برای رفع سکوت کاربر از دستور «رفع سکوت» استفاده کن.",
        parse_mode=ParseMode.HTML,
    )


@admin_only
async def unstrictlock_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    await db.del_setting(update.effective_chat.id, "strict_lock")
    await update.message.reply_text("✅ حالت سختگیرانه غیرفعال شد. لینک و فوروارد آزاد شد.")


# ───────── Mute-all (lock whole group) ─────────
@admin_only
async def muteall_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    chat = update.effective_chat
    try:
        await context.bot.set_chat_permissions(
            chat.id,
            permissions=ChatPermissions(
                can_send_messages=False,
                can_send_audios=False,
                can_send_documents=False,
                can_send_photos=False,
                can_send_videos=False,
                can_send_video_notes=False,
                can_send_voice_notes=False,
                can_send_polls=False,
                can_send_other_messages=False,
                can_add_web_page_previews=False,
                can_change_info=False,
                can_invite_users=True,
                can_pin_messages=False,
                can_manage_topics=False,
            ),
        )
    except (BadRequest, Forbidden):
        pass
    await db.set_setting(chat.id, "muteall", True)
    await update.message.reply_text("🔒 گروه قفل شد! فقط ادمین‌ها می‌تونن پیام بفرستن.")


@admin_only
async def unmuteall_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    chat = update.effective_chat
    try:
        await context.bot.set_chat_permissions(
            chat.id,
            permissions=ChatPermissions(
                can_send_messages=True,
                can_send_audios=True,
                can_send_documents=True,
                can_send_photos=True,
                can_send_videos=True,
                can_send_video_notes=True,
                can_send_voice_notes=True,
                can_send_polls=True,
                can_send_other_messages=True,
                can_add_web_page_previews=True,
                can_change_info=False,
                can_invite_users=True,
                can_pin_messages=False,
                can_manage_topics=False,
            ),
        )
    except (BadRequest, Forbidden):
        pass
    await db.del_setting(chat.id, "muteall")
    await update.message.reply_text("🔓 گروه باز شد (همه می‌توانند پیام بفرستند).")


# ───────── Inline panel ─────────
@admin_only
async def panel_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    from bot.sticker_panel import send_panel_sticker, get_panel_header, lock_emoji, status_dot

    chat = update.effective_chat
    locks = set(await db.get_locks(chat.id))
    await send_panel_sticker(update, context)

    # Count locked vs unlocked
    total = len(LOCK_TYPES)
    locked_count = sum(1 for k in LOCK_TYPES if k in locks)
    unlocked_count = total - locked_count

    text = get_panel_header("🔒", "پنل قفل‌های گروه", "روی هر دکمه بزن = فعال/غیرفعال")
    text += f"\n{status_dot(True)} قفل شده: {locked_count}   {status_dot(False)} باز: {unlocked_count}"
    text += f"\n{'━' * 20}"
    text += "\n<i>🟢 = فعال (قفله) • 🔴 = غیرفعال</i>"

    rows = await _build_lock_keyboard(chat.id)
    await update.message.reply_text(text, parse_mode=ParseMode.HTML, reply_markup=InlineKeyboardMarkup(rows))


async def _build_lock_keyboard(chat_id: int) -> list[list[InlineKeyboardButton]]:
    """Build a 2-column lock toggle keyboard with emoji status."""
    locks = set(await db.get_locks(chat_id))
    rows: list[list[InlineKeyboardButton]] = []
    items = list(LOCK_TYPES.items())
    for i in range(0, len(items), 2):
        row: list[InlineKeyboardButton] = []
        for j in range(2):
            if i + j >= len(items):
                break
            k, (label, icon) = items[i + j]
            locked = k in locks
            status = "🔒" if locked else "🔓"
            btn_text = f"{status}{icon} {label}"
            row.append(InlineKeyboardButton(btn_text, callback_data=f"tglk_{k}"))
        rows.append(row)
    rows.append([
        InlineKeyboardButton(f"🔓 باز کردن همه", callback_data="tglk_unlock_all"),
        InlineKeyboardButton(f"🔒 قفل همه", callback_data="tglk_lock_all"),
    ])
    rows.append([InlineKeyboardButton(f"✖️ بستن", callback_data="close")])
    return rows


async def panel_callback(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    query = update.callback_query
    await query.answer()
    if not query.data or not query.data.startswith("tglk_"):
        return
    action = query.data[5:]
    chat_id = query.message.chat.id if query.message and query.message.chat else None
    if not chat_id:
        return
    user = query.from_user
    try:
        member = await context.bot.get_chat_member(chat_id, user.id)
        if member.status not in ("administrator", "creator"):
            await query.answer("❌ فقط ادمین", show_alert=True)
            return
    except (BadRequest, Forbidden):
        return

    if action == "unlock_all":
        await db.clear_locks(chat_id)
        await query.answer("🔓 همه قفل‌ها باز شد")
    elif action == "lock_all":
        for k in LOCK_TYPES:
            await db.add_lock(chat_id, k)
        await query.answer("🔒 همه قفل‌ها فعال شد")
    else:
        locks = await db.get_locks(chat_id)
        if action in locks:
            await db.remove_lock(chat_id, action)
        else:
            await db.add_lock(chat_id, action)

    rows = await _build_lock_keyboard(chat_id)
    try:
        await query.edit_message_reply_markup(InlineKeyboardMarkup(rows))
    except (BadRequest, Forbidden):
        pass


def register(app) -> None:
    register_mixed(
        app,
        {
            "lock": lock_cmd,
            "unlock": unlock_cmd,
            "locks": locks_cmd,
            "locktypes": locktypes_cmd,
            "unlockall": unlockall_cmd,
            "strictlock": strictlock_cmd,
            "unstrictlock": unstrictlock_cmd,
            "muteall": muteall_cmd,
            "unmuteall": unmuteall_cmd,
            "panel": panel_cmd,
        },
        {
            "قفل": lock_cmd,
            "قفل کن": lock_cmd,
            "ببند": lock_cmd,
            "بستن": lock_cmd,
            "بازکردن": unlock_cmd,
            "باز کن": unlock_cmd,
            "باز کن قفل": unlock_cmd,
            "وا کن": unlock_cmd,
            "بازش کن": unlock_cmd,
            "لیست قفل": locks_cmd,
            "قفل‌ها": locks_cmd,
            "قفل های گروه": locks_cmd,
            "انواع قفل": locktypes_cmd,
            "نوع قفل": locktypes_cmd,
            "رفع همه قفل": unlockall_cmd,
            "همه قفل": unlockall_cmd,
            "همه قفل باز": unlockall_cmd,
            "همه رو باز کن": unlockall_cmd,
            "قفل سختگیرانه": strictlock_cmd,
            "سختگیرانه": strictlock_cmd,
            "بازکردن سختگیرانه": unstrictlock_cmd,
            "قفل گروه": muteall_cmd,
            "قفل کامل": muteall_cmd,
            "بستن گروه": muteall_cmd,
            "باز کردن گروه": unmuteall_cmd,
            "باز گروه": unmuteall_cmd,
            "پنل": panel_cmd,
            "پنل قفل": panel_cmd,
            "مدیریت قفل": panel_cmd,
        },
    )
    app.add_handler(CallbackQueryHandler(panel_callback, pattern=r"^tglk_"))
