#!/usr/bin/env python3
"""
Web Sentinel Client Simple - Version minimale pour test
À utiliser avec le proxy local ou directement avec l'API
"""

import requests
import json
import sys
import os
from pathlib import Path

# Configuration
PROXY_URL = "http://localhost:8765"  # Serveur proxy local
API_URL = "https://api.web-sentinel.taaazzz-prog.fr"  # API Production
API_KEY = os.getenv('WEB_SENTINEL_API_KEY', 'demo-key-for-testing')

def scan_file_via_proxy(file_path: str):
    """Scanner via le proxy local (recommandé)."""
    try:
        # Test si le proxy local est disponible
        health_response = requests.get(f"{PROXY_URL}/health", timeout=2)
        if health_response.status_code == 200:
            print("🔗 Utilisation du proxy local Web Sentinel")
            
            # Scanner le fichier via le proxy
            response = requests.post(f"{PROXY_URL}/scan/file", 
                                   json={"file_path": file_path},
                                   timeout=30)
            
            if response.status_code == 200:
                return response.json()
            else:
                print(f"❌ Erreur proxy: {response.status_code}")
                return None
                
    except requests.ConnectionError:
        print("⚠️  Proxy local non disponible, essai API directe...")
        return None

def scan_file_via_api(file_path: str):
    """Scanner directement via l'API (fallback)."""
    try:
        content = Path(file_path).read_text(encoding='utf-8')
        
        payload = {
            'source_content': content,
            'file_path': file_path,
            'language': detect_language(file_path),
            'api_key': API_KEY,
            'options': {
                'severity_min': 'medium',
                'detailed_report': True
            }
        }
        
        print("🌐 Connexion directe à l'API Web Sentinel")
        response = requests.post(f"{API_URL}/api/v1/scan-source", 
                               json=payload,
                               headers={'User-Agent': 'Web-Sentinel-Client/1.0'},
                               timeout=30)
        
        if response.status_code == 200:
            # Adapter le format de l'API au format attendu
            data = response.json()
            return {
                'status': 'success',
                'findings': [
                    {
                        'rule_id': f.get('check'),
                        'message': f.get('title'),
                        'description': f.get('description'), 
                        'severity': f.get('severity'),
                        'line': f.get('line', 1),
                        'fix_suggestion': f.get('remediation')
                    } for f in data.get('findings', [])
                ]
            }
        else:
            print(f"❌ Erreur API: {response.status_code}")
            return None
            
    except Exception as e:
        print(f"❌ Erreur: {e}")
        return None

def detect_language(file_path: str) -> str:
    """Détecter le langage du fichier."""
    ext = Path(file_path).suffix.lower()
    mapping = {
        '.php': 'php',
        '.js': 'javascript',
        '.ts': 'javascript',
        '.py': 'python', 
        '.java': 'java',
        '.cs': 'csharp',
        '.go': 'go'
    }
    return mapping.get(ext, 'auto')

def display_results(result: dict):
    """Afficher les résultats."""
    if not result or result.get('status') != 'success':
        print("❌ Erreur lors du scan")
        return
    
    findings = result.get('findings', [])
    
    if not findings:
        print("✅ Aucun problème de sécurité détecté!")
        return
    
    print(f"\n🚨 {len(findings)} problème(s) détecté(s):\n")
    
    # Couleurs pour les niveaux de sévérité
    severity_symbols = {
        'critical': '🔴',
        'high': '🟠', 
        'medium': '🟡',
        'low': '🔵',
        'info': '⚪'
    }
    
    for i, finding in enumerate(findings, 1):
        severity = finding.get('severity', 'unknown')
        symbol = severity_symbols.get(severity, '❓')
        
        print(f"{i}. {symbol} {severity.upper()}: {finding.get('message', 'Unknown issue')}")
        print(f"   📄 {finding.get('description', 'No description')}")
        
        if finding.get('line'):
            print(f"   📍 Ligne {finding['line']}")
        
        if finding.get('fix_suggestion'):
            print(f"   💡 {finding['fix_suggestion']}")
        
        print()

def main():
    """Point d'entrée principal."""
    if len(sys.argv) != 2:
        print("Usage: python web_sentinel_client.py <file_path>")
        print("Exemple: python web_sentinel_client.py src/index.php")
        sys.exit(1)
    
    file_path = sys.argv[1]
    
    if not Path(file_path).exists():
        print(f"❌ Fichier non trouvé: {file_path}")
        sys.exit(1)
    
    print(f"🔍 Analyse de sécurité: {file_path}")
    
    # Essayer d'abord le proxy local, puis l'API directe
    result = scan_file_via_proxy(file_path)
    if not result:
        result = scan_file_via_api(file_path)
    
    if result:
        display_results(result)
    else:
        print("❌ Échec du scan")
        sys.exit(1)

if __name__ == "__main__":
    main()