"""Test the localization system."""

import pytest
from web_sentinel.gui.i18n import LocalizationManager
from web_sentinel.model import Finding


class TestLocalizationManager:
    """Test the LocalizationManager class."""
    
    def test_initialization(self):
        """Test LocalizationManager initialization."""
        loc = LocalizationManager()
        assert loc.get_current_language() == "fr"  # Default language
        assert "fr" in loc.translations
        assert "en" in loc.translations
    
    def test_language_switching(self):
        """Test switching between languages."""
        loc = LocalizationManager()
        
        # Start with French
        assert loc.get_current_language() == "fr"
        
        # Switch to English
        loc.set_language("en")
        assert loc.get_current_language() == "en"
        
        # Switch back to French
        loc.set_language("fr") 
        assert loc.get_current_language() == "fr"
    
    def test_basic_translation(self):
        """Test basic translation functionality."""
        loc = LocalizationManager()
        
        # Test in French (default)
        assert loc.t("app_title") == "Web Sentinel - Scanner de Sécurité"
        
        # Test in English
        loc.set_language("en")
        assert loc.t("app_title") == "Web Sentinel - Security Scanner"
    
    def test_translation_with_fallback(self):
        """Test translation fallback for missing keys."""
        loc = LocalizationManager()
        
        # Non-existent key should return the key itself
        assert loc.t("non_existent_key") == "non_existent_key"
    
    def test_severity_translation(self):
        """Test severity translation."""
        loc = LocalizationManager()
        
        # Force French language
        loc.set_language("fr")
        
        # Test in French
        assert loc.translate_severity("critical") == "CRITIQUE"
        assert loc.translate_severity("high") == "ÉLEVÉ"
        assert loc.translate_severity("medium") == "MOYEN"
        assert loc.translate_severity("low") == "FAIBLE"
        assert loc.translate_severity("info") == "INFO"
        
        # Test in English
        loc.set_language("en")
        assert loc.translate_severity("critical") == "CRITICAL"
        assert loc.translate_severity("high") == "HIGH"
        assert loc.translate_severity("medium") == "MEDIUM"
        assert loc.translate_severity("low") == "LOW"
        assert loc.translate_severity("info") == "INFO"
    
    def test_module_translation(self):
        """Test module name translation."""
        loc = LocalizationManager()
        
        # Force French language
        loc.set_language("fr")
        
        # Test in French
        assert loc.translate_module("tls") == "TLS/SSL"
        assert loc.translate_module("headers") == "En-têtes HTTP"
        assert loc.translate_module("injection") == "Tests d'injection"
        
        # Test in English
        loc.set_language("en")
        assert loc.translate_module("tls") == "TLS/SSL"
        assert loc.translate_module("headers") == "HTTP Headers"
        assert loc.translate_module("injection") == "Injection Tests"

    def test_sast_interface_keys_present(self):
        """Ensure newly introduced SAST/localization keys exist for both languages."""
        loc = LocalizationManager()
        for key in ["sast_info_limits", "sast_info_generic", "sast_info_disabled"]:
            assert key in loc.translations["fr"], f"Missing French translation for {key}"
            assert key in loc.translations["en"], f"Missing English translation for {key}"


class TestFindingTranslation:
    """Test the finding content translation system."""
    
    def test_ssl_certificate_expired_translation(self):
        """Test translation of SSL certificate expired finding."""
        loc = LocalizationManager()
        
        # Create a typical SSL expired finding in French
        finding = Finding(
            check="tls",
            title="Certificat SSL expiré",
            severity="critical",
            description="Le certificat SSL de ce domaine a expiré.",
            remediation="Renouveler le certificat SSL immédiatement."
        )
        
        # Test French translation (should be detected and improved)
        loc.set_language("fr")
        translated = loc.translate_finding_content(finding)
        assert translated.title == "Certificat SSL expiré"
        assert "certificat ssl" in translated.description.lower()
        
        # Test English translation
        loc.set_language("en") 
        translated = loc.translate_finding_content(finding)
        assert translated.title == "SSL certificate expired"
        assert "ssl certificate" in translated.description.lower()
        assert "renew ssl certificate" in translated.remediation.lower()
    
    def test_ssl_certificate_expiring_translation(self):
        """Test translation of SSL certificate expiring soon finding."""
        loc = LocalizationManager()
        
        # Create SSL expiring finding
        finding = Finding(
            check="tls",
            title="Le certificat SSL expire dans 5 jours",
            severity="medium",
            description="Le certificat SSL de ce domaine expirera bientôt.",
            remediation="Mettre en place l'auto-renouvellement du certificat."
        )
        
        # Test English translation
        loc.set_language("en")
        translated = loc.translate_finding_content(finding)
        assert translated.title == "SSL certificate expires in 5 days"
        assert "expire soon" in translated.description.lower()
        assert "automatic certificate renewal" in translated.remediation.lower()
    
    def test_security_header_missing_translation(self):
        """Test translation of missing security header finding."""
        loc = LocalizationManager()
        
        # Create security header finding
        finding = Finding(
            check="headers",
            title="En-tête de sécurité manquant: Strict-Transport-Security",
            severity="medium",
            description="L'en-tête Strict-Transport-Security est manquant.",
            remediation="Ajouter l'en-tête HSTS avec une politique appropriée."
        )
        
        # Test English translation
        loc.set_language("en")
        translated = loc.translate_finding_content(finding)
        assert translated.title == "Security header missing: Strict-Transport-Security"
        assert "security header" in translated.description.lower()
        assert "missing security header" in translated.remediation.lower()
    
    def test_unknown_finding_preservation(self):
        """Test that unknown findings preserve their original content."""
        loc = LocalizationManager()
        
        # Create a finding with unknown patterns
        finding = Finding(
            check="custom",
            title="Custom Security Issue",
            severity="low",
            description="This is a custom security issue not in our patterns.",
            remediation="Apply custom remediation steps."
        )
        
        # Test that content is preserved when no patterns match
        loc.set_language("en")
        translated = loc.translate_finding_content(finding)
        assert translated.title == finding.title
        assert translated.description == finding.description
        assert translated.remediation == finding.remediation
    
    def test_finding_attributes_preservation(self):
        """Test that all finding attributes are preserved during translation."""
        loc = LocalizationManager()
        
        finding = Finding(
            check="tls",
            title="Certificat SSL expiré",
            severity="high",
            description="Certificate expired",
            remediation="Renew certificate",
            evidence="Expired on 2024-01-01",
            impact="High security risk"
        )
        
        translated = loc.translate_finding_content(finding)
        
        # Check that all original attributes are preserved
        assert translated.check == finding.check
        assert translated.severity == finding.severity
        assert translated.evidence == finding.evidence
        assert translated.impact == finding.impact
        
        # Check that content is properly formatted (translation may or may not occur)
        assert translated.title is not None and len(translated.title) > 0
        assert translated.description is not None and len(translated.description) > 0
