using TrajetKmTracker.Api.Models.DTOs;
namespace TrajetKmTracker.Api.Services;
///
/// Logique métier de gestion des Trajets. Cette interface couvre pour l'instant la
/// création (tâche 8.2) ; la modification, la suppression et le réordonnancement
/// (tâche 8.5) l'étendront ultérieurement.
///
public interface ITrajetService
{
///
/// Crée un Trajet à partir de :
///
/// - parse la date au format JJ/MM/AAAA (la validation de forme est faite par le validateur MVC) ;
/// - associe le véhicule : VehiculeId fourni sinon le véhicule courant à la date
/// du trajet, en copiant sa PuissanceFiscale (dénormalisation, Exigence 10.14) ;
/// - calcule la distance via (BAN puis ORS, fallback Haversine) ;
/// - met en cache les adresses résolues via ;
/// - attribue la position en fin de journée (max(Position)+1.0) ;
/// - persiste le Trajet en transaction. Lorsque la distance n'a pas pu être calculée,
/// le Trajet est tout de même persisté avec une Distance nulle et un avertissement (Exigence 2.4).
///
///
/// Données de création transmises par le contrôleur (déjà validées côté MVC).
/// Jeton d'annulation.
/// Le (trajet créé + éventuel avertissement).
///
/// Si aucun véhicule n'est applicable à la date du trajet et qu'aucun VehiculeId n'est fourni.
///
Task CreateAsync(CreateTrajetDto dto, CancellationToken cancellationToken = default);
///
/// Modifie un Trajet existant à partir de :
///
/// - lève (404) si le Trajet est introuvable
/// (Exigence 5.6) ;
/// - recalcule la Distance uniquement si au moins une adresse a changé (comparaison sur
/// le texte d'adresse normalisé) ou si le Trajet avait une Distance nulle et que les nouvelles
/// adresses deviennent résolubles (Exigences 5.2, 5.9, 5.10) ; sinon les autres champs (commentaire,
/// véhicule, date) sont mis à jour sans recalcul de distance (Exigence 5.3) ;
/// - en cas d'échec du recalcul (coordonnées connues mais calcul impossible), annule la
/// modification (rollback) et lève en préservant
/// les données existantes du Trajet (Exigence 5.8) ;
/// - met en cache les adresses résolues (Exigences 6.7, 6.8) ;
/// - persiste la modification en transaction.
///
///
/// Identifiant du Trajet à modifier.
/// Données de modification (déjà validées côté MVC).
/// Jeton d'annulation.
/// Le (trajet mis à jour + éventuel avertissement).
/// Si le Trajet n'existe pas.
/// Si le recalcul de la distance échoue.
///
/// Si le VehiculeId fourni est introuvable, ou qu'aucun véhicule n'est applicable à la date.
///
Task UpdateAsync(int id, UpdateTrajetDto dto, CancellationToken cancellationToken = default);
///
/// Supprime un Trajet existant de manière transactionnelle (Exigence 5.5).
/// Lève (404) si le Trajet est introuvable (Exigence 5.6).
///
/// Identifiant du Trajet à supprimer.
/// Jeton d'annulation.
/// Si le Trajet n'existe pas.
Task DeleteAsync(int id, CancellationToken cancellationToken = default);
///
/// Applique un réordonnancement manuel des trajets d'une journée : met à jour uniquement la
/// Position des trajets fournis via ,
/// sans altérer leurs autres champs (Exigence 11.9). Les identifiants inconnus sont ignorés.
///
/// Nouvelles positions des trajets à réordonner.
/// Jeton d'annulation.
Task ReordonnerAsync(ReordonnerTrajetsDto dto, CancellationToken cancellationToken = default);
///
/// Recalcule la Distance (et la géométrie d'itinéraire mise en cache) de TOUS les trajets
/// via (BAN + ORS, fallback Haversine), indépendamment de
/// tout changement d'adresse. Utile pour « réparer » des distances calculées en mode dégradé
/// (ex. clé ORS invalide → distances à vol d'oiseau) une fois ORS de nouveau opérationnel.
/// Chaque trajet est traité de façon indépendante : un échec sur l'un n'interrompt pas les autres.
///
/// Le nombre de trajets dont la distance a effectivement été recalculée.
Task RecalculerToutesLesDistancesAsync(CancellationToken cancellationToken = default);
}