// Authentication error types
use thiserror::Error;

#[derive(Debug, Error, Clone)]
pub enum AuthError {
    #[error("Invalid token: {reason}")]
    InvalidToken { reason: String },

    #[error("Token expired")]
    TokenExpired,

    #[error("Invalid signature")]
    InvalidSignature,

    #[error("Missing required claim: {claim}")]
    MissingClaim { claim: String },

    #[error("Invalid claim: {claim} - {reason}")]
    InvalidClaimValue { claim: String, reason: String },

    #[error("OAuth error: {message}")]
    OAuthError { message: String },

    #[error("Session error: {message}")]
    SessionError { message: String },

    #[error("Database error: {message}")]
    DatabaseError { message: String },

    #[error("Configuration error: {message}")]
    ConfigError { message: String },

    #[error("OIDC metadata error: {message}")]
    OidcMetadataError { message: String },

    #[error("PKCE error: {message}")]
    PkceError { message: String },

    #[error("State validation failed")]
    InvalidState,

    #[error("Token not found")]
    TokenNotFound,

    #[error("Session revoked")]
    SessionRevoked,

    #[error("Forbidden: {message}")]
    Forbidden { message: String },

    #[error("Internal error: {message}")]
    Internal { message: String },

    #[error("System time error: {message}")]
    SystemTimeError { message: String },

    #[error("Rate limited: retry after {retry_after_secs} seconds")]
    RateLimited { retry_after_secs: u64 },
}

pub type Result<T> = std::result::Result<T, AuthError>;
