// src/types/types.ts

// Tipos para la respuesta de la API de resultados por municipio
export interface AgrupacionResultadoDto {
  nombre: string;
  votos: number;
  porcentaje: number;
}

export interface VotosAdicionalesDto {
  enBlanco: number;
  nulos: number;
  recorridos: number;
}

export interface MunicipioResultadosDto {
  municipioNombre: string;
  ultimaActualizacion: string;
  porcentajeEscrutado: number;
  porcentajeParticipacion: number;
  resultados: AgrupacionResultadoDto[];
  votosAdicionales: VotosAdicionalesDto;
}

// Tipo para la respuesta del endpoint del mapa
export interface MapaDto {
  ambitoId: number;
  departamentoNombre: string;
  agrupacionGanadoraId: string;
}

// Definición de tipo para los objetos de geografía de react-simple-maps
export interface GeographyObject {
  rsmKey: string;
  properties: {
    // CORRECCIÓN: Se cambia 'nombre' por 'NAME_2' para coincidir con el archivo topojson
    NAME_2: string;
    [key: string]: any; // Permite otras propiedades que puedan venir
  };
}

export interface MunicipioSimple { id: string; nombre: string; camarasDisponibles?: ('diputados' | 'senadores')[];}

export interface ResultadoTicker {
  id: string;
  nombre: string;
  nombreCorto: string | null;
  color: string | null;
  logoUrl: string | null;
  votos: number;
  porcentaje: number;
  nombreCandidato?: string | null;
}

export interface EstadoRecuentoTicker {
    mesasTotalizadasPorcentaje: number;
    participacionPorcentaje: number;
}

export interface CategoriaResumen {
  categoriaId: number;
  categoriaNombre: string;
  estadoRecuento: EstadoRecuentoTicker | null;
  resultados: ResultadoTicker[];
}

export interface VotosAdicionales { enBlanco: number; nulos: number; recurridos: number; }

export interface MunicipioDetalle {
  municipioNombre: string;
  ultimaActualizacion: string;
  porcentajeEscrutado: number;
  porcentajeParticipacion: number;
  resultados: CategoriaResumen[];
  votosAdicionales: VotosAdicionales;
}

export interface ResumenProvincial {
  provinciaNombre: string;
  ultimaActualizacion: string;
  porcentajeEscrutado: number;
  porcentajeParticipacion: number;
  resultados: CategoriaResumen[];
  votosAdicionales: VotosAdicionales;
}

export interface Banca {
  agrupacionNombre: string;
  bancas: number;
  [key: string]: string | number;
}

export interface ProyeccionBancas {
  seccionNombre: string;
  proyeccion: Banca[];
}

export interface TelegramaData {
  id: string;
  ambitoGeograficoId: number;
  contenidoBase64: string;
  fechaEscaneo: string;
  fechaTotalizacion: string;
}

export interface CatalogoItem {
  id: string;
  nombre: string;
}

export interface ApiResponseResultadosPorSeccion {
    ultimaActualizacion: string;
    resultados: ResultadoTicker[];
}

export interface ResultadoTablaAgrupacion {
  id: string;
  nombre: string;
  nombreCorto: string | null;
  porcentaje: number;
}

export interface ResultadoTablaCategoria {
  categoriaId: number;
  categoriaNombre: string;
  resultados: ResultadoTablaAgrupacion[];
}

export interface TablaDetalladaPartidoPrincipal {
  id: string;
  nombre: string;
}

export interface TablaDetalladaResultadoPartido {
  id: string;
  porcentaje: number;
}

export interface TablaDetalladaResultadoCategoria {
  categoriaId: number;
  partidos: TablaDetalladaResultadoPartido[];
}

export interface TablaDetalladaResultadoMunicipio {
  municipioId: number;
  municipioNombre: string;
  resultadosPorCategoria: TablaDetalladaResultadoCategoria[];
}

export interface PartidoPrincipalDetalle {
  puesto: number;
  id: string;
  nombre: string;
  porcentajeTotalSeccion: number;
}

export interface ApiResponseTablaDetallada {
  categorias: { id: number; nombre: string }[];
  partidosPorCategoria: { [catId: string]: PartidoPrincipalDetalle[] };
  resultadosPorMunicipio: {
    municipioId: number;
    municipioNombre: string;
    celdas: { [catId: string]: { [partidoId: string]: number } };
  }[];
}

export interface TablaDetalladaPartidoPrincipal {
  id: string;
  nombre: string;
}

export interface TablaDetalladaResultadoPartido {
  id: string;
  porcentaje: number;
}

export interface TablaDetalladaResultadoCategoria {
  categoriaId: number;
  partidos: TablaDetalladaResultadoPartido[];
}

export interface TablaDetalladaResultadoMunicipio {
  municipioId: number;
  municipioNombre: string;
  resultadosPorCategoria: TablaDetalladaResultadoCategoria[];
}

export interface RankingPartido {
  nombreCorto: string;
  porcentaje: number;
}

export interface RankingCategoria {
  categoriaId: number;
  ranking: RankingPartido[];
}

export interface ApiResponseRankingSeccion {
  categorias: { id: number; nombre: string }[];
  resultados: RankingMunicipio[];
}

export interface RankingPartido {
  nombreCorto: string;
  porcentaje: number;
}

export interface RankingCategoria {
  ranking: RankingPartido[];
}

export interface RankingMunicipio {
  municipioId: number;
  municipioNombre: string;
  resultadosPorCategoria: { [catId: string]: RankingCategoria };
}

export interface ApiResponseRankingMunicipio {
  categorias: { id: number; nombre: string }[];
  resultados: RankingMunicipio[];
}