# handlers/admin/panel.py

import logging
from typing import Any, Dict, Optional

from aiogram import F, Router
from aiogram.exceptions import TelegramBadRequest
from aiogram.fsm.context import FSMContext
from aiogram.types import CallbackQuery, Message

from core.config import settings
from keyboards.admin_kb import get_admin_main_menu

logger = logging.getLogger(__name__)

router = Router()


# ============================================================
# ADMIN ACCESS
# ============================================================

def get_configured_admin_ids() -> frozenset[int]:
    """
    تنها منبع دسترسی مدیریت:
        core.config.settings.get_admin_list()

    هیچ Admin ID داخل این فایل hardcode نمی‌شود.
    """
    method = getattr(
        settings,
        "get_admin_list",
        None,
    )

    if callable(method):
        try:
            return frozenset(
                int(user_id)
                for user_id
                in method()
                if int(user_id) > 0
            )

        except Exception:
            logger.exception(
                "Could not read configured admin list."
            )

            return frozenset()

    raw = str(
        getattr(
            settings,
            "ADMIN_IDS",
            "",
        )
        or ""
    )

    result: set[int] = set()

    for item in raw.split(","):
        item = item.strip()

        if not item:
            continue

        try:
            value = int(item)

        except ValueError:
            continue

        if value > 0:
            result.add(value)

    return frozenset(result)


async def verify_admin_access(
    user_id: int,
) -> bool:
    """
    بررسی دسترسی با Config مرکزی پروژه.
    """
    try:
        user_id = int(user_id)

    except (
        TypeError,
        ValueError,
    ):
        return False

    if user_id <= 0:
        return False

    return (
        user_id
        in get_configured_admin_ids()
    )


# ============================================================
# SYSTEM METRICS
# ============================================================

async def fetch_realtime_system_metrics() -> Dict[str, Any]:
    """
    دریافت آمار سیستم برای داشبورد مدیریت.

    این تابع فعلاً مقدار پیش‌فرض برمی‌گرداند تا به دیتابیس
    متصل شود.
    """

    try:
        # ====================================================
        # DATABASE EXAMPLE
        # ====================================================
        #
        # from utils.database import db_manager
        #
        # total_users = await db_manager.get_total_users()
        # pending_kyc = await db_manager.get_pending_kyc_count()
        # active_services = await db_manager.get_active_services_count()
        # banned_users = await db_manager.get_banned_users_count()
        #
        # return {
        #     "total_users": total_users,
        #     "pending_kyc": pending_kyc,
        #     "active_services": active_services,
        #     "banned_users": banned_users,
        #     "server_status": "عملیاتی 🟢",
        #     "db_latency": "12ms",
        # }

        # ====================================================
        # TEMPORARY FALLBACK
        # ====================================================

        return {
            "total_users": 0,
            "pending_kyc": 0,
            "active_services": 0,
            "banned_users": 0,
            "server_status": "عملیاتی 🟢",
            "db_latency": "N/A",
        }

    except Exception:
        logger.exception("Failed to fetch system metrics")

        return {
            "total_users": 0,
            "pending_kyc": 0,
            "active_services": 0,
            "banned_users": 0,
            "server_status": "خطا ⚠️",
            "db_latency": "N/A",
        }


# ============================================================
# DASHBOARD TEXT
# ============================================================

def build_admin_dashboard_text(metrics: Dict[str, Any]) -> str:
    """
    ساخت متن داشبورد مدیریت.
    """

    total_users = int(metrics.get("total_users", 0) or 0)
    pending_kyc = int(metrics.get("pending_kyc", 0) or 0)
    active_services = int(metrics.get("active_services", 0) or 0)
    banned_users = int(metrics.get("banned_users", 0) or 0)

    server_status = metrics.get(
        "server_status",
        "نامشخص ⚠️",
    )

    db_latency = metrics.get(
        "db_latency",
        "N/A",
    )

    return (
        "🚀 <b>مرکز فرماندهی مدیریت ربات</b>\n"
        "━━━━━━━━━━━━━━━━━━━━\n\n"

        "📊 <b>آمار سیستم</b>\n\n"

        f"👥 کاربران ثبت‌نامی: "
        f"<code>{total_users:,}</code> نفر\n"

        f"⏳ KYC در انتظار بررسی: "
        f"<code>{pending_kyc:,}</code> مورد\n"

        f"⚡ سرویس‌های فعال: "
        f"<code>{active_services:,}</code> مورد\n"

        f"🚫 کاربران مسدود: "
        f"<code>{banned_users:,}</code> نفر\n\n"

        "🖥 <b>وضعیت زیرساخت</b>\n\n"

        f"🛡 وضعیت سرور: <code>{server_status}</code>\n"
        f"⏱ تاخیر دیتابیس: <code>{db_latency}</code>\n\n"

        "━━━━━━━━━━━━━━━━━━━━\n"
        "👇 <b>بخش مورد نظر را انتخاب کنید:</b>"
    )


# ============================================================
# SAFE MESSAGE EDIT
# ============================================================

async def safe_edit_dashboard(
    callback: CallbackQuery,
    text: str,
) -> bool:
    """
    ویرایش امن پیام داشبورد.

    اگر پیام قبلاً همان متن را داشته باشد یا Telegram
    خطای Message is not modified بدهد، برنامه متوقف نمی‌شود.
    """

    if not callback.message:
        return False

    try:
        await callback.message.edit_text(
            text,
            reply_markup=get_admin_main_menu(),
            parse_mode="HTML",
        )
        return True

    except TelegramBadRequest as exc:
        error_text = str(exc).lower()

        if (
            "message is not modified" in error_text
            or "message can't be edited" in error_text
        ):
            return False

        raise


# ============================================================
# CALLBACK: ADMIN PANEL
# ============================================================

@router.callback_query(F.data.in_({"admin_panel", "admin_main"}))
async def admin_dashboard_callback(
    callback: CallbackQuery,
    state: FSMContext,
) -> None:
    """
    نمایش پنل مدیریت از طریق Callback.
    """

    if not callback.from_user:
        await callback.answer(
            "❌ اطلاعات کاربر دریافت نشد.",
            show_alert=True,
        )
        return

    admin_id = callback.from_user.id

    try:
        # پاکسازی Stateهای قبلی
        await state.clear()

        # بررسی دسترسی
        if not await verify_admin_access(admin_id):
            logger.warning(
                "Unauthorized admin panel callback attempt: user_id=%s",
                admin_id,
            )

            await callback.answer(
                "⛔ شما دسترسی مدیریت ندارید.",
                show_alert=True,
            )
            return

        # دریافت آمار
        metrics = await fetch_realtime_system_metrics()

        # ساخت داشبورد
        dashboard_text = build_admin_dashboard_text(metrics)

        # نمایش
        await safe_edit_dashboard(
            callback,
            dashboard_text,
        )

        await callback.answer()

        logger.info(
            "Admin dashboard opened via callback | admin_id=%s",
            admin_id,
        )

    except TelegramBadRequest as exc:
        logger.warning(
            "Telegram error while opening admin dashboard: %s",
            exc,
        )

        try:
            await callback.answer(
                "⚠️ این پیام دیگر قابل ویرایش نیست.",
                show_alert=True,
            )
        except TelegramBadRequest:
            pass

    except Exception:
        logger.exception(
            "Unexpected error in admin_dashboard_callback | admin_id=%s",
            admin_id,
        )

        try:
            await callback.answer(
                "❌ خطا در بارگذاری پنل مدیریت.",
                show_alert=True,
            )
        except TelegramBadRequest:
            pass


# ============================================================
# MESSAGE: /ADMIN
# ============================================================

@router.message(
    F.text.in_(
        {
            "/admin",
            "/panel",
            "پنل مدیریت",
            "منوی مدیریت",
            "مدیریت",
        }
    )
)
async def admin_dashboard_message(
    message: Message,
    state: FSMContext,
) -> None:
    """
    ورود به پنل مدیریت از طریق پیام متنی.
    """

    if not message.from_user:
        return

    admin_id = message.from_user.id

    try:
        # پاک کردن State قبلی
        await state.clear()

        # بررسی دسترسی
        if not await verify_admin_access(admin_id):
            logger.warning(
                "Unauthorized admin panel message attempt: user_id=%s",
                admin_id,
            )

            await message.answer(
                "⛔ <b>دسترسی غیرمجاز</b>\n\n"
                "شما اجازه ورود به پنل مدیریت را ندارید.",
                parse_mode="HTML",
            )
            return

        # دریافت Metrics
        metrics = await fetch_realtime_system_metrics()

        # ساخت متن
        dashboard_text = build_admin_dashboard_text(metrics)

        # ارسال پنل
        await message.answer(
            dashboard_text,
            reply_markup=get_admin_main_menu(),
            parse_mode="HTML",
        )

        logger.info(
            "Admin dashboard opened via message | admin_id=%s",
            admin_id,
        )

    except Exception:
        logger.exception(
            "Unexpected error in admin_dashboard_message | admin_id=%s",
            admin_id,
        )

        try:
            await message.answer(
                "❌ خطایی هنگام باز کردن پنل مدیریت رخ داد.\n"
                "لطفاً دوباره تلاش کنید.",
            )
        except Exception:
            pass

__all__ = [
    "router",
    "verify_admin_access",
    "get_configured_admin_ids",
]
