"""General settings: feature flags, timezone and link template."""

from __future__ import annotations

from zoneinfo import ZoneInfo, ZoneInfoNotFoundError

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 back_cancel, settings_menu
from app.states import SettingsState
from app.utils.validation import validate_link_template

router = Router(name="settings")

_BOOL_KEYS = {
    "protect_content",
    "auto_ingest_enabled",
    "publish_enabled",
    "membership_enabled",
    "use_media_thumbnail_as_cover",
    "auto_delete_enabled",
}

_LABELS = {
    "protect_content": "محافظت از محتوا",
    "auto_ingest_enabled": "دریافت خودکار از گروه‌های منبع",
    "publish_enabled": "انتشار خودکار/زمان‌بندی‌شده",
    "membership_enabled": "عضویت اجباری",
    "use_media_thumbnail_as_cover": "استفاده از تامبنیل ویدیو به‌عنوان کاور",
    "auto_delete_enabled": "حذف خودکار",
}


async def _settings_home(callback: CallbackQuery, ctx: AppContext) -> None:
    lines = ["⚙️ تنظیمات عمومی\n"]
    for key, label in _LABELS.items():
        value = await ctx.app_settings.get_bool(key, False)
        lines.append(f"• {label}: {'روشن' if value else 'خاموش'}")
    lines.append(f"• منطقه زمانی: {await ctx.app_settings.timezone()}")
    lines.append(f"• قالب لینک: {await ctx.app_settings.get('video_link_template')}")
    lines.append(
        "\nتوجه: protect_content یک محدودیت نرم است و از ذخیره‌سازی یا بازنشر توسط کاربر "
        "به‌طور کامل جلوگیری نمی‌کند. Telegram Bot API محدودیت‌های خود را دارد."
    )
    await show(callback, "\n".join(lines), settings_menu())


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


@router.callback_query(F.data.startswith("settings:toggle:"))
async def settings_toggle(callback: CallbackQuery, ctx: AppContext) -> None:
    key = callback.data.rsplit(":", 1)[1]
    if key not in _BOOL_KEYS:
        await callback.answer("تنظیم نامعتبر است.", show_alert=True)
        return
    current = await ctx.app_settings.get_bool(key, False)
    await ctx.app_settings.set(key, not current, actor_id=callback.from_user.id)
    await ctx.repos.audit.log(
        callback.from_user.id,
        "settings.toggle",
        entity_type="app_setting",
        entity_id=key,
        details={"enabled": not current},
    )
    await callback.answer("ذخیره شد.")
    await _settings_home(callback, ctx)


@router.callback_query(F.data == "settings:timezone")
async def settings_timezone(callback: CallbackQuery, state: FSMContext) -> None:
    await state.set_state(SettingsState.waiting_value)
    await state.update_data(setting_key="timezone")
    await show(
        callback,
        "منطقه زمانی IANA را بفرستید. مثال: Asia/Tehran یا UTC.",
        back_cancel("menu:settings"),
    )
    await callback.answer()


@router.callback_query(F.data == "settings:link_template")
async def settings_link_template(callback: CallbackQuery, state: FSMContext) -> None:
    await state.set_state(SettingsState.waiting_value)
    await state.update_data(setting_key="video_link_template")
    await show(
        callback,
        "قالب لینک را بفرستید. باید شامل {token} باشد؛ {bot_username} اختیاری است.\n"
        "پیش‌فرض: https://t.me/{bot_username}?start={token}",
        back_cancel("menu:settings"),
    )
    await callback.answer()


@router.message(SettingsState.waiting_value)
async def settings_value(message: Message, state: FSMContext, ctx: AppContext) -> None:
    if not message.text:
        await message.answer("مقدار متنی بفرستید.")
        return
    data = await state.get_data()
    key = data.get("setting_key")
    value = message.text.strip()
    if key == "timezone":
        try:
            ZoneInfo(value)
        except ZoneInfoNotFoundError:
            await message.answer("⚠️ منطقه زمانی معتبر نیست. مثال: Asia/Tehran")
            return
        await ctx.app_settings.set("timezone", value, actor_id=message.from_user.id)
        ctx.settings.timezone = value
    elif key == "video_link_template":
        try:
            value = validate_link_template(value)
        except Exception as exc:
            await message.answer(f"⚠️ {exc}")
            return
        await ctx.app_settings.set(key, value, actor_id=message.from_user.id)
    else:
        await state.clear()
        await message.answer("تنظیم نامعتبر است.")
        return
    await ctx.repos.audit.log(
        message.from_user.id,
        "settings.value_update",
        entity_type="app_setting",
        entity_id=key,
    )
    await state.clear()
    await message.answer("✅ ذخیره شد.", reply_markup=back_cancel("menu:settings"))
