"""Nickname — assign a custom display name to a user (per chat).

Inspired by DIGI ANTI's «تنظیم لقب <nickname>» and «حذف لقب».
The nickname is shown in /whois, /id, /me outputs and stored in the DB.
"""
from __future__ import annotations

import logging
from typing import Optional

from telegram import Update
from telegram.constants import ParseMode
from telegram.ext import ContextTypes

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

logger = logging.getLogger(__name__)





def _user_name(uid: int) -> str:
    return f'<code>{uid}</code>'


# ───────── Commands ─────────
@admin_only
async def setnickname_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Set a nickname. Reply + «setnickname لقب» or «setnickname لقب» (self)."""
    chat = update.effective_chat
    text = update.message.text or ""
    parts = text.split(maxsplit=1)

    target_id: Optional[int] = None
    nickname = ""

    if update.message.reply_to_message and update.message.reply_to_message.from_user:
        target_id = update.message.reply_to_message.from_user.id
        nickname = parts[1] if len(parts) > 1 else ""
    elif len(parts) >= 2:
        rest = parts[1].strip()
        tokens = rest.split(maxsplit=1)
        if tokens and (tokens[0].startswith("@") or tokens[0].lstrip("-").isdigit()):
            if tokens[0].lstrip("-").isdigit():
                target_id = int(tokens[0])
                nickname = tokens[1] if len(tokens) > 1 else ""
            else:
                # @username — try to resolve, but fall back to "self"
                try:
                    resolved = await context.bot.get_chat(tokens[0])
                    target_id = resolved.id
                    nickname = tokens[1] if len(tokens) > 1 else ""
                except Exception:
                    target_id = update.effective_user.id
                    nickname = rest
        else:
            target_id = update.effective_user.id
            nickname = rest

    if not nickname:
        await update.message.reply_text(
            "❌ استفاده:\n"
            "• روی پیام کاربر ریپلای کرده و بنویسید: <code>setnickname لقب</code>\n"
            "• یا: <code>setnickname لقب</code> (برای خودتان)",
            parse_mode=ParseMode.HTML,
        )
        return

    if target_id is None:
        target_id = update.effective_user.id

    if target_id == context.bot.id:
        await update.message.reply_text("🤖 به خودم دست نزن :)")
        return

    await db.set_nickname(chat.id, target_id, nickname)
    await update.message.reply_text(
        f"🏷 لقب {_user_name(target_id)} به <code>{nickname}</code> تنظیم شد.",
        parse_mode=ParseMode.HTML,
    )


@admin_only
async def remnickname_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Remove a user's nickname."""
    chat = update.effective_chat
    target_id = await resolve_target(context.bot, update.message)
    if target_id is None:
        target_id = update.effective_user.id
    await db.remove_nickname(chat.id, target_id)
    await update.message.reply_text(
        f"🗑 لقب {_user_name(target_id)} حذف شد.",
        parse_mode=ParseMode.HTML,
    )


@admin_only
async def cleannicknames_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Clear all nicknames in this chat."""
    chat = update.effective_chat
    await db.clear_nicknames(chat.id)
    await update.message.reply_text("🗑 همه لقب‌های گروه پاک شد.")


# ───────── Registration ─────────
def register(app) -> None:
    register_mixed(
        app,
        {
            "setnickname": setnickname_cmd,
            "remnickname": remnickname_cmd,
            "cleannicknames": cleannicknames_cmd,
        },
        {
            "تنظیم لقب": setnickname_cmd,
            "حذف لقب": remnickname_cmd,
            "پاکسازی لقب": cleannicknames_cmd,
        },
    )
