# Fichier: extensions.py (VERSION AUDITÉE)

import os
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
from flask_mail import Mail
from flask_talisman import Talisman
from flask_wtf.csrf import CSRFProtect
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address

# ========================================================================
# INITIALISATION DES EXTENSIONS
# ========================================================================

db = SQLAlchemy()
bcrypt = Bcrypt()
login_manager = LoginManager()
mail = Mail()
talisman = Talisman()
csrf = CSRFProtect()

# ========================================================================
# CONFIGURATION FLASK-LOGIN
# ========================================================================

login_manager.login_view = 'auth.login'
login_manager.login_message = 'Veuillez vous connecter pour accéder à cette page.'
login_manager.login_message_category = 'info'
login_manager.session_protection = 'strong'  # Protection anti-vol de session
login_manager.refresh_view = 'auth.login'

# ========================================================================
# RATE LIMITING (Protection brute-force)
# ========================================================================

# Utilise Redis en production si dispo, sinon mémoire (moins précis avec Gunicorn)
REDIS_URL = os.environ.get('REDIS_URL', 'memory://')

# NOTE DE SÉCURITÉ POUR LA PROD :
# Si vous utilisez un Reverse Proxy (Nginx, Heroku, Cloudflare),
# assurez-vous d'utiliser werkzeug.middleware.proxy_fix.ProxyFix dans app.py
# pour que get_remote_address récupère la vraie IP du client et non celle du proxy.

limiter = Limiter(
    key_func=get_remote_address,  # Limite par adresse IP
    default_limits=["10000 per day", "1000 per hour"],  # Limites globales par défaut
    storage_uri=REDIS_URL,
    strategy="fixed-window",
    headers_enabled=True  # Headers X-RateLimit utiles pour le debug
)

# ========================================================================
# CONSTANTES DE LIMITES (À importer dans les blueprints)
# ========================================================================

# SÉCURITÉ CRITIQUE
RATE_LIMIT_LOGIN = "5 per minute"         # Anti Brute-force Login
RATE_LIMIT_2FA = "10 per minute"          # Anti Brute-force 2FA
RATE_LIMIT_PASSWORD_RESET = "5 per hour"  # Anti Spam Reset

# ACTIONS UTILISATEURS
RATE_LIMIT_REGISTER = "20 per hour"       # Création de comptes (ajusté vs commentaire précédent)
RATE_LIMIT_AUDIT_CREATE = "50 per hour"   # Création d'audits
RATE_LIMIT_PDF_DOWNLOAD = "60 per hour"   # Génération PDF (coûteux en CPU)
RATE_LIMIT_EMAIL_SEND = "30 per hour"     # Envoi emails