using Microsoft.AspNetCore.Mvc;
using SchotzIadKmTracker.Api.Models.DTOs;
using SchotzIadKmTracker.Api.Services;
using SchotzIadKmTracker.Api.Services.Exceptions;
namespace SchotzIadKmTracker.Api.Controllers;
///
/// Endpoints des résumés kilométriques : Résumé_Mensuel et Résumé_Annuel.
/// Le filtre par véhicule est optionnel (Véhicule_Courant utilisé si omis).
/// Les paramètres hors bornes (mois ∉ [1, 12], année ∉ [2000, 2100]) sont
/// rejetés avec un code HTTP 400 (Exigences 3.6, 3.8, 4.1).
///
[ApiController]
[Route("api/resumes")]
public class ResumesController : ControllerBase
{
private readonly IResumeService _resumeService;
public ResumesController(IResumeService resumeService)
{
_resumeService = resumeService;
}
///
/// Retourne le Résumé_Mensuel d'un (année, mois) pour le véhicule indiqué
/// (Véhicule_Courant si est omis). Rejette (400)
/// les paramètres hors bornes (Exigences 3.6, 3.8).
///
[HttpGet("mensuel/{annee:int}/{mois:int}")]
[ProducesResponseType(typeof(ResumeMensuelDto), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task> GetResumeMensuel(
int annee, int mois, [FromQuery] int? vehiculeId, CancellationToken cancellationToken)
{
try
{
var resume = await _resumeService.GetResumeMensuelAsync(annee, mois, vehiculeId, cancellationToken);
return Ok(resume);
}
catch (ResumeParametreInvalideException ex)
{
return Problem(detail: ex.Message, statusCode: StatusCodes.Status400BadRequest);
}
}
///
/// Retourne le Résumé_Annuel d'une année (12 résumés mensuels) pour le véhicule
/// indiqué (Véhicule_Courant si est omis). Rejette (400)
/// une année hors bornes (Exigences 3.6, 4.1).
///
[HttpGet("annuel/{annee:int}")]
[ProducesResponseType(typeof(ResumeAnnuelDto), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task> GetResumeAnnuel(
int annee, [FromQuery] int? vehiculeId, CancellationToken cancellationToken)
{
try
{
var resume = await _resumeService.GetResumeAnnuelAsync(annee, vehiculeId, cancellationToken);
return Ok(resume);
}
catch (ResumeParametreInvalideException ex)
{
return Problem(detail: ex.Message, statusCode: StatusCodes.Status400BadRequest);
}
}
}