"""
Configuration globale pour RPA Vision V2
Contient tous les paramètres pour les modèles, seuils, performance et sécurité
"""

import os
from pathlib import Path

# Répertoire racine du projet
PROJECT_ROOT = Path(__file__).parent.parent

CONFIG = {
    # Configuration des modèles IA
    "models": {
        # Modèle de vision pour détection d'éléments UI
        # Options: "owl-v2", "dino", "yolo"
        "vision": "owl-v2",
        
        # Modèle LLM pour raisonnement visuel
        "llm": "gemma3:12b",  # Changé de qwen3-vl:8b à gemma3:12b (pas de thinking mode)
        
        # Modèle OpenCLIP pour embeddings visuels
        "clip": "ViT-B-32",
        
        # Chemins des modèles
        "paths": {
            "openclip": str(PROJECT_ROOT / "models" / "openclip"),
            "owl_v2": str(PROJECT_ROOT / "models" / "owl_v2"),
            "qwen_vl": str(PROJECT_ROOT / "models" / "qwen2.5_vl"),
        }
    },
    
    # Seuils pour transitions de mode et confiance
    "thresholds": {
        # Nombre minimum d'observations avant passage en Autopilot
        "autopilot_observations": 20,
        
        # Taux de concordance minimum pour passage en Autopilot (95%)
        "autopilot_concordance": 0.95,
        
        # Score de confiance minimum pour maintenir le mode Autopilot (90%)
        "confidence_min": 0.90,
        
        # Seuil de confiance pour rollback vers mode Assisté (85%)
        "rollback_confidence": 0.85,
        
        # Seuil de concordance pour rollback vers mode Assisté (85%)
        "rollback_concordance": 0.85,
        
        # Seuil de similarité d'embedding pour détection de changement UI (70%)
        "ui_change_threshold": 0.70,
        
        # Delta maximum en pixels avant déclenchement de ré-entraînement
        "max_pixel_delta": 10,
    },
    
    # Pondérations pour calcul du score de confiance
    "confidence_weights": {
        "vision": 0.6,      # 60% - Confiance du modèle de vision
        "llm": 0.3,         # 30% - Score du raisonnement LLM
        "history": 0.1,     # 10% - Performance historique de la tâche
    },
    
    # Paramètres de performance
    "performance": {
        # Latence maximale observation-vers-suggestion (ms)
        "max_latency_ms": 400,
        
        # Taux de correction maximum acceptable (3%)
        "max_correction_rate": 0.03,
        
        # Nombre d'exécutions récentes pour calcul de concordance
        "concordance_window": 10,
        
        # Nombre d'exécutions pour calcul du taux de correction
        "correction_window": 20,
        
        # Timeout pour opérations de rollback (secondes)
        "rollback_timeout_s": 5,
    },
    
    # Configuration de sécurité
    "security": {
        # Algorithme de chiffrement pour les logs
        "encryption_algorithm": "AES-256-CBC",
        
        # Durée de rétention des logs (jours)
        "log_retention_days": 90,
        
        # Fréquence de rotation des clés de chiffrement (jours)
        "key_rotation_days": 90,
        
        # Liste blanche par défaut (vide - doit être configurée par l'utilisateur)
        "default_whitelist": [],
        
        # Activer la vérification de liste blanche
        # True: Seules les fenêtres autorisées sont observées (sécurisé)
        # False: Toutes les fenêtres sont observées (mode permissif)
        "enforce_whitelist": False,  # Changé à False pour plus de flexibilité
        
        # Demander confirmation avant d'observer une nouvelle fenêtre (si enforce_whitelist=False)
        "ask_before_new_window": True,
    },
    
    # Configuration Ollama
    "ollama": {
        "host": "localhost:11434",
        "timeout": 30,  # secondes
    },
    
    # Configuration FAISS
    "faiss": {
        # Dimension des embeddings OpenCLIP
        "embedding_dim": 512,
        
        # Type d'index FAISS ("Flat" pour petit dataset, "IVF" pour grand)
        "index_type": "Flat",
        
        # Nombre de clusters pour index IVF (si utilisé)
        "n_clusters": 100,
        
        # Nombre de voisins à retourner lors de la recherche
        "k_neighbors": 5,
    },
    
    # Chemins des données
    "data_paths": {
        "user_profiles": str(PROJECT_ROOT / "data" / "user_profiles"),
        "logs": str(PROJECT_ROOT / "data" / "logs"),
        "faiss_index": str(PROJECT_ROOT / "data" / "faiss_index"),
        "encryption_keys": str(PROJECT_ROOT / "data" / ".keys"),
    },
    
    # Configuration GUI
    "gui": {
        # Icônes pour les modes
        "mode_icons": {
            "shadow": "👀",
            "assist": "🤝",
            "auto": "🤖",
        },
        
        # Durée d'affichage des notifications (secondes)
        "notification_timeout": 5,
        
        # Raccourcis clavier
        "shortcuts": {
            "accept": "Return",      # Entrée
            "reject": "Escape",      # Échap
            "correct": "Alt+C",      # Alt+C
            "emergency_stop": "Ctrl+Pause",  # Ctrl+Pause
        },
    },
    
    # Configuration du logger
    "logging": {
        "level": "INFO",
        "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
        "max_file_size_mb": 100,
        "backup_count": 5,
    },
    
    # Configuration UI Element Detection (Phase 1-3)
    "ui_detection": {
        # Mode de détection: "light", "enriched", "complete"
        # - light: Structures de données seulement (pas de détection)
        # - enriched: Détection d'éléments UI activée
        # - complete: Détection + embeddings multi-modaux + matching amélioré
        "mode": "light",  # Démarrer en mode light par défaut
        
        # Activer la détection automatique d'éléments
        "enabled": True,
        
        # Détecter les éléments à chaque capture d'écran
        "detect_on_capture": False,  # False = détection manuelle uniquement
        
        # Utiliser le VLM pour la détection (coûteux)
        "vlm_enabled": False,
        
        # Configuration du détecteur
        "detector": {
            "use_text_detection": True,
            "use_rectangle_detection": True,
            "use_vlm_detection": False,
            "vlm_on_new_screens": False,
        },
    },
    
    # Configuration Multi-Modal Embedding (Phase 3)
    "multimodal_embedding": {
        # Activer les embeddings multi-modaux
        "enabled": False,  # Activé automatiquement en mode "complete"
        
        # Dimension des embeddings
        "embedding_dim": 512,
        
        # Méthode de fusion
        "fusion_method": "weighted_average",
        
        # Poids de fusion des modalités
        "weights": {
            "image": 0.5,    # Screenshot complet
            "text": 0.3,     # Texte détecté
            "title": 0.1,    # Titre de fenêtre
            "ui": 0.1,       # Éléments UI
            "context": 0.0,  # Contexte workflow (à implémenter)
        },
    },
    
    # Configuration Enhanced Workflow Matcher (Phase 3)
    "enhanced_matcher": {
        # Activer le matcher amélioré
        "enabled": True,
        
        # Poids pour le scoring composite
        "screen_weight": 0.6,      # Poids de la similarité d'écran
        "elements_weight": 0.4,    # Poids de la similarité d'éléments
        
        # Seuils de matching
        "min_similarity_threshold": 0.3,
        "min_confidence_threshold": 0.5,
        
        # Nombre maximum de candidats à évaluer
        "max_candidates": 10,
    },
}


def get_config():
    """Retourne la configuration globale"""
    return CONFIG


def get_model_config():
    """Retourne la configuration des modèles"""
    return CONFIG["models"]


def get_thresholds():
    """Retourne les seuils de confiance et transitions"""
    return CONFIG["thresholds"]


def get_performance_config():
    """Retourne la configuration de performance"""
    return CONFIG["performance"]


def get_security_config():
    """Retourne la configuration de sécurité"""
    return CONFIG["security"]


def get_data_paths():
    """Retourne les chemins des données"""
    return CONFIG["data_paths"]


def ensure_directories():
    """Crée tous les répertoires nécessaires s'ils n'existent pas"""
    paths = get_data_paths()
    for path in paths.values():
        os.makedirs(path, exist_ok=True)
    
    # Créer aussi les répertoires de modèles
    model_paths = CONFIG["models"]["paths"]
    for path in model_paths.values():
        os.makedirs(path, exist_ok=True)


if __name__ == "__main__":
    # Test de la configuration
    print("Configuration RPA Vision V2")
    print("=" * 50)
    print(f"Répertoire racine: {PROJECT_ROOT}")
    print(f"\nModèles:")
    for key, value in CONFIG["models"].items():
        if key != "paths":
            print(f"  {key}: {value}")
    print(f"\nSeuils:")
    for key, value in CONFIG["thresholds"].items():
        print(f"  {key}: {value}")
    print(f"\nPerformance:")
    for key, value in CONFIG["performance"].items():
        print(f"  {key}: {value}")
    print(f"\nSécurité:")
    for key, value in CONFIG["security"].items():
        if key != "default_whitelist":
            print(f"  {key}: {value}")
