"""
Nom du script : exceptions.py
Chemin : /gitlab-bridge/app/core/exceptions.py
Description : Exceptions métier et techniques normalisées de l'application.
Options éventuelles : Aucune.
Exemples d'utilisation : Lever `AccessDeniedError` depuis les services.
Prérequis : Python 3.11+.
Auteur : Sylvain SCATTOLINI
Date de création / modification : 2026-03-25
Version : 1.1
"""

from __future__ import annotations


class BridgeError(Exception):
    """Exception racine applicative."""

    code: str = 'bridge_error'
    message: str = 'Une erreur applicative est survenue.'

    def __init__(self, message: str | None = None) -> None:
        super().__init__(message or self.message)
        self.message = message or self.message


class ValidationError(BridgeError):
    code = 'validation_error'
    message = 'Les données fournies sont invalides.'


class GitLabUserNotFoundError(BridgeError):
    code = 'gitlab_user_not_found'
    message = 'Utilisateur non trouvé dans GitLab.'


class ProjectNotFoundError(BridgeError):
    code = 'project_not_found'
    message = 'Projet GitLab introuvable.'


class AccessDeniedError(BridgeError):
    code = 'access_denied'
    message = "Vous n'avez pas les droits suffisants sur ce projet."


class GitLabApiError(BridgeError):
    code = 'gitlab_api_error'
    message = "Erreur lors de l'appel à l'API GitLab."

    def __init__(self, message: str | None = None, http_status: int | None = None) -> None:
        super().__init__(message)
        self.http_status: int | None = http_status
