import telebot
from telebot.types import Message, InlineKeyboardMarkup, InlineKeyboardButton
from app.bot.keyboards.main_menu import get_main_menu
from app import Subscriptions, db
from app.bot.constants import UserStates
from app.bot.keyboards.settings_menu import get_settings_menu
from app.bot.utils.auth import auth
from app.bot.utils.tg_audit import log_user_event


def register_handlers(bot, app, state_manager):
    @bot.message_handler(commands=['notification_mode'])
    @bot.message_handler(func=lambda message: message.text == 'Режим уведомлений')
    def handle_notification_mode_button(message: Message):
        username = f"{message.from_user.username}" if message.from_user.username else "N/A"
        chat_id = message.chat.id
        with app.app_context():
            if not auth(chat_id, app):
                bot.send_message(chat_id, "❌ Вы не авторизованы для использования этого бота.")
                telebot.logger.warning(f"Неавторизованный пользователь {chat_id} @{username}")
                state_manager.set_state(chat_id, UserStates.REGISTRATION)
                return
        # Отправляем клавиатуру выбора режима уведомлений
        markup = InlineKeyboardMarkup()
        markup.add(InlineKeyboardButton(text="⛔️ Критические события", callback_data="notification_mode_disaster"))
        markup.add(InlineKeyboardButton(text="⚠️ Все события", callback_data="notification_mode_all"))

        bot.send_message(chat_id,
                                 'Выберите уровень событий мониторинга, уведомление о которых хотите получать:\n'
                                 '1.⛔️<b>Критические события</b> (приоритет "DISASTER") - события, являющиеся потенциальными авариями и требующие оперативного решения.\n'
                                 'В Zabbix обязательно имеют тег "CALL" для оперативного привлечения инженеров к устранению.\n\n'
                                 '2.⚠️<b>Все события (По умолчанию)</b> - критические события, а также события Zabbix высокого ("HIGH") приоритета, '
                                 'имеющие потенциально значительное влияние на сервис и требующее устранение в плановом порядке.',
                                 reply_markup=markup, parse_mode="HTML")

def register_callback_notification(bot, app, state_manager):
    @bot.callback_query_handler(func=lambda call: call.data.startswith("notification_mode_"))
    def handle_notification_switch_callback(call):
        chat_id = call.message.chat.id
        message_id = call.message.message_id
        mode = call.data.split("_")[2]
        username = f"@{call.from_user.username}" if call.from_user.username else "N/A"

        bot.delete_message(chat_id, message_id)

        # Обновляем режим уведомлений
        disaster_only = True if mode == "disaster" else False

        with app.app_context():
            if not auth(chat_id, app):
                bot.send_message(chat_id, "❌ Вы не авторизованы для использования этого бота.")
                telebot.logger.warning(f"Неавторизованный пользователь {chat_id} @{username}")
                state_manager.set_state(chat_id, UserStates.REGISTRATION)
                return
            try:
                all_subscriptions = Subscriptions.query.filter_by(chat_id=chat_id).all()
                for subscription in all_subscriptions:
                    subscription.disaster_only = disaster_only
                db.session.commit()

                mode_text_emoji = "⛔️ Критические события" if disaster_only else "⚠️ Все события"
                mode_text = "Критические события" if disaster_only else "Все события"
                bot.send_message(chat_id, f"✅ Режим уведомлений успешно изменён на:\n {mode_text_emoji}",reply_markup=get_settings_menu())
                log_user_event(chat_id, app, username, f"Режим уведомлений изменился на: {mode_text}")
                state_manager.set_state(chat_id, UserStates.SETTINGS_MENU)

            except Exception as e:
                telebot.logger.error(e)
                bot.send_message(chat_id, f"❌ Произошла ошибка при изменении режима уведомлений.", reply_markup=get_main_menu())



