// src/Elecciones.Database/EleccionesDbContext.cs
using Elecciones.Database.Entities;
using Microsoft.EntityFrameworkCore;

namespace Elecciones.Database;

public class EleccionesDbContext(DbContextOptions<EleccionesDbContext> options) : DbContext(options)
{
    public DbSet<AgrupacionPolitica> AgrupacionesPoliticas { get; set; }
    public DbSet<AmbitoGeografico> AmbitosGeograficos { get; set; }
    public DbSet<ResultadoVoto> ResultadosVotos { get; set; }
    public DbSet<EstadoRecuento> EstadosRecuentos { get; set; }
    public DbSet<ProyeccionBanca> ProyeccionesBancas { get; set; }
    public DbSet<Telegrama> Telegramas { get; set; }
    public DbSet<ResumenVoto> ResumenesVotos { get; set; }
    public DbSet<EstadoRecuentoGeneral> EstadosRecuentosGenerales { get; set; }
    public DbSet<CategoriaElectoral> CategoriasElectorales { get; set; }
    public DbSet<AdminUser> AdminUsers { get; set; }
    public DbSet<Configuracion> Configuraciones { get; set; }
    public DbSet<Bancada> Bancadas { get; set; }
    public DbSet<OcupanteBanca> OcupantesBancas { get; set; }
    public DbSet<LogoAgrupacionCategoria> LogosAgrupacionesCategorias { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.UseCollation("Modern_Spanish_CI_AS");

        modelBuilder.Entity<ResultadoVoto>()
        .HasIndex(r => new { r.AmbitoGeograficoId, r.CategoriaId, r.AgrupacionPoliticaId })
        .IsUnique();

        // Precisión para los campos de porcentaje en EstadoRecuento
        modelBuilder.Entity<EstadoRecuento>(entity =>
        {
            entity.HasKey(e => new { e.AmbitoGeograficoId, e.CategoriaId });
            entity.Property(e => e.MesasTotalizadasPorcentaje).HasPrecision(5, 2);
            entity.Property(e => e.ParticipacionPorcentaje).HasPrecision(5, 2);
            entity.Property(e => e.VotosNulosPorcentaje).HasPrecision(18, 4);
            entity.Property(e => e.VotosEnBlancoPorcentaje).HasPrecision(18, 4);
            entity.Property(e => e.VotosRecurridosPorcentaje).HasPrecision(18, 4);
        });

        // Precisión para el campo de porcentaje en ResultadoVoto
        modelBuilder.Entity<ResultadoVoto>()
            .Property(e => e.PorcentajeVotos).HasPrecision(18, 4);

        modelBuilder.Entity<ResumenVoto>()
            .Property(e => e.VotosPorcentaje).HasPrecision(5, 2);

        modelBuilder.Entity<EstadoRecuentoGeneral>(entity =>
        {
            // Le decimos a EF que la combinación única es (AmbitoGeograficoId, CategoriaId)
            entity.HasKey(e => new { e.AmbitoGeograficoId, e.CategoriaId });

            // Mantener la configuración de precisión
            entity.Property(e => e.MesasTotalizadasPorcentaje).HasPrecision(5, 2);
            entity.Property(e => e.ParticipacionPorcentaje).HasPrecision(5, 2);
        });
        modelBuilder.Entity<ProyeccionBanca>(entity =>
        {
            // La combinación de ámbito, categoría y agrupación debe ser única.
            entity.HasIndex(p => new { p.AmbitoGeograficoId, p.CategoriaId, p.AgrupacionPoliticaId })
                  .IsUnique();
        });
        modelBuilder.Entity<Bancada>(entity =>
        {
            // Define la relación uno a uno: una Bancada tiene un Ocupante.
            entity.HasOne(b => b.Ocupante)
                  .WithOne(o => o.Bancada)
                  .HasForeignKey<OcupanteBanca>(o => o.BancadaId);
        });
        modelBuilder.Entity<OcupanteBanca>(entity =>
        {
            // Opcional: puede definir un índice
            entity.HasIndex(o => o.BancadaId).IsUnique();
        });
        modelBuilder.Entity<LogoAgrupacionCategoria>(entity =>
        {
            // La combinación de las tres columnas debe ser única.
            entity.HasIndex(l => new { l.AgrupacionPoliticaId, l.CategoriaId, l.AmbitoGeograficoId }).IsUnique();
        });
    }
}