#!/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 check_api_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Обработчик команды /checkapi для диагностики проблем с API"""
    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("⏳ Проверка доступных API Synology NAS...")
    
    from src.api.api_discovery import discover_available_apis
    from src.config.config import (
        SYNOLOGY_HOST,
        SYNOLOGY_PORT,
        SYNOLOGY_SECURE,
        SYNOLOGY_POWER_API,
        SYNOLOGY_INFO_API,
        SYNOLOGY_API_VERSION
    )
    
    # Формируем базовый URL
    protocol = "https" if SYNOLOGY_SECURE else "http"
    base_url = f"{protocol}://{SYNOLOGY_HOST}:{SYNOLOGY_PORT}/webapi"
    
    # Получаем список доступных API
    apis = discover_available_apis(base_url)
    
    if not apis:
        await message.edit_text(
            "❌ <b>Не удалось получить список доступных API</b>\n\n"
            "Проверьте доступность NAS и сетевое подключение.",
            parse_mode="HTML"
        )
        return
        
    # Поиск API для управления питанием
    power_apis = [name for name in apis.keys() if "power" in name.lower()]
    system_info_apis = [name for name in apis.keys() if ("system" in name.lower() or "dsm" in name.lower()) and "info" in name.lower()]
    reboot_apis = [name for name in apis.keys() if any(word in name.lower() for word in ["restart", "reboot", "power"])]
    
    # Формируем рекомендации
    recommended_power_api = max(power_apis, key=lambda x: apis[x].get('maxVersion', 1)) if power_apis else "SYNO.Core.System"
    recommended_info_api = max(system_info_apis, key=lambda x: apis[x].get('maxVersion', 1)) if system_info_apis else "SYNO.DSM.Info"
    
    # Формируем текст отчета
    api_report = (
        f"✅ <b>Найдено {len(apis)} доступных API</b>\n\n"
        f"<b>API для управления питанием:</b>\n"
        f"{', '.join(power_apis[:5]) or 'Не найдены'}\n\n"
        f"<b>API для информации о системе:</b>\n"
        f"{', '.join(system_info_apis[:5]) or 'Не найдены'}\n\n"
        f"<b>API для перезагрузки:</b>\n"
        f"{', '.join(reboot_apis[:5]) or 'Не найдены'}\n\n"
        f"<b>Рекомендуемые настройки:</b>\n"
        f"Power API: {recommended_power_api}\n"
        f"Info API: {recommended_info_api}\n\n"
        f"<b>Текущие настройки в конфигурации:</b>\n"
        f"SYNOLOGY_POWER_API = {SYNOLOGY_POWER_API}\n"
        f"SYNOLOGY_INFO_API = {SYNOLOGY_INFO_API}\n"
        f"SYNOLOGY_API_VERSION = {SYNOLOGY_API_VERSION}"
    )
    
    await message.edit_text(api_report, parse_mode="HTML")

async def storage_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Обработчик команды /storage"""
    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("⏳ Получение информации о хранилище...")
    
    if not synology_api.is_online():
        await message.edit_text("❌ <b>Synology NAS оффлайн</b>\n\nНевозможно получить информацию о хранилище.", parse_mode="HTML")
        return
    
    try:
        storage_info = synology_api.get_storage_status()
        
        if not storage_info:
            await message.edit_text("❌ <b>Ошибка получения информации о хранилище</b>\n\nВозможно, API не поддерживает эту функцию или требуются дополнительные права доступа.", parse_mode="HTML")
            return
    except Exception as e:
        await message.edit_text(f"❌ <b>Ошибка получения информации о хранилище</b>\n\nПричина: {str(e)}", parse_mode="HTML")
        return
    
    # Формируем сообщение о состоянии хранилища
    total_size_gb = storage_info.get("total_size", 0) / (1024**3)
    total_used_gb = storage_info.get("total_used", 0) / (1024**3)
    usage_percent = (total_used_gb / total_size_gb * 100) if total_size_gb > 0 else 0
    
    reply_text = f"📊 <b>Информация о хранилище Synology NAS</b>\n\n"
    reply_text += f"<b>Общий размер:</b> {total_size_gb:.2f} ГБ\n"
    reply_text += f"<b>Использовано:</b> {total_used_gb:.2f} ГБ ({usage_percent:.1f}%)\n"
    reply_text += f"<b>Свободно:</b> {total_size_gb - total_used_gb:.2f} ГБ\n\n"
    
    # Добавляем информацию о томах
    volumes = storage_info.get("volumes", [])
    if volumes:
        reply_text += "<b>Тома:</b>\n"
        for volume in volumes:
            name = volume.get("name", "Неизвестно")
            status = volume.get("status", "Неизвестно")
            size_gb = volume.get("total_size", 0) / (1024**3)
            used_gb = volume.get("used_size", 0) / (1024**3)
            percent = volume.get("percent_used", 0)
            
            reply_text += f"• <b>{name}</b> ({status})\n"
            reply_text += f"  └ {used_gb:.1f} ГБ из {size_gb:.1f} ГБ ({percent}%)\n"
    
    # Добавляем информацию о дисках
    disks = storage_info.get("disks", [])
    if disks:
        reply_text += "\n<b>Диски:</b>\n"
        for disk in disks:
            name = disk.get("name", "Неизвестно")
            model = disk.get("model", "Неизвестно")
            status = disk.get("status", "Неизвестно")
            temp = disk.get("temp", "?")
            
            reply_text += f"• <b>{name}</b> - {model}\n"
            reply_text += f"  └ Статус: {status}, Температура: {temp}°C\n"
    
    await message.edit_text(reply_text, parse_mode="HTML")

async def shares_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Обработчик команды /shares"""
    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("⏳ Получение информации об общих папках...")
    
    if not synology_api.is_online():
        await message.edit_text("❌ <b>Synology NAS оффлайн</b>\n\nНевозможно получить информацию об общих папках.", parse_mode="HTML")
        return
    
    try:
        shares = synology_api.get_shared_folders()
        
        if not shares:
            await message.edit_text("❌ <b>Ошибка получения информации об общих папках</b>\n\nВозможно, API не поддерживает эту функцию или требуются дополнительные права доступа.", parse_mode="HTML")
            return
    except Exception as e:
        await message.edit_text(f"❌ <b>Ошибка получения информации об общих папках</b>\n\nПричина: {str(e)}", parse_mode="HTML")
        return
    
    # Формируем сообщение об общих папках
    reply_text = f"📁 <b>Общие папки Synology NAS</b>\n\n"
    
    for share in shares:
        name = share.get("name", "Неизвестно")
        path = share.get("path", "Неизвестно")
        desc = share.get("desc", "")
        
        reply_text += f"• <b>{name}</b>\n"
        reply_text += f"  └ Путь: {path}\n"
        
        if desc:
            reply_text += f"  └ Описание: {desc}\n"
    
    await message.edit_text(reply_text, parse_mode="HTML")

async def system_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Обработчик команды /system"""
    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("⏳ Получение информации о системе...")
    
    if not synology_api.is_online():
        await message.edit_text("❌ <b>Synology NAS оффлайн</b>\n\nНевозможно получить информацию о системе.", parse_mode="HTML")
        return
    
    try:
        system_status = synology_api.get_system_status()
        
        if not system_status:
            await message.edit_text("❌ <b>Ошибка получения информации о системе</b>", parse_mode="HTML")
            return
            
        # Если получен статус с ошибкой
        if system_status.get("status") == "error":
            error_code = system_status.get("error_code", "неизвестно")
            await message.edit_text(f"❌ <b>Ошибка получения информации о системе</b>\n\nКод ошибки API: {error_code}", parse_mode="HTML")
            return
    except Exception as e:
        await message.edit_text(f"❌ <b>Ошибка получения информации о системе</b>\n\nПричина: {str(e)}", parse_mode="HTML")
        return
    
    # Формируем сообщение о состоянии системы
    model = system_status.get("model", "Неизвестно")
    version = system_status.get("version", "Неизвестно")
    serial = system_status.get("serial", "Неизвестно")
    uptime_seconds = system_status.get("uptime", 0)
    temperature = system_status.get("temperature", "?")
    
    # Преобразование времени работы в удобочитаемый формат
    days, remainder = divmod(uptime_seconds, 86400)
    hours, remainder = divmod(remainder, 3600)
    minutes, seconds = divmod(remainder, 60)
    uptime_str = f"{days}д {hours}ч {minutes}м {seconds}с"
    
    reply_text = f"🖥️ <b>Информация о системе Synology NAS</b>\n\n"
    reply_text += f"<b>Модель:</b> {model}\n"
    reply_text += f"<b>Серийный номер:</b> {serial}\n"
    reply_text += f"<b>Версия DSM:</b> {version}\n"
    reply_text += f"<b>Время работы:</b> {uptime_str}\n"
    reply_text += f"<b>Температура:</b> {temperature}°C\n\n"
    
    # Добавляем информацию о CPU и памяти
    memory = system_status.get("memory", {})
    total_memory_gb = memory.get("total_mb", 0) / 1024
    available_memory_gb = memory.get("available_mb", 0) / 1024
    memory_usage = memory.get("usage_percent", 0)
    cpu_usage = system_status.get("cpu_usage", 0)
    
    reply_text += f"<b>Загрузка CPU:</b> {cpu_usage}%\n"
    reply_text += f"<b>Память:</b> {total_memory_gb:.1f} ГБ (используется {memory_usage}%)\n"
    reply_text += f"<b>Доступно памяти:</b> {available_memory_gb:.1f} ГБ\n\n"
    
    # Добавляем информацию о сетевых интерфейсах
    network_info = system_status.get("network", [])
    if network_info:
        reply_text += "<b>Сетевые интерфейсы:</b>\n"
        for interface in network_info:
            device = interface.get("device", "Неизвестно")
            ip = interface.get("ip", "Неизвестно")
            mac = interface.get("mac", "Неизвестно")
            
            reply_text += f"• <b>{device}</b>\n"
            reply_text += f"  └ IP: {ip}, MAC: {mac}\n"
    
    await message.edit_text(reply_text, parse_mode="HTML")

async def load_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Обработчик команды /load"""
    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("⏳ Получение информации о нагрузке системы...")
    
    if not synology_api.is_online():
        await message.edit_text("❌ <b>Synology NAS оффлайн</b>\n\nНевозможно получить информацию о нагрузке системы.", parse_mode="HTML")
        return
    
    try:
        system_load = synology_api.get_system_load()
        
        if not system_load:
            await message.edit_text("❌ <b>Ошибка получения информации о нагрузке системы</b>\n\nВозможно, API не поддерживает эту функцию или требуются дополнительные права доступа.", parse_mode="HTML")
            return
    except Exception as e:
        await message.edit_text(f"❌ <b>Ошибка получения информации о нагрузке системы</b>\n\nПричина: {str(e)}", parse_mode="HTML")
        return
    
    # Формируем сообщение о нагрузке системы
    cpu_load = system_load.get("cpu_load", 0)
    memory = system_load.get("memory", {})
    memory_usage = memory.get("usage_percent", 0)
    
    reply_text = f"📈 <b>Текущая нагрузка Synology NAS</b>\n\n"
    reply_text += f"<b>Загрузка CPU:</b> {cpu_load}%\n"
    reply_text += f"<b>Загрузка памяти:</b> {memory_usage}%\n\n"
    
    # Добавляем информацию о сетевой активности
    network = system_load.get("network", {})
    if network:
        reply_text += "<b>Сетевая активность:</b>\n"
        for device, stats in network.items():
            rx = int(stats.get("rx_bytes", 0)) / (1024**2)  # МБ
            tx = int(stats.get("tx_bytes", 0)) / (1024**2)  # МБ
            
            reply_text += f"• <b>{device}</b>\n"
            reply_text += f"  └ Получено: {rx:.1f} МБ, Отправлено: {tx:.1f} МБ\n"
    
    await message.edit_text(reply_text, parse_mode="HTML")

async def security_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Обработчик команды /security"""
    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("⏳ Получение информации о безопасности...")
    
    if not synology_api.is_online():
        await message.edit_text("❌ <b>Synology NAS оффлайн</b>\n\nНевозможно получить информацию о безопасности.", parse_mode="HTML")
        return
    
    try:
        security_info = synology_api.get_security_status()
        
        if not security_info.get("success", False):
            await message.edit_text("❌ <b>Ошибка получения информации о безопасности</b>\n\nВозможно, API не поддерживает эту функцию или требуются дополнительные права доступа.", parse_mode="HTML")
            return
    except Exception as e:
        await message.edit_text(f"❌ <b>Ошибка получения информации о безопасности</b>\n\nПричина: {str(e)}", parse_mode="HTML")
        return
    
    # Формируем сообщение о безопасности
    status = security_info.get("status", "unknown")
    is_secure = security_info.get("is_secure", False)
    last_check = security_info.get("last_check", "Неизвестно")
    
    status_emoji = "✅" if is_secure else "⚠️"
    status_text = "Безопасно" if is_secure else "Требуется внимание"
    
    reply_text = f"🔐 <b>Статус безопасности Synology NAS</b>\n\n"
    reply_text += f"<b>Статус:</b> {status_emoji} {status_text}\n"
    reply_text += f"<b>Подробности:</b> {status}\n"
    reply_text += f"<b>Последняя проверка:</b> {last_check}\n"
    
    await message.edit_text(reply_text, parse_mode="HTML")
