from telebot.types import Message, InlineKeyboardMarkup, InlineKeyboardButton, MessageID
from app.bot.keyboards.settings_menu import get_settings_menu
from app.extensions.db import db
from app import Regions, Subscriptions
from app.bot.utils.tg_audit import log_user_event
from app.bot.constants import UserStates


def process_subscription_button(message: Message, app, bot, chat_id: int, state_manager, bot_message: MessageID):
    parts = [part.strip() for part in message.text.split(',')]
    if not parts or not all(part.isdigit() for part in parts):
        markup = InlineKeyboardMarkup()
        markup.add(InlineKeyboardButton(text="Отмена", callback_data="cancel_input"))

        bot.send_message(chat_id,
                         "❌ Неверный ввод, введите число(а) через запятую, либо нажмите отмена.",
                         reply_markup=markup)

        def delayed_handler(msg):
            process_subscription_button(msg, app, bot, chat_id, state_manager)

        bot.register_next_step_handler(message, delayed_handler)
        return
    bot.delete_message(chat_id, bot_message)
    region_ids = [int(part) for part in parts]

    try:
        with app.app_context():
            valid_region_ids = [r.region_id for r in Regions.query.filter(Regions.active == True).all()]

            subbed_regions = []
            invalid_regions = []

            for region_id in region_ids:
                if region_id not in valid_region_ids:
                    invalid_regions.append(str(region_id))
                    continue

                subscription = Subscriptions.query.filter_by(chat_id=chat_id, region_id=region_id).first()

                if subscription:
                    if not subscription.active:
                        subscription.active = True
                        db.session.add(subscription)
                    subbed_regions.append(str(region_id))
                else:
                    new_sub = Subscriptions(chat_id=chat_id, region_id=region_id, active=True)
                    db.session.add(new_sub)
                    subbed_regions.append(str(region_id))

            db.session.commit()

    except Exception as e:
        bot.send_message(chat_id, "⚠️ Произошла ошибка при обработке запроса. Попробуйте позже.")
        return

    if invalid_regions:
        bot.send_message(chat_id,
                         f"⚠️ Регион с ID {', '.join(invalid_regions)} не существует. Введите корректные номера или 'отмена'.")
        # Можно не менять состояние, чтобы пользователь мог повторить ввод
        # И снова ждём ввод:
        bot.register_next_step_handler(message, process_subscription_button, bot, chat_id, state_manager)
        return

    if subbed_regions:

        username = f"{message.from_user.username}" if message.from_user.username else "N/A"
        log_user_event(chat_id, app, username, f"Подписался на регионы: {', '.join(subbed_regions)}")

    # Сбрасываем состояние, чтобы не продолжать ждать ввод
    state_manager.set_state(chat_id, UserStates.SETTINGS_MENU)

    # Показываем меню
    bot.send_message(chat_id, f"✅ Подписка на регионы: {', '.join(subbed_regions)} оформлена.", reply_markup=get_settings_menu())

