using System.Globalization; using Microsoft.AspNetCore.Mvc; using SchotzIadKmTracker.Api.Models.DTOs; using SchotzIadKmTracker.Api.Services; namespace SchotzIadKmTracker.Api.Controllers; /// /// Endpoints de navigation temporelle et de totaux du Panneau_Totaux : /// années/mois/jours disponibles (périodes ayant des données) et totaux /// jour/mois/année partiel pour une date donnée (Exigences 12.15, 12.16). /// [ApiController] [Route("api")] public class NavigationController : ControllerBase { private readonly ITotauxService _totauxService; public NavigationController(ITotauxService totauxService) { _totauxService = totauxService; } /// /// Retourne les années comportant au moins un Trajet, complétées par l'année /// courante, triées croissantes (Exigence 12.15). /// [HttpGet("annees-disponibles")] [ProducesResponseType(typeof(IReadOnlyList), StatusCodes.Status200OK)] public async Task>> GetAnneesDisponibles( CancellationToken cancellationToken) { var annees = await _totauxService.GetAnneesDisponiblesAsync(cancellationToken); return Ok(annees); } /// /// Retourne les mois (1..12) de l'année comportant au moins un Trajet, /// triés croissants (Exigence 12.16). /// [HttpGet("mois-disponibles/{annee:int}")] [ProducesResponseType(typeof(IReadOnlyList), StatusCodes.Status200OK)] public async Task>> GetMoisDisponibles( int annee, CancellationToken cancellationToken) { var mois = await _totauxService.GetMoisDisponiblesAsync(annee, cancellationToken); return Ok(mois); } /// /// Retourne les jours du mois de l'année comportant au moins un Trajet, /// triés croissants (Exigence 12.16). /// [HttpGet("jours-disponibles/{annee:int}/{mois:int}")] [ProducesResponseType(typeof(IReadOnlyList), StatusCodes.Status200OK)] public async Task>> GetJoursDisponibles( int annee, int mois, CancellationToken cancellationToken) { var jours = await _totauxService.GetJoursDisponiblesAsync(annee, mois, cancellationToken); return Ok(jours); } /// /// Retourne les totaux jour/mois/année partiel du Panneau_Totaux pour la date /// indiquée et le véhicule (Véhicule_Courant si omis). /// La date est attendue au format ISO yyyy-MM-dd ; un format invalide est /// rejeté avec un code HTTP 400. /// [HttpGet("totaux/{date}")] [ProducesResponseType(typeof(TotauxDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task> GetTotaux( string date, [FromQuery] int? vehiculeId, CancellationToken cancellationToken) { if (!DateOnly.TryParseExact(date, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var jour)) { return Problem( detail: $"La date '{date}' est invalide. Format attendu : yyyy-MM-dd.", statusCode: StatusCodes.Status400BadRequest); } var totaux = await _totauxService.GetTotauxAsync(jour, vehiculeId, cancellationToken); return Ok(totaux); } }