#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Обработчики команд для телеграм-бота
"""

import logging
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import ContextTypes

from src.config.config import ADMIN_USER_IDS
from src.api.synology import SynologyAPI

logger = logging.getLogger(__name__)

# Инициализация API Synology
synology_api = SynologyAPI()

async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Обработчик команды /start"""
    user_id = update.effective_user.id
    
    if user_id not in ADMIN_USER_IDS:
        await update.message.reply_text("У вас нет доступа к этому боту.")
        logger.warning(f"Unauthorized access attempt from user ID: {user_id}")
        return
        
    await update.message.reply_text(
        f"Привет, {update.effective_user.first_name}! 👋\n\n"
        "Я бот для управления вашим Synology NAS.\n"
        "Используйте следующие команды:\n\n"
        "<b>Основные команды:</b>\n"
        "/status - Проверка статуса NAS\n"
        "/power - Управление питанием NAS\n"
        "/system - Информация о системе\n"
        "/storage - Информация о хранилище\n\n"
        "Используйте /help для получения полного списка команд",
        parse_mode="HTML"
    )

async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Обработчик команды /help"""
    user_id = update.effective_user.id
    
    if user_id not in ADMIN_USER_IDS:
        await update.message.reply_text("У вас нет доступа к этому боту.")
        return
        
    await update.message.reply_text(
        "📖 <b>Помощь по использованию бота</b>\n\n"
        "<b>Основные команды:</b>\n"
        "/start - Начало работы с ботом\n"
        "/status - Проверка текущего статуса NAS\n"
        "/power - Управление питанием NAS\n"
        "/help - Вывод этой справки\n\n"
        "<b>Расширенные команды:</b>\n"
        "/system - Подробная информация о системе\n"
        "/storage - Информация о хранилище и дисках\n"
        "/shares - Список общих папок\n"
        "/load - Текущая нагрузка на систему\n"
        "/security - Статус безопасности системы\n\n"
        "<b>Управление питанием:</b>\n"
        "• Включение NAS: Wake-on-LAN\n"
        "• Выключение NAS: Безопасное завершение работы\n"
        "• Перезагрузка: Безопасная перезагрузка\n\n"
        "<b>Примечание:</b> Для работы функции включения необходимо, "
        "чтобы на NAS была настроена функция Wake-on-LAN.",
        parse_mode="HTML"
    )

async def status_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Обработчик команды /status"""
    user_id = update.effective_user.id
    
    if user_id not in ADMIN_USER_IDS:
        await update.message.reply_text("У вас нет доступа к этому боту.")
        return
    
    message = await update.message.reply_text("⏳ Проверяю статус Synology NAS...")
    
    is_online = synology_api.is_online()
    
    if is_online:
        # Если NAS включен, попробуем получить дополнительную информацию
        system_info = synology_api.get_system_status()
        
        if system_info and system_info.get("status") != "error":
            model = system_info.get("model", "Неизвестная модель")
            version = system_info.get("version_string", system_info.get("version", "Неизвестная версия"))
            uptime_seconds = system_info.get("up_time", system_info.get("uptime", 0))
            
            # Преобразование времени работы в удобочитаемый формат
            days, remainder = divmod(int(uptime_seconds), 86400)
            hours, remainder = divmod(remainder, 3600)
            minutes, seconds = divmod(remainder, 60)
            uptime_str = f"{days}д {hours}ч {minutes}м {seconds}с"
            
            await message.edit_text(
                f"✅ <b>Synology NAS онлайн</b>\n\n"
                f"<b>Модель:</b> {model}\n"
                f"<b>Версия DSM:</b> {version}\n"
                f"<b>Время работы:</b> {uptime_str}",
                parse_mode="HTML"
            )
        else:
            # Обработка возможной ошибки API
            error_info = ""
            if system_info and system_info.get("status") == "error":
                error_code = system_info.get("error_code", "неизвестно")
                error_info = f"\n<i>Код ошибки API: {error_code}</i>"
            
            await message.edit_text(
                f"✅ <b>Synology NAS онлайн</b>\n\n"
                f"Детальная информация недоступна. Возможно, необходимо авторизоваться."
                f"{error_info}",
                parse_mode="HTML"
            )
    else:
        await message.edit_text("❌ <b>Synology NAS оффлайн</b>", parse_mode="HTML")

async def power_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Обработчик команды /power"""
    user_id = update.effective_user.id
    
    if user_id not in ADMIN_USER_IDS:
        await update.message.reply_text("У вас нет доступа к этому боту.")
        return
    
    is_online = synology_api.is_online()
    
    keyboard = []
    
    # Кнопка включения
    if not is_online:
        keyboard.append([InlineKeyboardButton("🟢 Включить", callback_data="power_on")])
    else:
        keyboard.append([InlineKeyboardButton("🟢 Включить (уже включено)", callback_data="power_on_no_op")])
        
    # Кнопка выключения
    if is_online:
        keyboard.append([InlineKeyboardButton("🔴 Выключить", callback_data="power_off")])
    else:
        keyboard.append([InlineKeyboardButton("🔴 Выключить (уже выключено)", callback_data="power_off_no_op")])
        
    # Кнопка перезагрузки
    if is_online:
        keyboard.append([InlineKeyboardButton("🔄 Перезагрузить", callback_data="reboot")])
    else:
        keyboard.append([InlineKeyboardButton("🔄 Перезагрузить (недоступно)", callback_data="reboot_no_op")])
        
    # Кнопка отмены
    keyboard.append([InlineKeyboardButton("❌ Отмена", callback_data="cancel")])
    
    reply_markup = InlineKeyboardMarkup(keyboard)
    
    status_text = "✅ Онлайн" if is_online else "❌ Оффлайн"
    
    await update.message.reply_text(
        f"<b>Управление питанием Synology NAS</b>\n\n"
        f"<b>Текущий статус:</b> {status_text}\n\n"
        f"Выберите действие:",
        reply_markup=reply_markup,
        parse_mode="HTML"
    )

async def power_callback(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Обработчик callback-запросов для кнопок управления питанием"""
    query = update.callback_query
    await query.answer()
    
    user_id = query.from_user.id
    if user_id not in ADMIN_USER_IDS:
        return
    
    action = query.data
    
    if action == "cancel":
        await query.edit_message_text("❌ Действие отменено")
        return
    
    if action == "power_on":
        await query.edit_message_text("⏳ Отправка сигнала включения Synology NAS...")
        
        if await context.application.create_task(
            handle_power_on(query.message.chat_id, context)
        ):
            # Функция вернула True, успешное включение
            pass
        else:
            # Функция вернула False, ошибка включения
            await context.bot.send_message(
                chat_id=query.message.chat_id,
                text="❌ Ошибка при включении Synology NAS. Проверьте настройки Wake-on-LAN."
            )
            
    elif action == "power_off":
        await query.edit_message_text("⏳ Отправка команды выключения Synology NAS...")
        
        if await context.application.create_task(
            handle_power_off(query.message.chat_id, context)
        ):
            # Функция вернула True, успешное выключение
            pass
        else:
            # Функция вернула False, ошибка выключения
            await context.bot.send_message(
                chat_id=query.message.chat_id,
                text="❌ Ошибка при выключении Synology NAS. Проверьте соединение и учетные данные."
            )
            
    elif action == "reboot":
        await query.edit_message_text("⏳ Отправка команды перезагрузки Synology NAS...")
        
        if await context.application.create_task(
            handle_reboot(query.message.chat_id, context)
        ):
            # Функция вернула True, успешная перезагрузка
            pass
        else:
            # Функция вернула False, ошибка перезагрузки
            await context.bot.send_message(
                chat_id=query.message.chat_id,
                text="❌ Ошибка при перезагрузке Synology NAS. Проверьте соединение и учетные данные."
            )

async def handle_power_on(chat_id: int, context: ContextTypes.DEFAULT_TYPE) -> bool:
    """Асинхронная функция для включения NAS"""
    try:
        # Отправка запроса на включение
        success = synology_api.power_on()
        
        if success:
            await context.bot.send_message(
                chat_id=chat_id,
                text="✅ Synology NAS успешно включен и доступен"
            )
            return True
        else:
            return False
    except Exception as e:
        logger.error(f"Error during power on: {str(e)}")
        return False

async def handle_power_off(chat_id: int, context: ContextTypes.DEFAULT_TYPE) -> bool:
    """Асинхронная функция для выключения NAS"""
    try:
        # Отправка запроса на выключение
        success = synology_api.power_off()
        
        if success:
            await context.bot.send_message(
                chat_id=chat_id,
                text="✅ Команда выключения успешно отправлена. Synology NAS выключается..."
            )
            return True
        else:
            return False
    except Exception as e:
        logger.error(f"Error during power off: {str(e)}")
        return False

async def handle_reboot(chat_id: int, context: ContextTypes.DEFAULT_TYPE) -> bool:
    """Асинхронная функция для перезагрузки NAS"""
    try:
        # Отправка запроса на перезагрузку
        success = synology_api.reboot_system()
        
        if success:
            await context.bot.send_message(
                chat_id=chat_id,
                text="✅ Команда перезагрузки успешно отправлена. Synology NAS перезагружается..."
            )
            
            # Ждем некоторое время перед проверкой статуса
            await context.bot.send_message(
                chat_id=chat_id,
                text="⏳ Ожидание перезагрузки системы..."
            )
            
            # Создаем задачу для ожидания загрузки
            wait_successful = synology_api.wait_for_boot()
            
            if wait_successful:
                await context.bot.send_message(
                    chat_id=chat_id,
                    text="✅ Synology NAS успешно перезагружен и снова онлайн"
                )
            else:
                await context.bot.send_message(
                    chat_id=chat_id,
                    text="⚠️ Превышено время ожидания перезагрузки. Проверьте статус вручную."
                )
            
            return True
        else:
            return False
    except Exception as e:
        logger.error(f"Error during reboot: {str(e)}")
        return False
