# Test SAST réel du projet Web Sentinel avec les accès d'Aurelien
import requests
import os
import json
import urllib3
from pathlib import Path

# Désactiver les avertissements SSL pour l'environnement de test
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# Configuration API avec les accès d'Aurelien
API_URL = "https://api.web-sentinel.taaazzz-prog.fr/api/v1"  # API production OVH
AURELIEN_API_KEY = "ws_sysop_CUsMkeL6jdDHXrA14rot9Vj0Yegg4KiPuYqiHMKhRC0"

# Configuration SSL (False pour test, True pour production avec certificats valides)
SSL_VERIFY = False

def scan_file_with_aurelien_access(file_path, language="python"):
    """Scanner un fichier avec les accès SYSOP d'Aurelien"""
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            content = f.read()
    except Exception as e:
        print(f"❌ Erreur lecture {file_path}: {e}")
        return None
    
    payload = {
        "code": content,
        "language": language,
        "filename": os.path.basename(file_path)
    }
    
    try:
        response = requests.post(
            f"{API_URL}/scan", 
            headers={'X-API-Key': AURELIEN_API_KEY, 'Content-Type': 'application/json'},
            json=payload,
            timeout=30,
            verify=SSL_VERIFY
        )
        
        if response.status_code == 200:
            return response.json()
        else:
            print(f"❌ Erreur scan {file_path}: {response.status_code} - {response.text}")
            return None
            
    except Exception as e:
        print(f"❌ Exception scan {file_path}: {e}")
        return None

def scan_web_sentinel_project():
    """Scanner le projet Web Sentinel complet"""
    print("=== SCAN SAST Web Sentinel avec accès Aurelien ===")
    print(f"🔑 Utilisateur: aurelien.mossini@example.com (SYSOP)")
    print(f"🌐 API: {API_URL}")
    print(f"📁 Projet: Web Sentinel")
    
    # Définir les fichiers Python principaux à scanner
    project_root = Path("d:/WEB API/web-sentinel")
    
    files_to_scan = [
        # Fichiers core
        "web_sentinel/cli.py",
        "web_sentinel/scanner.py", 
        "web_sentinel/orchestrator.py",
        "web_sentinel/model.py",
        "web_sentinel/reporting.py",
        
        # Système de licence (récemment corrigé)
        "web_sentinel/license/runtime_bridge.py",
        "web_sentinel/subscription/manager.py",
        "web_sentinel/license/backends.py",
        
        # Checks de sécurité
        "web_sentinel/checks/headers.py",
        "web_sentinel/checks/tls.py",
        "web_sentinel/checks/injection.py",
        "web_sentinel/checks/static_analysis.py",
        
        # API nouvellement créée
        "sast_api.py",
        "web_sentinel_api_production.py",
        
        # Scripts utilitaires
        "debug_api.py",
        "create_aurelien_sysop.py"
    ]
    
    total_files = 0
    total_vulnerabilities = 0
    critical_count = 0
    high_count = 0
    scan_results = []
    
    for file_path in files_to_scan:
        full_path = project_root / file_path
        
        if not full_path.exists():
            print(f"⚠️  Fichier non trouvé: {file_path}")
            continue
        
        print(f"\n🔍 Scan: {file_path}")
        result = scan_file_with_aurelien_access(full_path, "python")
        
        if result:
            total_files += 1
            findings = result.get('findings', [])
            file_vuln_count = len(findings)
            total_vulnerabilities += file_vuln_count
            
            # Compter par sévérité
            file_critical = len([f for f in findings if f.get('severity') == 'critical'])
            file_high = len([f for f in findings if f.get('severity') == 'high'])
            critical_count += file_critical
            high_count += file_high
            
            if file_vuln_count > 0:
                print(f"   📊 {file_vuln_count} vulnérabilités trouvées")
                print(f"   🚨 Critiques: {file_critical}, Hautes: {file_high}")
                
                # Afficher les plus critiques
                for finding in findings[:2]:  # Limiter à 2 pour l'affichage
                    if finding.get('severity') in ['critical', 'high']:
                        print(f"      - Ligne {finding.get('line', '?')}: {finding.get('title', 'N/A')}")
            else:
                print(f"   ✅ Aucune vulnérabilité détectée")
            
            scan_results.append({
                'file': file_path,
                'vulnerabilities': file_vuln_count,
                'critical': file_critical,
                'high': file_high,
                'scan_time': result.get('summary', {}).get('processing_time', 0)
            })
    
    # Résumé final
    print(f"\n" + "="*60)
    print(f"📋 RÉSUMÉ SCAN WEB SENTINEL")
    print(f"✅ Fichiers scannés: {total_files}")
    print(f"🔍 Total vulnérabilités: {total_vulnerabilities}")
    print(f"🚨 Critiques: {critical_count}")  
    print(f"⚠️  Hautes: {high_count}")
    print(f"🔑 Scanner par: Aurelien (SYSOP)")
    
    # Top des fichiers les plus vulnérables
    if scan_results:
        print(f"\n🔥 TOP fichiers avec vulnérabilités:")
        sorted_results = sorted(scan_results, key=lambda x: x['vulnerabilities'], reverse=True)
        for i, result in enumerate(sorted_results[:5], 1):
            if result['vulnerabilities'] > 0:
                print(f"   {i}. {result['file']}: {result['vulnerabilities']} vulnérabilités")
    
    # Test final de validation
    print(f"\n🎯 VALIDATION ACCÈS AURELIEN:")
    if total_files > 0:
        print(f"   ✅ Authentification SYSOP: OK")
        print(f"   ✅ Scan source code: OK")  
        print(f"   ✅ API SAST fonctionnelle: OK")
        print(f"   ✅ Projet Web Sentinel analysé: OK")
        return True
    else:
        print(f"   ❌ Aucun fichier scanné - problème API")
        return False

if __name__ == "__main__":
    success = scan_web_sentinel_project()
    
    if success:
        print(f"\n🎉 SUCCÈS ! Aurelien peut utiliser l'API SAST")
        print(f"🚀 Prêt pour déploiement production")
    else:
        print(f"\n❌ Problème avec l'accès API d'Aurelien")