"""Public home, help and identity handlers."""

from __future__ import annotations

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

from app.context import AppContext
from app.handlers.common import safe_edit
from app.keyboards.callbacks import MenuCB
from app.keyboards.menus import main_menu
from app.utils.formatting import esc

router = Router(name="start")


def _is_admin(ctx: AppContext, user_id: int | None) -> bool:
    return user_id is not None and user_id in ctx.settings.admin_ids


def help_text() -> str:
    return (
        "<b>🧭 راهنمای ربات</b>\n\n"
        "این ربات صفحات یک سایت مجاز را بررسی می‌کند، فایل ویدئوی واقعی را دانلود "
        "می‌کند و آن را همراه با عنوان و توضیحات در مقصد تلگرام منتشر می‌کند.\n\n"
        "<b>دستورهای اصلی</b>\n"
        "/start — منوی اصلی\n"
        "/help — همین راهنما\n"
        "/add &lt;آدرس&gt; — ثبت عملیات جدید\n"
        "/status [شناسه] — وضعیت کلی یا یک عملیات\n"
        "/jobs — فهرست عملیات‌های فعال\n"
        "/pause [شناسه] — توقف موقت\n"
        "/resume [شناسه] — ادامه پردازش\n"
        "/cancel [شناسه] — لغو عملیات\n"
        "/settings — تنظیم مقصد و مشاهده محدودیت‌ها\n"
        "/history — آخرین ارسال‌های موفق\n"
        "/id — نمایش شناسه کاربر و چت\n\n"
        "<b>نکات امنیتی و حقوقی</b>\n"
        "• تنها دامنه‌های فهرست <code>ALLOWED_DOMAINS</code> بررسی می‌شوند.\n"
        "• robots.txt و محدودیت‌های سایت رعایت می‌شوند؛ هیچ محدودیت دسترسی، "
        "ورود یا DRM دور زده نمی‌شود.\n"
        "• مقصد انتشار باید کانال یا گروهی باشد که ربات در آن اجازه ارسال دارد.\n"
        "• در صورت نامشخص بودن نتیجه ارسال، برای جلوگیری از ارسال تکراری، "
        "تلاش خودکار انجام نمی‌شود.\n"
        "• پیش از استفاده، اجازه انتشار محتوا را از صاحب آن دریافت کنید."
    )


@router.message(Command("start"))
async def start_command(message: Message, state: FSMContext, ctx: AppContext) -> None:
    await state.clear()
    is_admin = _is_admin(ctx, message.from_user.id if message.from_user else None)
    name = esc(message.from_user.full_name if message.from_user else "")
    if is_admin:
        text = (
            f"<b>🎬 ربات مدیریت و انتشار ویدئو</b>\n\n"
            f"سلام {name} 👋\n"
            "از منوی زیر یک عملیات جدید بسازید یا وضعیت عملیات‌ها را ببینید.\n\n"
            "برای شروع سریع: <code>/add https://example.com/page</code>"
        )
    else:
        text = (
            "<b>🎬 ربات انتشار ویدئو</b>\n\n"
            "این نمونه فقط برای مدیران پیکربندی‌شده در <code>ADMIN_IDS</code> قابل استفاده است.\n"
            "برای اطلاعات بیشتر راهنما را ببینید."
        )
    await message.answer(
        text,
        parse_mode="HTML",
        disable_web_page_preview=True,
        reply_markup=main_menu(is_admin=is_admin),
    )


@router.message(Command("help"))
async def help_command(message: Message) -> None:
    await message.answer(
        help_text(),
        parse_mode="HTML",
        disable_web_page_preview=True,
    )


@router.message(Command("id"))
async def id_command(message: Message) -> None:
    user = message.from_user
    lines = ["<b>🪪 شناسه‌ها</b>", ""]
    if user is not None:
        lines.extend(
            [
                f"شناسه کاربر: <code>{user.id}</code>",
                f"نام: {esc(user.full_name)}",
            ]
        )
        if user.username:
            lines.append(f"نام کاربری: <code>@{esc(user.username)}</code>")
    lines.append(f"شناسه این چت: <code>{message.chat.id}</code>")
    lines.append(f"نوع چت: <code>{esc(message.chat.type)}</code>")
    await message.answer("\n".join(lines), parse_mode="HTML")


@router.callback_query(MenuCB.filter(F.action == "home"))
async def home_callback(
    callback: CallbackQuery, callback_data: MenuCB, ctx: AppContext
) -> None:
    await callback.answer()
    is_admin = _is_admin(ctx, callback.from_user.id)
    if is_admin:
        text = (
            "<b>🎬 منوی اصلی</b>\n\n"
            "یک گزینه را انتخاب کنید. عملیات‌های در حال اجرا را می‌توانید از "
            "بخش «عملیات‌ها» مدیریت کنید."
        )
    else:
        text = "<b>🎬 منوی اصلی</b>\n\nاین ربات فقط برای مدیران پیکربندی‌شده است."
    await safe_edit(callback, text, main_menu(is_admin=is_admin))


@router.callback_query(MenuCB.filter(F.action == "help"))
async def help_callback(
    callback: CallbackQuery, callback_data: MenuCB, ctx: AppContext
) -> None:
    await callback.answer()
    is_admin = _is_admin(ctx, callback.from_user.id)
    await safe_edit(callback, help_text(), main_menu(is_admin=is_admin))
