// src/apiService.ts
import axios from 'axios';
import type { ProyeccionBancas, MunicipioSimple, TelegramaData, CatalogoItem, CategoriaResumen, ResultadoTicker, ApiResponseResultadosPorSeccion } from './types/types';

const API_BASE_URL = 'https://elecciones2025.eldia.com/api';

// Determina la URL base para los activos (imágenes, etc.)
// Si estamos en desarrollo (npm run dev), usa una ruta relativa a la raíz.
// Si estamos en producción (npm run build), usa la URL completa del servidor de widgets.
export const assetBaseUrl = import.meta.env.DEV 
  ? '' 
  : 'https://elecciones2025.eldia.com';

const apiClient = axios.create({
  baseURL: API_BASE_URL,
  headers: { 'Content-Type': 'application/json' },
});

interface PartidoData {
  id: string;
  nombre: string;
  nombreCorto: string | null;
  bancasTotales: number;
  color: string | null;
}

interface CamaraData {
  camaraNombre: string;
  totalBancas: number;
  bancasEnJuego: number;
  partidos: PartidoData[];
  presidenteBancada: { color: string | null } | null;
}

export interface ComposicionData {
  diputados: CamaraData;
  senadores: CamaraData;
}

export interface OcupanteBanca {
  id: number;
  nombreOcupante: string;
  fotoUrl: string | null;
  periodo: string | null;
}

interface PartidoData {
  id: string;
  nombre: string;
  nombreCorto: string | null;
  bancasTotales: number;
  color: string | null;
  ocupantes: OcupanteBanca[];
}

export interface BancadaDetalle {
  id: number; // Este es el ID de la Bancada
  camara: number; // 0 o 1
  numeroBanca: number;
  agrupacionPoliticaId: string | null;
  ocupante: OcupanteBanca | null;
}

export interface ConfiguracionPublica {
  TickerResultadosCantidad?: string;
  ConcejalesResultadosCantidad?: string;
  // ... otras claves públicas que pueda añadir en el futuro
}

export interface ResultadoDetalleSeccion {
  id: string; // ID de la agrupación para la key
  nombre: string;
  votos: number;
  porcentaje: number;
  color: string | null;
}

export const getResumenProvincial = async (): Promise<CategoriaResumen[]> => {
  const response = await apiClient.get('/resultados/provincia/02');
  return response.data;
};

export const getBancasPorSeccion = async (seccionId: string): Promise<ProyeccionBancas> => {
  const response = await apiClient.get(`/resultados/bancas/${seccionId}`);
  return response.data;
};

/**
 * Obtiene la lista de Secciones Electorales desde la API.
 */
export const getSeccionesElectorales = async (categoriaId?: number): Promise<MunicipioSimple[]> => {
  let url = '/catalogos/secciones-electorales';
  // Si se proporciona una categoría, la añadimos a la URL
  if (categoriaId) {
    url += `?categoriaId=${categoriaId}`;
  }
  const response = await apiClient.get(url);
  return response.data;
};

/**
 * Obtiene los datos completos de un telegrama por su ID de mesa.
 */
export const getTelegramaPorId = async (mesaId: string): Promise<TelegramaData> => {
  const response = await apiClient.get(`/telegramas/${mesaId}`);
  return response.data;
};

export const getSecciones = async (): Promise<CatalogoItem[]> => {
  const response = await apiClient.get('/catalogos/secciones');
  return response.data;
};

export const getMunicipiosPorSeccion = async (seccionId: string): Promise<CatalogoItem[]> => {
  const response = await apiClient.get(`/catalogos/municipios/${seccionId}`);
  return response.data;
};

export const getCircuitosPorMunicipio = async (municipioId: string): Promise<CatalogoItem[]> => {
  const response = await apiClient.get(`/catalogos/circuitos/${municipioId}`);
  return response.data;
};

export const getEstablecimientosPorCircuito = async (circuitoId: string): Promise<CatalogoItem[]> => {
  const response = await apiClient.get(`/catalogos/establecimientos/${circuitoId}`);
  return response.data;
};

export const getMesasPorEstablecimiento = async (establecimientoId: string): Promise<CatalogoItem[]> => {
  const response = await apiClient.get(`/catalogos/mesas/${establecimientoId}`);
  return response.data;
};

export const getComposicionCongreso = async (): Promise<ComposicionData> => {
  const response = await apiClient.get('/resultados/composicion-congreso');
  return response.data;
};

export const getBancadasDetalle = async (): Promise<BancadaDetalle[]> => {
  const response = await apiClient.get('/resultados/bancadas-detalle');
  return response.data;
};

export const getConfiguracionPublica = async (): Promise<ConfiguracionPublica> => {
  const response = await apiClient.get('/resultados/configuracion-publica');
  return response.data;
};

export const getResultadosPorSeccion = async (seccionId: string, categoriaId: number): Promise<ApiResponseResultadosPorSeccion> => {
  const response = await apiClient.get(`/resultados/seccion-resultados/${seccionId}?categoriaId=${categoriaId}`);
  return response.data;
};

export const getDetalleSeccion = async (seccionId: string, categoriaId: number): Promise<ResultadoDetalleSeccion[]> => {
  const response = await apiClient.get(`/resultados/seccion/${seccionId}?categoriaId=${categoriaId}`);
  return response.data;
};

export const getResultadosPorMunicipioYCategoria = async (municipioId: string, categoriaId: number): Promise<ResultadoTicker[]> => {
  const response = await apiClient.get(`/resultados/partido/${municipioId}?categoriaId=${categoriaId}`);
  return response.data.resultados;
};

export const getResultadosPorMunicipio = async (municipioId: string, categoriaId: number): Promise<ResultadoTicker[]> => {
  const response = await apiClient.get(`/resultados/partido/${municipioId}?categoriaId=${categoriaId}`);
  // La respuesta es un objeto, nosotros extraemos el array de resultados
  return response.data.resultados;
};

export const getMunicipios = async (categoriaId?: number): Promise<MunicipioSimple[]> => {
  let url = '/catalogos/municipios';
  if (categoriaId) {
    url += `?categoriaId=${categoriaId}`;
  }
  const response = await apiClient.get(url);
  // La API ahora devuelve { seccionId, nombre }, lo mapeamos a { id, nombre }
  return response.data.map((m: any) => ({ id: m.seccionId, nombre: m.nombre }));
};