using Distribution.Infra.Authorization; using Microsoft.AspNetCore.Mvc; namespace Distribution.Features.Reconciliation; [ApiController] [Route("api/rides/{rideId:guid}")] public class ReconciliationController(ReconciliationService service, ICurrentUserService currentUser) : ControllerBase { [HttpPost("cycle-count")] public async Task SubmitCycleCount(Guid rideId, SubmitCycleCountRequest request, CancellationToken ct) { var userId = currentUser.UserId ?? throw new UnauthorizedAccessException(); try { var result = await service.SubmitCycleCountAsync(rideId, request, userId, ct); return Ok(result); } catch (KeyNotFoundException) { return NotFound(); } catch (InvalidOperationException ex) { return BadRequest(new { error = ex.Message }); } } [HttpGet("variances")] public async Task GetVariances(Guid rideId) { try { var result = await service.GetVariancesAsync(rideId); return Ok(result); } catch (KeyNotFoundException) { return NotFound(); } catch (InvalidOperationException ex) { return BadRequest(new { error = ex.Message }); } } [HttpPost("variances/{id:guid}/approve")] public async Task ApproveVariance(Guid rideId, Guid id, ResolveVarianceRequest request, CancellationToken ct) { var userId = currentUser.UserId ?? throw new UnauthorizedAccessException(); try { var result = await service.ApproveVarianceAsync(id, request, userId, ct); return Ok(result); } catch (KeyNotFoundException) { return NotFound(); } catch (InvalidOperationException ex) { return BadRequest(new { error = ex.Message }); } } [HttpPost("variances/{id:guid}/reject")] public async Task RejectVariance(Guid rideId, Guid id, ResolveVarianceRequest request, CancellationToken ct) { var userId = currentUser.UserId ?? throw new UnauthorizedAccessException(); try { var result = await service.RejectVarianceAsync(id, request, userId, ct); return Ok(result); } catch (KeyNotFoundException) { return NotFound(); } catch (InvalidOperationException ex) { return BadRequest(new { error = ex.Message }); } } [HttpPost("close-ride")] public async Task CloseRide(Guid rideId, CancellationToken ct) { var userId = currentUser.UserId ?? throw new UnauthorizedAccessException(); try { var result = await service.CloseRideAsync(rideId, userId, ct); return Ok(result); } catch (KeyNotFoundException) { return NotFound(); } catch (InvalidOperationException ex) { return BadRequest(new { error = ex.Message }); } } }