# Fichier: services/logger_service.py
"""
Service centralisé de logging pour traçabilité et debug.
Utilise le modèle AuditLog pour persister les événements.
"""

from flask import request, current_app
from models import AuditLog
from extensions import db
import traceback

def get_client_ip():
    """Récupère l'IP du client (gère les proxies)"""
    if request.headers.get('X-Forwarded-For'):
        return request.headers.get('X-Forwarded-For').split(',')[0].strip()
    elif request.headers.get('X-Real-IP'):
        return request.headers.get('X-Real-IP')
    else:
        return request.remote_addr

def get_user_agent():
    """Récupère le User-Agent du client"""
    return request.headers.get('User-Agent', 'Unknown')[:255]

# ========================================================================
# LOGS ACTIVITÉ (INFO)
# ========================================================================

def log_auth_success(user_id, email):
    """Connexion réussie"""
    AuditLog.log_info(
        category='AUTH',
        action='LOGIN_SUCCESS',
        message=f"Connexion réussie : {email}",
        user_id=user_id,
        ip=get_client_ip(),
        user_agent=get_user_agent()
    )

def log_auth_failed(email, reason="Identifiants invalides"):
    """Tentative de connexion échouée"""
    AuditLog.log_error(
        category='AUTH',
        action='LOGIN_FAILED',
        message=f"Tentative de connexion échouée : {email}",
        error_details=reason,
        suggested_fix="Vérifier identifiants ou compte désactivé",
        ip=get_client_ip(),
        level='WARNING'
    )

def log_logout(user_id, email):
    """Déconnexion"""
    AuditLog.log_info(
        category='AUTH',
        action='LOGOUT',
        message=f"Déconnexion : {email}",
        user_id=user_id,
        ip=get_client_ip()
    )

def log_2fa_enabled(user_id, email):
    """Activation 2FA"""
    AuditLog.log_info(
        category='AUTH',
        action='2FA_ENABLED',
        message=f"2FA activée : {email}",
        user_id=user_id,
        ip=get_client_ip()
    )

def log_2fa_disabled(user_id, email):
    """Désactivation 2FA"""
    AuditLog.log_info(
        category='AUTH',
        action='2FA_DISABLED',
        message=f"2FA désactivée : {email}",
        user_id=user_id,
        ip=get_client_ip()
    )

def log_password_changed(user_id, email):
    """Changement mot de passe"""
    AuditLog.log_info(
        category='AUTH',
        action='PASSWORD_CHANGED',
        message=f"Mot de passe modifié : {email}",
        user_id=user_id,
        ip=get_client_ip()
    )

# ========================================================================
# LOGS GESTION USERS (INFO)
# ========================================================================

def log_user_created(admin_id, new_user_id, new_user_email, role):
    """Création utilisateur"""
    AuditLog.log_info(
        category='USER',
        action='USER_CREATED',
        message=f"Utilisateur créé : {new_user_email} (Rôle: {role})",
        user_id=admin_id,
        target_id=new_user_id,
        ip=get_client_ip()
    )

def log_user_updated(admin_id, target_user_id, target_email, changes):
    """Modification utilisateur"""
    AuditLog.log_info(
        category='USER',
        action='USER_UPDATED',
        message=f"Utilisateur modifié : {target_email} | Changements : {changes}",
        user_id=admin_id,
        target_id=target_user_id,
        ip=get_client_ip()
    )

def log_user_deleted(admin_id, target_email):
    """Suppression utilisateur"""
    AuditLog.log_info(
        category='USER',
        action='USER_DELETED',
        message=f"Utilisateur supprimé : {target_email}",
        user_id=admin_id,
        ip=get_client_ip()
    )

def log_user_activated(admin_id, target_user_id, target_email):
    """Activation compte"""
    AuditLog.log_info(
        category='USER',
        action='USER_ACTIVATED',
        message=f"Compte activé : {target_email}",
        user_id=admin_id,
        target_id=target_user_id,
        ip=get_client_ip()
    )

def log_user_deactivated(admin_id, target_user_id, target_email):
    """Désactivation compte"""
    AuditLog.log_info(
        category='USER',
        action='USER_DEACTIVATED',
        message=f"Compte désactivé : {target_email}",
        user_id=admin_id,
        target_id=target_user_id,
        ip=get_client_ip()
    )

# ========================================================================
# LOGS RAPPORTS (INFO)
# ========================================================================

def log_report_created(user_id, rapport_id, client_name, score):
    """Création rapport"""
    AuditLog.log_info(
        category='REPORT',
        action='REPORT_CREATED',
        message=f"Rapport créé : {client_name} | Score: {score}%",
        user_id=user_id,
        target_id=rapport_id,
        ip=get_client_ip()
    )

def log_report_deleted(user_id, client_name):
    """Suppression rapport"""
    AuditLog.log_info(
        category='REPORT',
        action='REPORT_DELETED',
        message=f"Rapport supprimé : {client_name}",
        user_id=user_id,
        ip=get_client_ip()
    )

def log_pdf_downloaded(user_id, rapport_id, client_name):
    """Téléchargement PDF"""
    AuditLog.log_info(
        category='REPORT',
        action='PDF_DOWNLOADED',
        message=f"PDF téléchargé : {client_name}",
        user_id=user_id,
        target_id=rapport_id,
        ip=get_client_ip()
    )

# ========================================================================
# LOGS ADMIN (INFO)
# ========================================================================

def log_document_uploaded(admin_id, doc_id, doc_title, category):
    """Upload document"""
    AuditLog.log_info(
        category='ADMIN',
        action='DOCUMENT_UPLOADED',
        message=f"Document uploadé : {doc_title} (Catégorie: {category})",
        user_id=admin_id,
        target_id=doc_id,
        ip=get_client_ip()
    )

def log_document_deleted(admin_id, doc_title):
    """Suppression document"""
    AuditLog.log_info(
        category='ADMIN',
        action='DOCUMENT_DELETED',
        message=f"Document supprimé : {doc_title}",
        user_id=admin_id,
        ip=get_client_ip()
    )

def log_announcement_created(admin_id, announcement_id, target):
    """Création bandeau"""
    AuditLog.log_info(
        category='ADMIN',
        action='ANNOUNCEMENT_CREATED',
        message=f"Bandeau créé (Cible: {target})",
        user_id=admin_id,
        target_id=announcement_id,
        ip=get_client_ip()
    )

def log_logo_uploaded(user_id, email):
    """Upload logo white-label"""
    AuditLog.log_info(
        category='ADMIN',
        action='LOGO_UPLOADED',
        message=f"Logo personnalisé uploadé : {email}",
        user_id=user_id,
        ip=get_client_ip()
    )

# ========================================================================
# LOGS ERREURS (ERROR/CRITICAL)
# ========================================================================

def log_db_error(category, action, message, exception):
    """Erreur base de données"""
    AuditLog.log_error(
        category=category,
        action=f'{action}_DB_ERROR',
        message=message,
        error_details=f"{type(exception).__name__}: {str(exception)}\n\n{traceback.format_exc()}",
        suggested_fix="1. Vérifier connexion PostgreSQL\n2. Vérifier migrations DB (flask db upgrade)\n3. Consulter logs PostgreSQL",
        ip=get_client_ip(),
        level='CRITICAL'
    )

def log_pdf_error(user_id, rapport_id, exception):
    """Erreur génération PDF"""
    AuditLog.log_error(
        category='REPORT',
        action='PDF_GENERATION_ERROR',
        message=f"Erreur génération PDF (Rapport ID: {rapport_id})",
        error_details=f"{type(exception).__name__}: {str(exception)}\n\n{traceback.format_exc()}",
        suggested_fix="1. Supprimer cache Python : find . -name '__pycache__' -type d -exec rm -rf {} +\n2. Vérifier pdf_service.py (indentation, imports)\n3. Redémarrer Flask",
        user_id=user_id,
        target_id=rapport_id,
        ip=get_client_ip(),
        level='ERROR'
    )

def log_email_error(recipient, subject, exception):
    """Erreur envoi email"""
    AuditLog.log_error(
        category='EMAIL',
        action='EMAIL_SEND_ERROR',
        message=f"Échec envoi email à {recipient} | Sujet: {subject}",
        error_details=f"{type(exception).__name__}: {str(exception)}\n\n{traceback.format_exc()}",
        suggested_fix="1. Vérifier config SMTP (MAIL_SERVER, MAIL_PORT)\n2. Vérifier identifiants MAIL_USERNAME/PASSWORD\n3. Tester connexion SMTP manuellement",
        level='ERROR'
    )

def log_unauthorized_access(user_id, resource, action):
    """Tentative accès non autorisé"""
    AuditLog.log_error(
        category='SYSTEM',
        action='UNAUTHORIZED_ACCESS',
        message=f"Accès refusé : {action} sur {resource}",
        error_details=f"User ID: {user_id} | IP: {get_client_ip()}",
        suggested_fix="Vérifier permissions utilisateur",
        user_id=user_id,
        ip=get_client_ip(),
        level='WARNING'
    )

def log_rate_limit_exceeded(user_id, endpoint):
    """Rate limiting déclenché"""
    AuditLog.log_error(
        category='SYSTEM',
        action='RATE_LIMIT_EXCEEDED',
        message=f"Rate limit dépassé : {endpoint}",
        error_details=f"User ID: {user_id} | IP: {get_client_ip()}",
        suggested_fix="Comportement suspect ou bot détecté",
        user_id=user_id,
        ip=get_client_ip(),
        level='WARNING'
    )

def log_generic_error(category, action, message, exception, user_id=None):
    """Erreur générique"""
    AuditLog.log_error(
        category=category,
        action=action,
        message=message,
        error_details=f"{type(exception).__name__}: {str(exception)}\n\n{traceback.format_exc()}",
        suggested_fix="Consulter stack trace complète et logs applicatifs",
        user_id=user_id,
        ip=get_client_ip(),
        level='ERROR'
    )

    # ========================================================================
# LOGS MULTI-CONNEXION
# ========================================================================

def log_session_limit_reached(user_id, email, current_sessions, max_sessions, disconnected_session_id=None):
    """Log quand un manager atteint sa limite de connexions"""
    from flask import request
    
    message = f"Limite de connexions atteinte pour {email} ({current_sessions}/{max_sessions})"
    if disconnected_session_id:
        message += f" - Session {disconnected_session_id[:8]}... déconnectée automatiquement"
    
    AuditLog.log_info(
        category='AUTH',
        action='SESSION_LIMIT_REACHED',
        message=message,
        user_id=user_id,
        ip=get_client_ip(),
        user_agent=get_user_agent()
    )

def log_session_limit_changed(admin_id, target_user_id, target_email, old_limit, new_limit):
    """Log quand un admin modifie la limite de connexions d'un manager"""
    from flask import request
    
    message = f"Limite de connexions modifiée pour {target_email} : {old_limit} → {new_limit}"
    
    AuditLog.log_info(
        category='ADMIN',
        action='SESSION_LIMIT_CHANGED',
        message=message,
        user_id=admin_id,
        target_id=target_user_id,
        ip=get_client_ip(),
        user_agent=get_user_agent()
    )

def log_force_disconnect_all(admin_id, target_user_id, target_email, sessions_count):
    """Log quand un admin déconnecte toutes les sessions d'un utilisateur"""
    from flask import request
    
    message = f"Déconnexion forcée de toutes les sessions ({sessions_count}) pour {target_email}"
    
    AuditLog.log_info(
        category='ADMIN',
        action='FORCE_DISCONNECT_ALL',
        message=message,
        user_id=admin_id,
        target_id=target_user_id,
        ip=get_client_ip(),
        user_agent=get_user_agent()
    )