using GestionIntegral.Api.Dtos.Radios;
using GestionIntegral.Api.Services.Radios;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System.Security.Claims;
using System.Threading.Tasks;

namespace GestionIntegral.Api.Controllers.Radios
{
    [Route("api/radios/listas")] // Ruta base, ej: /api/radios/listas
    [ApiController]
    [Authorize]
    public class RadioListasController : ControllerBase
    {
        private readonly IRadioListaService _radioListaService;
        private readonly ILogger<RadioListasController> _logger;

        // Asumir permiso general de Radios o uno específico para generar listas
        private const string PermisoGenerarListas = "SS005"; // Usando el permiso general de la sección Radios

        public RadioListasController(IRadioListaService radioListaService, ILogger<RadioListasController> logger)
        {
            _radioListaService = radioListaService;
            _logger = logger;
        }

        private bool TienePermiso(string codAcc) => User.IsInRole("SuperAdmin") || User.HasClaim(c => c.Type == "permission" && c.Value == codAcc);
        // GetCurrentUserId no es estrictamente necesario aquí si la acción no modifica datos persistentes auditables por usuario.

        // POST: api/radios/listas/generar
        [HttpPost("generar")]
        [ProducesResponseType(typeof(FileContentResult), StatusCodes.Status200OK)] // Devuelve un archivo
        [ProducesResponseType(StatusCodes.Status400BadRequest)]
        [ProducesResponseType(StatusCodes.Status403Forbidden)]
        [ProducesResponseType(StatusCodes.Status500InternalServerError)]
        public async Task<IActionResult> GenerarListaRadio([FromBody] GenerarListaRadioRequestDto requestDto)
        {
            if (!TienePermiso(PermisoGenerarListas)) return Forbid();
            if (!ModelState.IsValid) return BadRequest(ModelState);

            _logger.LogInformation("Solicitud de generación de lista de radio recibida: {@RequestDto}", requestDto);

            var (fileContents, contentType, fileName, error) = await _radioListaService.GenerarListaRadioAsync(requestDto);

            if (error != null)
            {
                _logger.LogWarning("Error al generar lista de radio: {Error}", error);
                // Devolver un JSON con el error podría ser más útil para el frontend que un simple BadRequest
                return BadRequest(new { message = error });
            }

            if (fileContents == null || fileContents.Length == 0)
            {
                _logger.LogWarning("La generación de la lista de radio no produjo contenido.");
                // Similar al anterior, un JSON con mensaje puede ser mejor
                return NotFound(new { message = "No se pudo generar la lista, o no hay datos suficientes." });
            }

            _logger.LogInformation("Lista de radio generada exitosamente: {FileName}", fileName);
            // Devuelve el archivo ZIP para descarga
            return File(fileContents, contentType, fileName);
        }
    }
}