"""
Package de modules de vérification sécurisée - Web Sentinel
==========================================================

Ce package contient tous les modules de scanning de sécurité
organisés selon les catégories OWASP Top 10 2021.

Structure des modules :
- access_control.py : OWASP A01 - Broken Access Control
- cryptographic_scanner.py : OWASP A02 - Cryptographic Failures  
- dependency_scanner.py : OWASP A06 - Vulnerable and Outdated Components
- insecure_design.py : OWASP A04 - Insecure Design
- security_misconfiguration.py : OWASP A05 - Security Misconfiguration
- authentication_scanner.py : OWASP A07 - Identification and Authentication Failures

Modules existants (intégrés) :
- injection.py : OWASP A03 - Injection (SQL, XSS, etc.)
- headers.py : Headers de sécurité
- tls.py : Configuration SSL/TLS
- static_analysis.py : Analyse statique de code
- third_party.py : Intégrations tierces

Usage :
    from web_sentinel.scanning.checks import evaluate_access_control
    findings = evaluate_access_control(scan_request)
"""

# Imports des fonctions principales de chaque module
try:
    from .access_control import evaluate_access_control
    from .cryptographic_scanner import evaluate_cryptographic_failures  
    from .dependency_scanner import evaluate_vulnerable_components
    from .insecure_design import evaluate_insecure_design
    from .security_misconfiguration import evaluate_security_misconfiguration
    from .authentication_scanner import evaluate_identification_authentication_failures
except ImportError as e:
    # En cas d'erreur d'import, définir des fonctions placeholder
    print(f"Warning: Unable to import new security modules: {e}")
    
    def evaluate_access_control(request):
        return []
    def evaluate_cryptographic_failures(request):
        return []
    def evaluate_vulnerable_components(request):
        return []
    def evaluate_insecure_design(request):
        return []
    def evaluate_security_misconfiguration(request):
        return []
    def evaluate_identification_authentication_failures(request):
        return []

# Liste de tous les évaluateurs disponibles
ALL_EVALUATORS = {
    'access_control': evaluate_access_control,
    'cryptographic_failures': evaluate_cryptographic_failures,
    'vulnerable_components': evaluate_vulnerable_components,
    'insecure_design': evaluate_insecure_design,
    'security_misconfiguration': evaluate_security_misconfiguration,
    'authentication_failures': evaluate_identification_authentication_failures
}

# Métadonnées des modules
MODULE_METADATA = {
    'access_control': {
        'name': 'Contrôle d\'Accès',
        'description': 'Détecte les défauts de contrôle d\'accès et d\'autorisation',
        'owasp_category': 'A01',
        'severity_focus': ['critical', 'high'],
        'tags': ['authorization', 'access-control', 'privilege-escalation']
    },
    'cryptographic_failures': {
        'name': 'Défaillances Cryptographiques',
        'description': 'Analyse les faiblesses cryptographiques et de chiffrement',
        'owasp_category': 'A02',
        'severity_focus': ['high', 'medium'],
        'tags': ['encryption', 'tls', 'certificates', 'crypto']
    },
    'vulnerable_components': {
        'name': 'Composants Vulnérables',
        'description': 'Identifie les bibliothèques et dépendances obsolètes',
        'owasp_category': 'A06',
        'severity_focus': ['critical', 'high'],
        'tags': ['dependencies', 'libraries', 'cve', 'outdated']
    },
    'insecure_design': {
        'name': 'Conception Non Sécurisée',
        'description': 'Évalue l\'architecture et la conception sécurisée',
        'owasp_category': 'A04',
        'severity_focus': ['medium', 'high'],
        'tags': ['architecture', 'design', 'business-logic', 'workflow']
    },
    'security_misconfiguration': {
        'name': 'Mauvaise Configuration',
        'description': 'Détecte les erreurs de configuration sécuritaire',
        'owasp_category': 'A05',
        'severity_focus': ['high', 'medium'],
        'tags': ['configuration', 'headers', 'admin-interfaces', 'debug']
    },
    'authentication_failures': {
        'name': 'Défaillances d\'Authentification',
        'description': 'Analyse les faiblesses d\'identification et d\'authentification',
        'owasp_category': 'A07', 
        'severity_focus': ['critical', 'high'],
        'tags': ['authentication', 'session', 'mfa', 'brute-force']
    }
}

def get_evaluator_by_name(name: str):
    """
    Récupère un évaluateur par son nom.
    
    Args:
        name: Nom du module (ex: 'access_control')
        
    Returns:
        Function: Fonction d'évaluation du module
        
    Raises:
        KeyError: Si le module n'existe pas
    """
    if name not in ALL_EVALUATORS:
        available = ', '.join(ALL_EVALUATORS.keys())
        raise KeyError(f"Module '{name}' non trouvé. Disponibles: {available}")
    
    return ALL_EVALUATORS[name]

def get_evaluators_by_owasp_category(category: str):
    """
    Récupère tous les évaluateurs d'une catégorie OWASP.
    
    Args:
        category: Catégorie OWASP (ex: 'A01', 'A02')
        
    Returns:
        Dict[str, Function]: Dictionnaire nom -> fonction d'évaluation
    """
    result = {}
    for name, metadata in MODULE_METADATA.items():
        if metadata['owasp_category'] == category:
            result[name] = ALL_EVALUATORS[name]
    
    return result

def get_evaluators_by_tags(tags: list):
    """
    Récupère tous les évaluateurs ayant au moins un des tags spécifiés.
    
    Args:
        tags: Liste de tags à rechercher
        
    Returns:
        Dict[str, Function]: Dictionnaire nom -> fonction d'évaluation
    """
    result = {}
    for name, metadata in MODULE_METADATA.items():
        if any(tag in metadata['tags'] for tag in tags):
            result[name] = ALL_EVALUATORS[name]
    
    return result

def list_all_modules():
    """
    Liste tous les modules disponibles avec leurs métadonnées.
    
    Returns:
        Dict: Dictionnaire complet des modules et métadonnées
    """
    return MODULE_METADATA.copy()
