import api from './api';
import { handleRequest, simulateLatency } from './serviceUtils';

/**
 * Service de Despesas V2 (Financeiro_V2)
 * Conecta com o backend em Python seguindo as rotas solicitadas.
 */
export const workspaceDespesasV2Service = {
  /**
   * Busca todas as despesas (entradas planejadas)
   * GET /despesas/apresentar
   */
  fetchDespesas: (filters = {}) => handleRequest({
    mockFn: () => simulateLatency([]),
    apiFn: async () => {
      const response = await api.get('/despesas/apresentar', { params: filters });
      const raw = response?.data;
      let list = [];
      
      if (Array.isArray(raw)) {
        list = raw;
      } else if (raw?.Base_Dados_API !== undefined) {
        list = Array.isArray(raw.Base_Dados_API) ? raw.Base_Dados_API : Object.values(raw.Base_Dados_API);
      } else if (raw && typeof raw === 'object') {
        list = Object.values(raw);
      }
      
      return list.map(item => ({
        id: item.idDespesa || item.id,
        idDespesa: item.idDespesa || item.id,
        data: item.data || '',
        contaDespesa: item.contaDespesa || '',
        numeroReferencia: item.numeroReferencia || '',
        nomeFornecedor: item.nomeFornecedor || '',
        pagoPorMeioDe: item.pagoPorMeioDe || '',
        nomeCliente: item.nomeCliente || item.cliente || '',
        status: item.status || 'PENDENTE',
        montante: Number(item.montante || 0),
        categoria: item.categoria || '',
        descricao: item.descricao || '',
        metodoPagamento: item.metodoPagamento || item.pagoPorMeioDe || '',
        data_lancamento: item.data_lancamento || item.data_lacamento || '',
        ...item
      }));
    }
  }),

  /**
   * Cria uma nova despesa
   * POST /despesas/create
   */
  createDespesa: (payload) => handleRequest({
    mockFn: () => simulateLatency({ success: true, idDespesa: Date.now() }),
    apiFn: async () => {
      const response = await api.post('/despesas/create', payload);
      return response.data;
    }
  }),

  /**
   * Edita uma despesa existente
   * POST /despesas/edit
   */
  updateDespesa: (payload) => handleRequest({
    mockFn: () => simulateLatency({ success: true }),
    apiFn: async () => {
      const response = await api.post('/despesas/edit', payload);
      return response.data;
    }
  }),

  /**
   * Exclui uma despesa
   * DELETE /despesas/delete
   */
  deleteDespesa: (idDespesa) => handleRequest({
    mockFn: () => simulateLatency({ success: true }),
    apiFn: async () => {
      const response = await api.delete('/despesas/delete', {
        data: { idDespesa }
      });
      return response.data;
    }
  }),

  /**
   * Busca itens de uma despesa (Diário)
   * GET /despesas_diario/apresentar?idDespesa=<idDespesa>
   */
  fetchItensDespesa: (idDespesa) => handleRequest({
    mockFn: () => simulateLatency([]),
    apiFn: async () => {
      const response = await api.get('/despesas_diario/apresentar', {
        params: { idDespesa }
      });
      const raw = response?.data;
      let list = [];
      
      if (Array.isArray(raw)) {
        list = raw;
      } else if (raw?.Base_Dados_API !== undefined) {
        list = Array.isArray(raw.Base_Dados_API) ? raw.Base_Dados_API : Object.values(raw.Base_Dados_API);
      } else if (raw && typeof raw === 'object') {
        list = Object.values(raw);
      }
      
      return list.map(item => ({
        id: item.idDiario || item.id,
        idDiario: item.idDiario || item.id,
        idDespesa: item.idDespesa || idDespesa,
        conta: item.conta || '',
        debito: Number(item.debito || 0),
        credito: Number(item.credito || 0),
        ...item
      }));
    }
  }),

  /**
   * Cria item de diário dentro de uma despesa
   * POST /despesas_diario/create
   * Payload: idDespesa, conta, debito, credito
   */
  createItemDespesa: (payload) => handleRequest({
    mockFn: () => simulateLatency({ success: true, idDiario: Date.now() }),
    apiFn: async () => {
      const cleanPayload = {
        idDespesa: payload.idDespesa,
        conta: payload.conta,
        debito: payload.debito,
        credito: payload.credito
      };
      const response = await api.post('/despesas_diario/create', cleanPayload);
      return response.data;
    }
  }),

  /**
   * Edita item de diário
   * POST /despesas_diario/edit
   * Payload: idDiario, conta, debito, credito
   */
  updateItemDespesa: (payload) => handleRequest({
    mockFn: () => simulateLatency({ success: true }),
    apiFn: async () => {
      const cleanPayload = {
        idDiario: payload.idDiario,
        conta: payload.conta,
        debito: payload.debito,
        credito: payload.credito
      };
      const response = await api.post('/despesas_diario/edit', cleanPayload);
      return response.data;
    }
  }),

  /**
   * Exclui item de diário
   * DELETE /despesas_diario/delete
   */
  deleteItemDespesa: (idDiario) => handleRequest({
    mockFn: () => simulateLatency({ success: true }),
    apiFn: async () => {
      const response = await api.delete('/despesas_diario/delete', {
        data: { idDiario }
      });
      return response.data;
    }
  }),

  /**
   * Busca totalizador de despesas diárias
   * GET /despesas_diario/total?idDespesa=...
   */
  fetchTotalItensDespesa: (idDespesa) => handleRequest({
    apiFn: () => api.get('/despesas_diario/total', { params: { idDespesa } })
  }),

  /**
   * Busca totalizador de despesas gerais
   * GET /despesas/total
   */
  fetchTotalDespesas: () => handleRequest({
    apiFn: () => api.get('/despesas/total')
  })
};
