using SchotzIadKmTracker.Api.Models.DTOs;
namespace SchotzIadKmTracker.Api.Services;
///
/// Logique métier d'authentification de l'application mono-utilisateur :
/// existence du compte, inscription, connexion, demande et application de la
/// réinitialisation du mot de passe.
///
public interface IAuthService
{
///
/// Indique si un compte existe déjà, afin d'orienter le frontend (inscription vs connexion).
///
/// Jeton d'annulation de l'opération.
/// true s'il existe au moins un compte, false sinon (Exigences 1.2, 9.1).
Task CompteExisteAsync(CancellationToken ct);
///
/// Inscrit le compte unique. Lève
/// si un compte existe déjà (Exigence 1).
///
/// Email et mot de passe fournis à l'inscription.
/// Jeton d'annulation de l'opération.
Task RegisterAsync(RegisterDto dto, CancellationToken ct);
///
/// Authentifie le compte et émet un jeton JWT. Lève
/// si les identifiants sont invalides (Exigence 2).
///
/// Identifiants de connexion (email et mot de passe).
/// Jeton d'annulation de l'opération.
/// Le jeton JWT émis et sa date d'expiration.
Task LoginAsync(LoginDto dto, CancellationToken ct);
///
/// Traite une demande de réinitialisation de mot de passe. Par principe de non-divulgation,
/// se termine toujours sans exception, que l'email corresponde ou non à un compte (Exigence 6.6).
///
/// Email pour lequel demander la réinitialisation.
/// Jeton d'annulation de l'opération.
Task ForgotPasswordAsync(ForgotPasswordDto dto, CancellationToken ct);
///
/// Réinitialise le mot de passe à partir d'un jeton de réinitialisation. Lève
/// si le jeton est inconnu ou déjà utilisé,
/// s'il a expiré (Exigence 7).
///
/// Jeton de réinitialisation et nouveau mot de passe.
/// Jeton d'annulation de l'opération.
Task ResetPasswordAsync(ResetPasswordDto dto, CancellationToken ct);
///
/// Change le mot de passe d'un utilisateur déjà authentifié (page Compte utilisateur).
/// Contrairement à (jeton reçu par email), exige la
/// saisie de l'ancien mot de passe. Lève
/// si celui-ci est incorrect.
///
/// Mot de passe actuel et nouveau mot de passe.
/// Jeton d'annulation de l'opération.
Task ChangePasswordAsync(ChangePasswordDto dto, CancellationToken ct);
}