"""New member onboarding and rules acceptance flows."""

from __future__ import annotations

from telegram import ChatPermissions, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.error import BadRequest, Forbidden

from bot import db


async def process_captcha(message, context, settings, user) -> bool:
    if settings.get("captcha_enabled", "false").lower() != "true":
        return False

    cap = await db.get_captcha(message.chat.id, user.id)

    if not cap:
        return False

    if message.text and message.text.strip() == cap["answer"]:
        try:
            await context.bot.restrict_chat_member(
                message.chat.id,
                user.id,
                permissions=ChatPermissions(
                    can_send_messages=True,
                    can_send_audios=True,
                    can_send_documents=True,
                    can_send_photos=True,
                    can_send_videos=True,
                    can_send_video_notes=True,
                    can_send_voice_notes=True,
                    can_send_polls=True,
                    can_send_other_messages=True,
                    can_add_web_page_previews=True,
                    can_change_info=False,
                    can_invite_users=True,
                    can_pin_messages=False,
                    can_manage_topics=False,
                    is_member=True,
                ),
            )
        except (BadRequest, Forbidden):
            return True

        await db.pop_captcha(message.chat.id, user.id)

        try:
            await context.bot.delete_message(message.chat.id, cap["message_id"])
        except (BadRequest, Forbidden):
            pass

        await maybe_send_rules(message, settings, user)
        return True

    try:
        await message.delete()
    except (BadRequest, Forbidden):
        pass

    return True


async def maybe_send_rules(message, settings, user) -> None:
    if settings.get("rules_accept_enabled", "false").lower() != "true":
        return

    has_accepted = await db.has_accepted_rules(message.chat.id, user.id)

    if has_accepted:
        return

    rules_text = settings.get("rules", "")

    if not rules_text:
        return

    keyboard = InlineKeyboardMarkup(
        [[InlineKeyboardButton("✅ قوانین رو قبول کردم", callback_data=f"rulesaccept_{message.chat.id}_{user.id}")]]
    )

    try:
        await message.reply_text(
            f"👋 {user.first_name} عزیز، خوش اومدی!\n\n📜 لطفاً قوانین گروه رو مطالعه کن و برای شروع فعالیت، دکمه زیر رو بزن:\n\n━━━━━━━━━━━━━━\n{rules_text}\n━━━━━━━━━━━━━━",
            reply_markup=keyboard,
        )
    except (BadRequest, Forbidden):
        pass
