/**
 * Utilitários para a camada de serviços (DAL).
 * Centraliza a lógica de alternância entre Mocks e API Real.
 */

// Define se o sistema deve usar mocks ou API real.
// Prioriza o .env, mas permite fallback para mock em desenvolvimento.
export const USE_MOCK = import.meta.env.VITE_USE_MOCK === 'true';

/**
 * Simula latência de rede para uma experiência mais realista com Mocks.
 * @param {any} data - Os dados que seriam retornados.
 * @param {number} ms - Tempo em milissegundos.
 */
export const simulateLatency = (data, ms = 800) => {
  console.log(`[MOCK] Simulating latency ${ms}ms for`, data);
  return new Promise((res) => setTimeout(() => res(data), ms));
};

/**
 * Helper para abstrair a decisão entre Mock e API.
 * @param {Object} options - Opções da requisição.
 * @param {Function} options.mockFn - Função que retorna o mock (deve retornar uma Promise).
 * @param {Function} options.apiFn - Função que faz a chamada real via Axios.
 */
export const handleRequest = async ({ mockFn, apiFn }) => {
  if (USE_MOCK && mockFn) {
    console.log('[Service] Using MOCK');
    return mockFn();
  }
  
  console.log('[Service] Calling API Real');
  console.log('[Service] USE_MOCK value:', USE_MOCK);
  
  try {
    const response = await apiFn();
    console.log('[Service] API Response received:', response);
    // Padroniza o retorno para sempre devolver os dados
    if (response === null || response === undefined) {
      console.log('[Service] Response is null/undefined');
      return null;
    }
    // Se a resposta já é um array ou objeto mapeado, retorna direto
    // Se é uma resposta Axios, extrai .data
    const result = response.data !== undefined && !Array.isArray(response) ? response.data : response;
    console.log('[Service] Returning result:', result);
    return result;
  } catch (error) {
    console.error('[Service] API Error:', error);
    console.error('[Service] Error details:', {
      message: error.message,
      response: error.response,
      status: error.response?.status,
      data: error.response?.data
    });
    throw error;
  }
};
