"""
Classe de base pour tous les plugins de monitoring
"""
from abc import ABC, abstractmethod
from typing import Optional, List, Dict, Any


class BasePlugin(ABC):
    """Classe abstraite définissant l'interface des plugins"""
    
    def __init__(self, config: dict):
        """
        Initialise le plugin avec sa configuration
        
        Args:
            config: Configuration du plugin (host, port, etc.)
        """
        self.host = config.get('host', '127.0.0.1')
        self.port = config.get('port', self.get_default_port())
        self.config = config
    
    @abstractmethod
    def get_id(self) -> str:
        """Retourne l'identifiant unique du plugin"""
        pass
    
    @abstractmethod
    def get_name(self) -> str:
        """Retourne le nom affichable du plugin"""
        pass
    
    @abstractmethod
    def get_default_port(self) -> int:
        """Retourne le port par défaut"""
        pass
    
    @abstractmethod
    def test_connection(self) -> Dict[str, Any]:
        """
        Teste la connexion au logiciel de monitoring
        
        Returns:
            dict avec 'success' (bool), 'message' (str), et optionnellement 'version'
        """
        pass
    
    @abstractmethod
    def get_data(self) -> Optional[dict]:
        """
        Récupère les données brutes du logiciel de monitoring
        
        Returns:
            Données brutes ou None si erreur
        """
        pass
    
    @abstractmethod
    def get_hierarchy(self) -> List[dict]:
        """
        Récupère la hiérarchie des capteurs (pour l'admin)
        
        Returns:
            Liste de hardware avec leurs capteurs
        """
        pass
    
    @abstractmethod
    def parse_sensors(self, data: dict) -> List[dict]:
        """
        Parse les données brutes en liste standardisée de capteurs
        
        Args:
            data: Données brutes du logiciel
            
        Returns:
            Liste de capteurs au format standardisé:
            [
                {
                    'id': str,           # Identifiant unique
                    'name': str,         # Nom du capteur
                    'value': str,        # Valeur formatée (ex: "45 °C")
                    'raw_value': float,  # Valeur numérique
                    'type': str,         # Type (temperature, load, voltage, etc.)
                    'unit': str,         # Unité (°C, %, MHz, etc.)
                    'hardware': str,     # Nom du hardware parent
                    'hardware_type': str # Type de hardware (CPU, GPU, etc.)
                },
                ...
            ]
        """
        pass
    
    def get_base_url(self) -> str:
        """Retourne l'URL de base pour les requêtes"""
        return f"http://{self.host}:{self.port}"
    
    def get_sensor_type(self, unit: str, name: str = '') -> str:
        """
        Détermine le type de capteur à partir de l'unité et du nom
        
        Args:
            unit: Unité du capteur
            name: Nom du capteur (pour affiner la détection)
            
        Returns:
            Type standardisé du capteur
        """
        unit_lower = unit.lower() if unit else ''
        name_lower = name.lower() if name else ''
        
        # Détection par unité
        if '°c' in unit_lower or '°f' in unit_lower:
            return 'temperature'
        elif '%' in unit_lower:
            if 'load' in name_lower or 'usage' in name_lower:
                return 'load'
            return 'percentage'
        elif 'mhz' in unit_lower or 'ghz' in unit_lower:
            return 'frequency'
        elif 'rpm' in unit_lower:
            return 'fan'
        elif 'w' in unit_lower and 'wh' not in unit_lower:
            return 'power'
        elif 'v' in unit_lower and 'mv' not in unit_lower:
            return 'voltage'
        elif 'mv' in unit_lower:
            return 'voltage'
        elif 'mb' in unit_lower or 'gb' in unit_lower or 'kb' in unit_lower:
            return 'data'
        elif 'mb/s' in unit_lower or 'kb/s' in unit_lower or 'gb/s' in unit_lower:
            return 'throughput'
        elif 'a' in unit_lower:
            return 'current'
        elif 'wh' in unit_lower:
            return 'energy'
        
        # Détection par nom si unité non reconnue
        if 'temp' in name_lower or 'temperature' in name_lower:
            return 'temperature'
        elif 'fan' in name_lower:
            return 'fan'
        elif 'clock' in name_lower or 'freq' in name_lower:
            return 'frequency'
        elif 'load' in name_lower or 'usage' in name_lower:
            return 'load'
        elif 'power' in name_lower:
            return 'power'
        elif 'voltage' in name_lower or 'vcore' in name_lower:
            return 'voltage'
        
        return 'generic'
