using BCards.Web.Areas.Support.Models; using BCards.Web.Areas.Support.Services; using Microsoft.AspNetCore.Mvc; using System.Security.Claims; namespace BCards.Web.Areas.Support.Controllers; [Area("Support")] [Route("api/ratings")] [ApiController] public class RatingsController : ControllerBase { private readonly IRatingService _ratingService; private readonly ILogger _logger; public RatingsController(IRatingService ratingService, ILogger logger) { _ratingService = ratingService; _logger = logger; } [HttpPost] public async Task SubmitRating([FromBody] RatingSubmissionDto dto) { if (!ModelState.IsValid) { _logger.LogWarning("Rating inválido submetido: {Errors}", ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage)); return BadRequest(ModelState); } try { var userId = User?.FindFirst(ClaimTypes.NameIdentifier)?.Value; var success = await _ratingService.SubmitRatingAsync(dto, userId, HttpContext); if (success) { _logger.LogInformation("Rating de {Stars} estrelas submetido com sucesso", dto.RatingValue); return Ok(new { message = "Avaliação enviada com sucesso! Obrigado pelo feedback." }); } _logger.LogError("Falha ao submeter rating"); return StatusCode(503, new { message = "Erro ao processar sua avaliação. Tente novamente mais tarde." }); } catch (Exception ex) { _logger.LogError(ex, "Erro ao processar rating"); return StatusCode(500, new { message = "Erro interno ao processar sua avaliação." }); } } [HttpGet("average")] public async Task GetAverageRating() { try { var average = await _ratingService.GetAverageRatingAsync(); var total = await _ratingService.GetTotalCountAsync(); return Ok(new { average = Math.Round(average, 2), total }); } catch (Exception ex) { _logger.LogError(ex, "Erro ao buscar média de ratings"); return StatusCode(500, new { message = "Erro ao buscar avaliações" }); } } [HttpGet("recent")] public async Task GetRecentRatings([FromQuery] int limit = 10) { try { if (limit < 1 || limit > 50) limit = 10; var ratings = await _ratingService.GetRecentRatingsAsync(limit); return Ok(ratings); } catch (Exception ex) { _logger.LogError(ex, "Erro ao buscar ratings recentes"); return StatusCode(500, new { message = "Erro ao buscar avaliações recentes" }); } } }