using SchotzIadKmTracker.Api.Models.DTOs;
namespace SchotzIadKmTracker.Api.Services;
///
/// Logique métier du barème kilométrique : CRUD des tranches, validation du non-chevauchement
/// par (année, puissance fiscale), sélection de tranche et calcul de montant.
///
public interface IBaremeService
{
/// Retourne toutes les tranches d'une année (toutes puissances fiscales confondues).
Task> GetBaremeAsync(int annee, CancellationToken cancellationToken = default);
///
/// Ajoute une tranche. Rejette l'ajout s'il crée un chevauchement d'intervalle [KmMin, KmMax]
/// pour la même (année, puissance fiscale) via .
///
Task AddTrancheAsync(SaveTrancheBaremeDto dto, CancellationToken cancellationToken = default);
///
/// Met à jour une tranche existante. Rejette la mise à jour si elle crée un chevauchement
/// (hors la tranche elle-même) via .
/// Lève si la tranche n'existe pas.
///
Task UpdateTrancheAsync(int id, SaveTrancheBaremeDto dto, CancellationToken cancellationToken = default);
///
/// Supprime une tranche. Lève si elle n'existe pas.
///
Task DeleteTrancheAsync(int id, CancellationToken cancellationToken = default);
///
/// Sélectionne la tranche dont [KmMin, KmMax] contient pour la
/// (année, puissance fiscale) donnée et calcule le montant `totalKm × Coefficient + Base`
/// (Property 24/27). Si aucune tranche n'existe pour cette combinaison, retourne un montant nul
/// et un signal « barème non configuré » sans lever d'erreur bloquante (Exigence 13.4).
///
Task CalculerMontantAsync(
int annee, int puissanceFiscale, decimal totalKm, CancellationToken cancellationToken = default);
///
/// Copie toutes les tranches de l'année la plus récente (strictement antérieure à
/// ) qui possède un barème, vers .
/// Les tranches existantes de l'année cible sont d'abord supprimées (annule et remplace),
/// en transaction. Retourne le nombre de tranches copiées. Retourne 0 si aucun barème
/// antérieur n'existe (rien n'est modifié).
///
Task CopierDernierBaremeAsync(int anneeCible, CancellationToken cancellationToken = default);
/// Retourne les années (triées croissantes) pour lesquelles au moins une tranche de barème existe.
Task> GetAnneesAvecBaremeAsync(CancellationToken cancellationToken = default);
}