using Microsoft.AspNetCore.Mvc; using TrajetKmTracker.Api.Models.DTOs; using TrajetKmTracker.Api.Services; using TrajetKmTracker.Api.Services.Exceptions; namespace TrajetKmTracker.Api.Controllers; /// /// Endpoints de gestion des véhicules : historique, véhicule courant, création et réaffectation. /// [ApiController] [Route("api/vehicules")] public class VehiculesController : ControllerBase { private readonly IVehiculeService _vehiculeService; public VehiculesController(IVehiculeService vehiculeService) { _vehiculeService = vehiculeService; } /// Historique complet des véhicules (trié par date d'effet décroissante). [HttpGet] [ProducesResponseType(typeof(IReadOnlyList), StatusCodes.Status200OK)] public async Task>> GetHistorique(CancellationToken cancellationToken) { var vehicules = await _vehiculeService.GetHistoriqueAsync(cancellationToken); return Ok(vehicules); } /// Véhicule courant (date d'effet la plus récente ≤ aujourd'hui). [HttpGet("courant")] [ProducesResponseType(typeof(VehiculeDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> GetCourant(CancellationToken cancellationToken) { try { var vehicule = await _vehiculeService.GetVehiculeCourantAsync(cancellationToken); return Ok(vehicule); } catch (VehiculeNotFoundException ex) { return Problem(detail: ex.Message, statusCode: StatusCodes.Status404NotFound); } } /// /// Enregistre un véhicule. Retourne indiquant si une réaffectation /// des trajets doit être proposée. Rejette une date d'effet future (400). /// [HttpPost] [ProducesResponseType(typeof(VehiculeCreeDto), StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task> Create( [FromBody] CreateVehiculeDto dto, CancellationToken cancellationToken) { try { var resultat = await _vehiculeService.CreateAsync(dto, cancellationToken); return CreatedAtAction(nameof(GetHistorique), null, resultat); } catch (DateEffetFutureException ex) { return Problem(detail: ex.Message, statusCode: StatusCodes.Status400BadRequest); } } /// Accepte ou refuse la réaffectation des trajets au véhicule indiqué. [HttpPost("reaffectation")] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task Reaffecter( [FromBody] ReaffectationDto dto, CancellationToken cancellationToken) { try { await _vehiculeService.ReaffecterAsync(dto, cancellationToken); return NoContent(); } catch (VehiculeNotFoundException ex) { return Problem(detail: ex.Message, statusCode: StatusCodes.Status404NotFound); } } }