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);
}
}
}