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

"""
Модуль для обнаружения доступных API Synology NAS
"""

import logging
import requests
import urllib3
from typing import Dict, Any, List, Optional

# Отключение предупреждений о небезопасных SSL-соединениях
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

logger = logging.getLogger(__name__)

def discover_available_apis(base_url: str, timeout=(10, 20), verify=False) -> Dict[str, Any]:
    """
    Получение списка доступных API на Synology NAS
    
    Args:
        base_url: базовый URL для API (например, 'http://192.168.0.100:5000/webapi')
        timeout: таймаут для запроса
        verify: проверять ли SSL-сертификат
        
    Returns:
        Словарь с информацией о доступных API
    """
    logger.info("Discovering available Synology APIs")
    
    try:
        # Делаем базовый запрос для получения всех доступных API
        api_info_url = f"{base_url}/entry.cgi"
        api_info_params = {
            "api": "SYNO.API.Info",
            "version": "1",
            "method": "query",
            "query": "all"
        }
        
        response = requests.get(
            api_info_url,
            params=api_info_params,
            timeout=timeout,
            verify=verify
        )
        
        if response.status_code == 200:
            data = response.json()
            if data.get("success"):
                apis = data.get("data", {})
                logger.info(f"Discovered {len(apis)} APIs")
                
                # Выводим список найденных API
                api_list = list(apis.keys())
                logger.debug(f"Available APIs: {', '.join(api_list[:10])}... and {len(api_list) - 10} more")
                
                # Группируем API по категориям
                power_apis = [api for api in api_list if "power" in api.lower()]
                system_apis = [api for api in api_list if "system" in api.lower()]
                info_apis = [api for api in api_list if "info" in api.lower()]
                
                logger.info(f"Power related APIs: {power_apis}")
                logger.info(f"System related APIs: {system_apis[:10]}")
                logger.info(f"Info related APIs: {info_apis[:10]}")
                
                return apis
            else:
                error_code = data.get("error", {}).get("code", -1)
                logger.error(f"Failed to discover APIs. Error code: {error_code}")
                return {}
        else:
            logger.error(f"API discovery request failed with HTTP status: {response.status_code}")
            return {}
    except Exception as e:
        logger.error(f"Error during API discovery: {str(e)}")
        return {}
        
def find_compatible_api(apis: Dict[str, Any], api_category: str, method: str) -> List[Dict[str, Any]]:
    """
    Поиск совместимых API заданной категории
    
    Args:
        apis: словарь с доступными API
        api_category: категория API (например, 'system', 'power', 'info')
        method: искомый метод API
        
    Returns:
        Список подходящих API с версиями
    """
    compatible_apis = []
    
    for api_name, api_info in apis.items():
        if api_category.lower() in api_name.lower():
            compatible_apis.append({
                "name": api_name,
                "path": api_info.get("path", "entry.cgi"),
                "min_version": api_info.get("minVersion", 1),
                "max_version": api_info.get("maxVersion", 1),
                "method": method,
                "version": api_info.get("maxVersion", 1)  # Используем максимальную версию по умолчанию
            })
            
    # Сортируем по приоритету
    compatible_apis.sort(key=lambda x: (
        # Приоритет по точности совпадения категории
        0 if api_category.upper() in x["name"] else 1,
        # Приоритет по версии (от большей к меньшей)
        -x["max_version"]
    ))
    
    return compatible_apis
