#!/usr/bin/env python3
"""
🩹 Patch temporaire pour AuthManager - Web Sentinel Test Environment

Patch l'AuthManager pour qu'il utilise notre API locale au lieu du mode offline.
"""

import os
import shutil
from pathlib import Path


def patch_auth_manager():
    """Appliquer le patch à l'AuthManager."""
    auth_manager_path = Path(__file__).parent.parent / "web_sentinel" / "auth" / "auth_manager.py"
    backup_path = auth_manager_path.with_suffix('.py.backup')
    
    print(f"🩹 APPLICATION DU PATCH AUTHMANAGER")
    print("=" * 40)
    
    # Créer une sauvegarde si elle n'existe pas
    if not backup_path.exists():
        shutil.copy2(auth_manager_path, backup_path)
        print(f"💾 Sauvegarde créée: {backup_path}")
    
    # Lire le fichier original
    with open(auth_manager_path, 'r', encoding='utf-8') as f:
        content = f.read()
    
    # Appliquer les patches
    patched_content = content
    
    # Patch 1: Modifier la détection du mode offline pour tenir compte de notre API locale
    old_offline_logic = """def switch_to_offline_mode(self) -> None:
        \"\"\"Basculer en mode hors ligne.\"\"\"
        self.offline_mode = True"""
    
    new_offline_logic = """def switch_to_offline_mode(self) -> None:
        \"\"\"Basculer en mode hors ligne.\"\"\"
        # En mode test, ne pas passer en offline si on utilise l'API locale
        if os.getenv('WS_TEST_MODE') and 'localhost' in self.cloud_api_url:
            print(f"🧪 Mode test détecté avec API locale - pas de mode offline")
            self.offline_mode = False
        else:
            self.offline_mode = True"""
    
    if old_offline_logic in patched_content:
        patched_content = patched_content.replace(old_offline_logic, new_offline_logic)
        print(f"✅ Patch 1 appliqué: Logic mode offline modifiée")
    
    # Patch 2: Modifier la gestion des erreurs réseau pour ne pas passer en offline
    old_cloud_tier = """except requests.RequestException:
            pass
        
        return SubscriptionTier.FREE"""
    
    new_cloud_tier = """except requests.RequestException as e:
            # En mode test, logger l'erreur mais ne pas échouer silencieusement
            if os.getenv('WS_TEST_MODE'):
                print(f"🧪 Erreur API en mode test: {e}")
            pass
        
        return SubscriptionTier.FREE"""
    
    if old_cloud_tier in patched_content:
        patched_content = patched_content.replace(old_cloud_tier, new_cloud_tier)
        print(f"✅ Patch 2 appliqué: Gestion d'erreur API améliorée")
    
    # Patch 3: Forcer le mode cloud si on utilise l'API locale
    old_get_manager = """def get_subscription_manager(self) -> SubscriptionManager:
        \"\"\"Obtenir le gestionnaire d'abonnement pour l'utilisateur courant.\"\"\"
        if self.is_authenticated() and self.current_session and self.current_session.user:
            # En mode cloud, récupérer le tier depuis l'API
            if not self.offline_mode:
                tier = self._get_cloud_subscription_tier()
            else:
                # En mode local, tier FREE par défaut
                tier = SubscriptionTier.FREE"""
    
    new_get_manager = """def get_subscription_manager(self) -> SubscriptionManager:
        \"\"\"Obtenir le gestionnaire d'abonnement pour l'utilisateur courant.\"\"\"
        if self.is_authenticated() and self.current_session and self.current_session.user:
            # En mode test avec API locale, toujours récupérer depuis l'API
            if os.getenv('WS_TEST_MODE') and 'localhost' in self.cloud_api_url:
                tier = self._get_cloud_subscription_tier()
                if os.getenv('WS_TEST_MODE'):
                    print(f"🧪 Mode test: tier récupéré = {tier.value}")
            elif not self.offline_mode:
                # En mode cloud normal
                tier = self._get_cloud_subscription_tier()
            else:
                # En mode local, tier FREE par défaut
                tier = SubscriptionTier.FREE"""
    
    if old_get_manager in patched_content:
        patched_content = patched_content.replace(old_get_manager, new_get_manager)
        print(f"✅ Patch 3 appliqué: Logique SubscriptionManager modifiée")
    
    # Écrire le fichier patché
    with open(auth_manager_path, 'w', encoding='utf-8') as f:
        f.write(patched_content)
    
    print(f"✅ Patch appliqué à {auth_manager_path}")
    return True


def restore_auth_manager():
    """Restaurer l'AuthManager original."""
    auth_manager_path = Path(__file__).parent.parent / "web_sentinel" / "auth" / "auth_manager.py"
    backup_path = auth_manager_path.with_suffix('.py.backup')
    
    print(f"🔄 RESTAURATION AUTHMANAGER ORIGINAL")
    print("=" * 40)
    
    if backup_path.exists():
        shutil.copy2(backup_path, auth_manager_path)
        print(f"✅ AuthManager restauré depuis {backup_path}")
        return True
    else:
        print(f"❌ Aucune sauvegarde trouvée: {backup_path}")
        return False


if __name__ == "__main__":
    import argparse
    
    parser = argparse.ArgumentParser(description="🩹 Patch AuthManager pour mode test")
    parser.add_argument("--apply", action="store_true", help="Appliquer le patch")
    parser.add_argument("--restore", action="store_true", help="Restaurer l'original")
    
    args = parser.parse_args()
    
    if args.apply:
        patch_auth_manager()
    elif args.restore:
        restore_auth_manager()
    else:
        print("🩹 Patch AuthManager")
        print("=" * 20)
        print("💡 Utilisation:")
        print("   python auth_manager_patch.py --apply")
        print("   python auth_manager_patch.py --restore")