"""
Gestionnaire de données pour les GUI
Centralise l'accès aux configurations et variables d'environnement
"""

import os
import json
from pathlib import Path
from typing import Dict, Any, List, Optional


class DataManager:
    """
    Gère les données de configuration et d'environnement pour les GUI.
    Utilise des variables d'environnement avec fallback sur fichier de config.
    """
    
    def __init__(self):
        self.config_dir = Path.home() / ".web-sentinel"
        self.config_file = self.config_dir / "gui-config.json"
        self.config: Dict[str, Any] = {}
        self._ensure_config_dir()
        self._load_config()
    
    def _ensure_config_dir(self):
        """Crée le dossier de configuration s'il n'existe pas."""
        self.config_dir.mkdir(parents=True, exist_ok=True)
    
    def _load_config(self):
        """Charge la configuration depuis le fichier."""
        if self.config_file.exists():
            try:
                with open(self.config_file, 'r', encoding='utf-8') as f:
                    self.config = json.load(f)
            except Exception as e:
                print(f"⚠️ Erreur chargement config: {e}")
                self.config = {}
        else:
            self.config = {}
    
    def save_config(self):
        """Sauvegarde la configuration dans le fichier."""
        try:
            with open(self.config_file, 'w', encoding='utf-8') as f:
                json.dump(self.config, f, indent=2, ensure_ascii=False)
        except Exception as e:
            print(f"⚠️ Erreur sauvegarde config: {e}")
    
    # ===== THÈME GUI =====
    
    def get_gui_theme(self) -> str:
        """
        Récupère le thème GUI sélectionné.
        Ordre de priorité: ENV > Config > Default
        """
        return os.getenv("WS_GUI_THEME", self.config.get("gui_theme", "classic"))
    
    def set_gui_theme(self, theme: str):
        """Définit le thème GUI."""
        self.config["gui_theme"] = theme
        self.save_config()
    
    # ===== LANGUE =====
    
    def get_language(self) -> str:
        """Récupère la langue de l'interface."""
        return os.getenv("WS_LANGUAGE", self.config.get("language", "fr"))
    
    def set_language(self, lang: str):
        """Définit la langue de l'interface."""
        self.config["language"] = lang
        self.save_config()
    
    # ===== DOMAINES =====
    
    def get_domains(self) -> List[str]:
        """Récupère la liste des domaines."""
        # Depuis variable d'environnement
        env_domains = os.getenv("WS_DOMAINS", "")
        if env_domains:
            return [d.strip() for d in env_domains.split(",") if d.strip()]
        
        # Depuis config
        return self.config.get("domains", [])
    
    def set_domains(self, domains: List[str]):
        """Définit la liste des domaines."""
        self.config["domains"] = domains
        self.save_config()
    
    def add_domain(self, domain: str):
        """Ajoute un domaine à la liste."""
        domains = self.get_domains()
        if domain not in domains:
            domains.append(domain)
            self.set_domains(domains)
    
    # ===== OPTIONS DE SCAN =====
    
    def get_timeout(self) -> float:
        """Récupère le timeout des requêtes."""
        timeout_str = os.getenv("WS_TIMEOUT", "")
        if timeout_str:
            try:
                return float(timeout_str)
            except ValueError:
                pass
        return self.config.get("timeout", 5.0)
    
    def set_timeout(self, timeout: float):
        """Définit le timeout des requêtes."""
        self.config["timeout"] = timeout
        self.save_config()
    
    def get_allow_invasive(self) -> bool:
        """Vérifie si les tests invasifs sont autorisés."""
        env_val = os.getenv("WS_ALLOW_INVASIVE", "")
        if env_val:
            return env_val.lower() in ("1", "true", "yes", "oui")
        return self.config.get("allow_invasive", False)
    
    def set_allow_invasive(self, allow: bool):
        """Définit l'autorisation des tests invasifs."""
        self.config["allow_invasive"] = allow
        self.save_config()
    
    # ===== MODULES =====
    
    def get_enabled_modules(self) -> List[str]:
        """Récupère la liste des modules activés."""
        # Depuis variable d'environnement
        env_modules = os.getenv("WS_MODULES", "")
        if env_modules:
            return [m.strip() for m in env_modules.split(",") if m.strip()]
        
        # Depuis config ou défaut
        return self.config.get("modules", [
            "tls", "headers", "static-analysis", "injection",
            "access-control", "crypto-failures", "vulnerable-components"
        ])
    
    def set_enabled_modules(self, modules: List[str]):
        """Définit la liste des modules activés."""
        self.config["modules"] = modules
        self.save_config()
    
    # ===== API / STRIPE =====
    
    def get_api_url(self) -> str:
        """Récupère l'URL de l'API."""
        return os.getenv("WS_API_URL", "http://localhost:5000")
    
    def get_stripe_public_key(self) -> Optional[str]:
        """Récupère la clé publique Stripe."""
        return os.getenv("WS_STRIPE_PUBLIC_KEY", None)
    
    # ===== HISTORIQUE =====
    
    def get_history_enabled(self) -> bool:
        """Vérifie si l'historique est activé."""
        env_val = os.getenv("WS_HISTORY_ENABLED", "")
        if env_val:
            return env_val.lower() in ("1", "true", "yes", "oui")
        return self.config.get("history_enabled", True)
    
    def set_history_enabled(self, enabled: bool):
        """Active/désactive l'historique."""
        self.config["history_enabled"] = enabled
        self.save_config()
    
    # ===== DERNIÈRE UTILISATION =====
    
    def get_last_scan_date(self) -> Optional[str]:
        """Récupère la date du dernier scan."""
        return self.config.get("last_scan_date", None)
    
    def set_last_scan_date(self, date: str):
        """Définit la date du dernier scan."""
        self.config["last_scan_date"] = date
        self.save_config()
    
    # ===== DIMENSIONS FENÊTRE =====
    
    def get_window_geometry(self) -> Optional[str]:
        """Récupère la géométrie de la fenêtre."""
        return self.config.get("window_geometry", None)
    
    def set_window_geometry(self, geometry: str):
        """Sauvegarde la géométrie de la fenêtre."""
        self.config["window_geometry"] = geometry
        self.save_config()
    
    # ===== UTILITAIRES =====
    
    def get(self, key: str, default: Any = None) -> Any:
        """Récupère une valeur de configuration personnalisée."""
        return self.config.get(key, default)
    
    def set(self, key: str, value: Any):
        """Définit une valeur de configuration personnalisée."""
        self.config[key] = value
        self.save_config()
    
    def reset(self):
        """Réinitialise la configuration."""
        self.config = {}
        self.save_config()


# Instance singleton
_data_manager: Optional[DataManager] = None


def get_data_manager() -> DataManager:
    """Récupère l'instance singleton du DataManager."""
    global _data_manager
    if _data_manager is None:
        _data_manager = DataManager()
    return _data_manager
