// src/types/types.ts
import type { Feature as GeoJsonFeature, Geometry } from 'geojson';

// --- TIPOS GEOGRÁFICOS Y DE MAPAS ---
export interface GeoProperties {
  nombre: string;
  id: string;
  [key: string]: any;
}
export type AmbitoGeography = GeoJsonFeature<Geometry, GeoProperties> & { rsmKey: string };
export interface GeographyObject {
  rsmKey: string;
  properties: {
    NAME_2: string;
    [key: string]: any;
  };
}
export interface MapaDto {
  ambitoId: number;
  departamentoNombre: string;
  agrupacionGanadoraId: string;
}

// --- TIPOS DE RESPUESTAS DE API ---
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;
}
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 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[];
}

// --- TIPOS PARA TABLAS DE RANKING ---
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 RankingPartido {
  nombreCorto: string;
  porcentaje: number;
  votos: number;
}
export interface RankingCategoria {
  categoriaId: number;
  ranking: RankingPartido[];
}
export interface ApiResponseRankingSeccion {
  categorias: { id: number; nombre: string }[];
  resultados: RankingMunicipio[];
}
export interface RankingMunicipio {
  municipioId: number;
  municipioNombre: string;
  resultadosPorCategoria: { [catId: string]: { ranking: { nombreCorto: string; porcentaje: number }[] } };
}
export interface ApiResponseRankingMunicipio {
  categorias: { id: number; nombre: string }[];
  resultados: RankingMunicipio[];
}

// --- TIPOS PARA PANEL ELECTORAL ---
export interface ResultadoMapaDto {
  ambitoId: string;
  ambitoNombre: string;
  agrupacionGanadoraId: string;
  colorGanador: string;
}
export interface PanelElectoralDto {
  ambitoNombre: string;
  mapaData: ResultadoMapaDto[];
  resultadosPanel: ResultadoTicker[];
  estadoRecuento: EstadoRecuentoTicker;
  sinDatos?: boolean;
}

// --- TIPOS PARA EL WIDGET DE TARJETAS NACIONALES ---
// Definición correcta y más completa. Reemplaza a EstadoRecuentoTicker.
export interface EstadoRecuentoDto {
  participacionPorcentaje: number;
  mesasTotalizadasPorcentaje: number;
  cantidadVotantes: number;
}

// Definición para los resultados en las tarjetas.
export interface ResultadoCandidato {
  agrupacionId: string;
  nombreAgrupacion: string; // Nombre completo
  nombreCortoAgrupacion: string | null; // <-- AÑADIR ESTA LÍNEA
  nombreCandidato: string | null;
  fotoUrl: string | null;
  color: string | null;
  porcentaje: number;
  votos: number;
  bancasObtenidas?: number; 
}

// Definición para una categoría.
export interface CategoriaResumen {
  categoriaId: number;
  categoriaNombre: string;
  estadoRecuento: EstadoRecuentoDto | null;
  resultados: ResultadoCandidato[];
}

// Definición para el objeto de una provincia.
export interface ResumenProvincia {
  provinciaId: string;
  provinciaNombre: string;
  categorias: CategoriaResumen[];
}

export interface CategoriaResumenHome {
    categoriaId: number;
    categoriaNombre: string;
    estadoRecuento: EstadoRecuentoDto | null;
    resultados: ResultadoCandidato[];
    votosEnBlanco: number;
    votosEnBlancoPorcentaje: number;
    votosTotales: number;
    ultimaActualizacion: string;
}