"""
Nom du script : audit_log_service.py
Chemin : /gitlab-bridge/app/services/audit_log_service.py
Description : Persistance des journaux d'audit en base SQL avec gestion défensive des erreurs.
Options éventuelles : Aucune.
Exemples d'utilisation : `write_log(...)` après chaque action.
Prérequis : Python 3.11+, SQLAlchemy 2.x.
Auteur : Sylvain SCATTOLINI
Date de création / modification : 2026-03-25
Version : 1.1
"""

from __future__ import annotations

import logging

from sqlalchemy.orm import Session

from app.db.models.audit_log import AuditLog

logger = logging.getLogger(__name__)


class AuditLogService:
    """Journalise les actions tout en évitant de casser le flux métier en cas d'échec DB."""

    def __init__(self, db: Session) -> None:
        self.db = db

    def write_log(
        self,
        *,
        username: str,
        email: str,
        action: str,
        project_path: str,
        status: str,
        request_payload: dict,
        response_payload: dict | None = None,
        error_message: str | None = None,
    ) -> None:
        try:
            audit_log = AuditLog(
                username=username,
                email=email,
                action=action,
                project_path=project_path,
                status=status,
                request_payload=request_payload,
                response_payload=response_payload,
                error_message=error_message,
            )
            self.db.add(audit_log)
            self.db.commit()
        except Exception:
            self.db.rollback()
            logger.exception('Impossible de journaliser l\'action en base.')
