# Test SAST sécurisé pour l'environnement de production
import requests
import os
import json
import ssl
import certifi
from pathlib import Path

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

# Configuration SSL sécurisée pour la production
SSL_VERIFY = True  # Utilise les certificats du système
CERT_PATH = certifi.where()  # Utilise le bundle CA de certifi

def scan_file_secure(file_path, language="python"):
    """Scanner un fichier avec vérification SSL complète"""
    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)
    }
    
    # Session sécurisée avec vérification SSL
    session = requests.Session()
    session.verify = CERT_PATH
    
    # Configuration SSL stricte avec adapter HTTP
    adapter = requests.adapters.HTTPAdapter(
        max_retries=requests.adapters.Retry(
            total=3,
            backoff_factor=0.3,
            status_forcelist=[500, 502, 503, 504]
        )
    )
    session.mount('https://', adapter)
    
    try:
        response = session.post(
            f"{API_URL}/scan", 
            headers={
                'X-API-Key': AURELIEN_API_KEY, 
                'Content-Type': 'application/json',
                'User-Agent': 'WebSentinel-SAST/1.0'
            },
            json=payload,
            timeout=30
        )
        
        if response.status_code == 200:
            return response.json()
        else:
            print(f"❌ Erreur scan {file_path}: {response.status_code} - {response.text}")
            return None
            
    except requests.exceptions.SSLError as e:
        print(f"❌ Erreur SSL {file_path}: {e}")
        print("💡 Vérifiez que le certificat de l'API est valide et à jour")
        return None
    except Exception as e:
        print(f"❌ Exception scan {file_path}: {e}")
        return None
    finally:
        session.close()

def test_ssl_configuration():
    """Tester la configuration SSL de l'API"""
    print("🔒 Test de la configuration SSL...")
    
    try:
        response = requests.get(f"{API_URL}/health", verify=SSL_VERIFY, timeout=10)
        if response.status_code == 200:
            print("✅ Configuration SSL valide")
            return True
        else:
            print(f"⚠️ Réponse inattendue: {response.status_code}")
            return False
    except requests.exceptions.SSLError as e:
        print(f"❌ Erreur SSL: {e}")
        print("💡 Suggestions:")
        print("   - Vérifier que le certificat est valide et non expiré")
        print("   - Mettre à jour le bundle CA avec: pip install --upgrade certifi")
        print("   - Vérifier la configuration du serveur")
        return False
    except Exception as e:
        print(f"❌ Erreur connexion: {e}")
        return False

def scan_web_sentinel_secure():
    """Scanner le projet avec vérification SSL complète"""
    print("=== SCAN SAST SÉCURISÉ - Web Sentinel ===")
    print(f"🔑 Utilisateur: aurelien.mossini@example.com (SYSOP)")
    print(f"🌐 API: {API_URL}")
    print(f"🔒 SSL Verify: {SSL_VERIFY}")
    print(f"📁 Projet: Web Sentinel")
    print()
    
    # Test préliminaire SSL
    if not test_ssl_configuration():
        print("❌ Échec du test SSL - Arrêt du scan")
        return
    
    # Fichiers à scanner (échantillon pour le test)
    project_root = Path("d:/WEB API/web-sentinel")
    
    test_files = [
        "web_sentinel/cli.py",
        "web_sentinel/scanner.py", 
        "sast_api.py"
    ]
    
    total_files = 0
    total_vulnerabilities = 0
    
    for file_path in test_files:
        full_path = project_root / file_path
        
        if not full_path.exists():
            print(f"⚠️  Fichier non trouvé: {file_path}")
            continue
        
        print(f"\n🔍 Scan sécurisé: {file_path}")
        result = scan_file_secure(full_path, "python")
        
        if result:
            total_files += 1
            vulnerabilities = result.get('vulnerabilities', [])
            vuln_count = len(vulnerabilities)
            total_vulnerabilities += vuln_count
            
            if vuln_count == 0:
                print("   ✅ Aucune vulnérabilité détectée")
            else:
                print(f"   ⚠️  {vuln_count} vulnérabilité(s) trouvée(s)")
                for vuln in vulnerabilities[:3]:  # Afficher max 3
                    print(f"      - {vuln.get('severity', 'Unknown')}: {vuln.get('title', 'No title')}")
    
    print(f"\n{'='*60}")
    print(f"📋 RÉSUMÉ SCAN SÉCURISÉ")
    print(f"✅ Fichiers scannés: {total_files}")
    print(f"🔍 Total vulnérabilités: {total_vulnerabilities}")
    print(f"🔒 SSL vérifié: OUI")
    print(f"🚀 Mode production: OK")

if __name__ == "__main__":
    scan_web_sentinel_secure()