using Elecciones.Database;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace Elecciones.Api.Controllers;

[ApiController]
[Route("api/[controller]")]
public class TelegramasController : ControllerBase
{
  private readonly EleccionesDbContext _dbContext;

  public TelegramasController(EleccionesDbContext dbContext)
  {
    _dbContext = dbContext;
  }

  /// <summary>
  /// Obtiene la lista de IDs de todos los telegramas que han sido totalizados y descargados.
  /// </summary>
  [HttpGet]
  public async Task<IActionResult> GetListaTelegramas()
  {
    var ids = await _dbContext.Telegramas
        .AsNoTracking()
        .OrderBy(t => t.Id)
        .Select(t => t.Id)
        .ToListAsync();

    return Ok(ids);
  }

  /// <summary>
  /// Obtiene el contenido completo de un telegrama específico, incluyendo la imagen en Base64.
  /// </summary>
  /// <param name="mesaId">El ID único de la mesa/telegrama (ej. "0200100001M").</param>
  [HttpGet("{mesaId}")]
  public async Task<IActionResult> GetTelegramaPorId(string mesaId)
  {
    // PASO 1: Buscar el ámbito geográfico que corresponde a esta MesaId.
    // Esto nos dará el ID interno (clave primaria) del ámbito.
    var ambitoMesa = await _dbContext.AmbitosGeograficos
        .AsNoTracking()
        .FirstOrDefaultAsync(a => a.MesaId == mesaId && a.NivelId == 70);

    if (ambitoMesa == null)
    {
      // Si no encontramos el ámbito, significa que el MesaId no es válido.
      return NotFound(new { message = $"No se encontró un ámbito geográfico para la mesa con ID {mesaId}" });
    }

    // PASO 2: Usar el ID interno del ámbito para buscar el telegrama.
    // Esta es la relación correcta entre las tablas.
    var telegrama = await _dbContext.Telegramas
        .AsNoTracking()
        .FirstOrDefaultAsync(t => t.AmbitoGeograficoId == ambitoMesa.Id);

    if (telegrama == null)
    {
      // Si encontramos el ámbito pero no el telegrama, significa que aún no ha sido descargado.
      return NotFound(new { message = $"Se encontró la mesa, pero su telegrama aún no ha sido procesado." });
    }

    // Devolvemos los datos del telegrama encontrado.
    return Ok(new
    {
      telegrama.Id,
      telegrama.AmbitoGeograficoId,
      telegrama.ContenidoBase64,
      telegrama.FechaEscaneo,
      telegrama.FechaTotalizacion
    });
  }
}