"""Administrator management and user blocking."""

from __future__ import annotations

from aiogram import F, Router
from aiogram.fsm.context import FSMContext
from aiogram.types import CallbackQuery, Message

from app.context import AppContext
from app.handlers.common import show
from app.keyboards.inline import admins_menu, back_cancel, back_menu, confirm, users_menu
from app.states import AdminState

router = Router(name="admins")


async def _admins_home(callback: CallbackQuery, ctx: AppContext) -> None:
    admins = await ctx.admins.list_admins()
    primary = await ctx.admins.is_primary(callback.from_user.id)
    lines = ["👥 مدیران ربات:\n"]
    for admin in admins:
        mark = "👑" if admin.is_primary else "👤"
        source = "ENV" if admin.is_env_admin else "DB"
        lines.append(
            f"{mark} {admin.title or 'مدیر'} | {admin.telegram_id} | {source} | "
            f"{'فعال' if admin.is_active else 'غیرفعال'}"
        )
    if not primary:
        lines.append("\nفقط مدیر اصلی می‌تواند مدیر اضافه یا حذف کند.")
    await show(callback, "\n".join(lines), admins_menu(admins, is_primary=primary))


@router.callback_query(F.data == "menu:admins")
async def admins_home(callback: CallbackQuery, ctx: AppContext) -> None:
    await _admins_home(callback, ctx)
    await callback.answer()


@router.callback_query(F.data == "admin:add")
async def admin_add(callback: CallbackQuery, state: FSMContext, ctx: AppContext) -> None:
    if not await ctx.admins.is_primary(callback.from_user.id):
        await callback.answer("فقط مدیر اصلی مجاز است.", show_alert=True)
        return
    await state.set_state(AdminState.waiting_id)
    await show(
        callback,
        "شناسه عددی تلگرام مدیر جدید را بفرستید. کاربر باید یک‌بار ربات را استارت کند.",
        back_cancel("menu:admins"),
    )
    await callback.answer()


@router.message(AdminState.waiting_id)
async def admin_add_receive(message: Message, state: FSMContext, ctx: AppContext) -> None:
    if not message.text:
        await message.answer("شناسه عددی بفرستید.")
        return
    try:
        admin, created = await ctx.admins.add(
            message.from_user.id, message.text, title=None
        )
    except Exception as exc:
        await message.answer(f"⚠️ {exc}")
        return
    await state.clear()
    await message.answer(
        f"{'✅ مدیر اضافه شد.' if created else 'ℹ️ این کاربر از قبل مدیر است.'}\n"
        f"شناسه: {admin.telegram_id}",
        reply_markup=back_menu("menu:admins"),
    )


@router.callback_query(F.data.startswith("admin:remove:"))
async def admin_remove_ask(callback: CallbackQuery, ctx: AppContext) -> None:
    if not await ctx.admins.is_primary(callback.from_user.id):
        await callback.answer("فقط مدیر اصلی مجاز است.", show_alert=True)
        return
    telegram_id = int(callback.data.rsplit(":", 1)[1])
    await show(
        callback,
        f"مدیر {telegram_id} حذف شود؟\n"
        "مدیران تعریف‌شده در ADMIN_IDS فقط با تغییر env غیرفعال می‌شوند.",
        confirm("admin_remove", telegram_id, back="menu:admins"),
    )
    await callback.answer()


@router.callback_query(F.data.startswith("confirm:admin_remove:"))
async def admin_remove_confirm(callback: CallbackQuery, ctx: AppContext) -> None:
    telegram_id = int(callback.data.rsplit(":", 1)[1])
    try:
        message = await ctx.admins.remove(callback.from_user.id, telegram_id)
    except Exception as exc:
        await callback.answer(str(exc)[:190], show_alert=True)
        return
    await callback.answer(message[:190], show_alert=True)
    await _admins_home(callback, ctx)


@router.callback_query(F.data == "menu:users")
async def users_home(
    callback: CallbackQuery, ctx: AppContext, *, answer: bool = True
) -> None:
    users = await ctx.repos.users.list_users(limit=15)
    if not users:
        await show(callback, "هنوز کاربری ثبت نشده است.", back_menu())
        if answer:
            await callback.answer()
        return
    lines = ["👤 کاربران اخیر (حداکثر ۱۵ مورد):"]
    for user in users:
        lines.append(
            f"• {user.display_name or '—'} | {user.telegram_id} | "
            f"{'🚫 مسدود' if user.is_blocked else '✅ فعال'} | "
            f"درخواست: {user.request_count}"
        )
    await show(callback, "\n".join(lines), users_menu(users))
    if answer:
        await callback.answer()


@router.callback_query(F.data.startswith("user:toggle:"))
async def user_toggle(callback: CallbackQuery, ctx: AppContext) -> None:
    telegram_id = int(callback.data.rsplit(":", 1)[1])
    user = await ctx.repos.users.get_by_telegram_id(telegram_id)
    if user is None:
        await callback.answer("کاربر پیدا نشد.", show_alert=True)
        return
    await ctx.repos.users.set_blocked(
        telegram_id,
        not user.is_blocked,
        "مسدودسازی توسط مدیر" if not user.is_blocked else None,
    )
    await ctx.repos.audit.log(
        callback.from_user.id,
        "user.block_toggle",
        entity_type="user",
        entity_id=telegram_id,
        details={"blocked": not user.is_blocked},
    )
    await callback.answer("وضعیت مسدودسازی تغییر کرد.")
    await users_home(callback, ctx, answer=False)
