# middleware_auditoria.py
import json
from fastapi import Request
from starlette.middleware.base import BaseHTTPMiddleware
from datetime import datetime
from connection.connection import insertar_auditoria 

class AuditoriaMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request: Request, call_next):
        ip_cliente = request.client.host
        metodo = request.method
        url = str(request.url)
        headers = dict(request.headers)
        usuario = headers.get("usuario", None) 
        try:
            cuerpo = await request.body()
            cuerpo_str = cuerpo.decode("utf-8")
        except:
            cuerpo_str = None

        # Procesar petición y capturar estado
        response = await call_next(request)
        status_code = response.status_code

        # Insertar en auditoría
        auditoria_data = {
            "ip_cliente": ip_cliente,
            "metodo_http": metodo,
            "url": url,
            "headers": headers,
            "cuerpo": cuerpo_str,
            "usuario": usuario,
            "estado_respuesta": status_code,
            "mensaje": "OK" if status_code < 400 else "Error"
        }
        try:
            insertar_auditoria(auditoria_data)
        except Exception as e:
            print("❌ Error al registrar auditoría:", e)

        return response
