// src/services/apiService.ts
import axios from 'axios';
import { triggerLogout } from '../context/authUtils';
import type { CandidatoOverride, AgrupacionPolitica, UpdateAgrupacionData, Bancada, LogoAgrupacionCategoria, MunicipioSimple } from '../types';

/**
 * URL base para las llamadas a la API.
 * Se usa para construir las URLs más específicas.
 */
const API_URL_BASE = import.meta.env.DEV
  ? 'http://localhost:5217/api'
  : 'https://elecciones2025.eldia.com/api';

/**
 * URL completa para el endpoint de autenticación.
 */
export const AUTH_API_URL = `${API_URL_BASE}/auth`;

/**
 * URL completa para los endpoints de administración.
 */
export const ADMIN_API_URL = `${API_URL_BASE}/admin`;

const adminApiClient = axios.create({
  baseURL: ADMIN_API_URL,
});

// --- INTERCEPTORES ---

// Interceptor de Peticiones: Añade el token JWT a cada llamada
adminApiClient.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem('admin-jwt-token');
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    return config;
  },
  (error) => Promise.reject(error)
);

// Interceptor de Respuestas: Maneja la expiración del token (error 401)
adminApiClient.interceptors.response.use(
  (response) => response,
  (error) => {
    if (axios.isAxiosError(error) && error.response?.status === 401) {
      console.log("Token expirado o inválido. Deslogueando...");
      triggerLogout();
    }
    return Promise.reject(error);
  }
);

// --- SERVICIOS DE API ---

// 1. Autenticación
export interface LoginCredentials { username: string; password: string; }

export const loginUser = async (credentials: LoginCredentials): Promise<string | null> => {
  try {
    const response = await axios.post(`${AUTH_API_URL}/login`, credentials);
    return response.data.token;
  } catch (error) {
    console.error("Error during login request:", error);
    throw error;
  }
};

// 2. Agrupaciones Políticas
export const getAgrupaciones = async (): Promise<AgrupacionPolitica[]> => {
  const response = await adminApiClient.get('/agrupaciones');
  return response.data;
};

export const updateAgrupacion = async (id: string, data: UpdateAgrupacionData): Promise<void> => {
  await adminApiClient.put(`/agrupaciones/${id}`, data);
};

// 3. Ordenamiento de Agrupaciones
export const updateOrden = async (camara: 'diputados' | 'senadores', ids: string[]): Promise<void> => {
  await adminApiClient.put(`/agrupaciones/orden-${camara}`, ids);
};

// 4. Gestión de Bancas y Ocupantes
export const getBancadas = async (camara: 'diputados' | 'senadores'): Promise<Bancada[]> => {
  const camaraId = camara === 'diputados' ? 0 : 1;
  const response = await adminApiClient.get(`/bancadas/${camaraId}`);
  return response.data;
};

export interface UpdateBancadaData {
  agrupacionPoliticaId: string | null;
  nombreOcupante: string | null;
  fotoUrl: string | null;
  periodo: string | null;
}

export const updateBancada = async (bancadaId: number, data: UpdateBancadaData): Promise<void> => {
  await adminApiClient.put(`/bancadas/${bancadaId}`, data);
};

// 5. Configuración General
export type ConfiguracionResponse = Record<string, string>;

export const getConfiguracion = async (): Promise<ConfiguracionResponse> => {
  const response = await adminApiClient.get('/configuracion');
  return response.data;
};

export const updateConfiguracion = async (data: Record<string, string>): Promise<void> => {
  await adminApiClient.put('/configuracion', data);
};

export const getLogos = async (): Promise<LogoAgrupacionCategoria[]> => {
  const response = await adminApiClient.get('/logos');
  return response.data;
};

export const updateLogos = async (data: LogoAgrupacionCategoria[]): Promise<void> => {
  await adminApiClient.put('/logos', data);
};

export const getMunicipiosForAdmin = async (): Promise<MunicipioSimple[]> => {
  // Ahora usa adminApiClient, que apunta a /api/admin/
  // La URL final será /api/admin/catalogos/municipios
  const response = await adminApiClient.get('/catalogos/municipios');
  return response.data;
};

// 6. Overrides de Candidatos
export const getCandidatos = async (): Promise<CandidatoOverride[]> => {
  const response = await adminApiClient.get('/candidatos');
  return response.data;
};

export const updateCandidatos = async (data: CandidatoOverride[]): Promise<void> => {
  await adminApiClient.put('/candidatos', data);
};

// 7. Gestión de Logging
export interface UpdateLoggingLevelData {
  level: string;
}

export const updateLoggingLevel = async (data: UpdateLoggingLevelData): Promise<void> => {
  // Este endpoint es específico, no es parte de la configuración general
  await adminApiClient.put(`/logging-level`, data);
};