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

/**
 * @typedef {Object} EntradaPlanejada
 * @property {number} idempresa
 * @property {string} dataCriacao
 * @property {string} dataEstimativa
 * @property {string} numeroReferencia
 * @property {string} cliente
 * @property {string} nomeClienteCompleto
 * @property {string} vendedor
 * @property {string} status
 * @property {number} total
 * @property {number} subtotal
 * @property {number} desconto
 * @property {string} observacoes
 * @property {string} emailDestinatario
 * @property {string} termosCondicoes
 * @property {string} enderecoCobranca
 * @property {string} enderecoEntrega
 */

/**
 * @typedef {Object} ItemEntradaPlanejada
 * @property {number} identradas_planejadas_itens
 * @property {number} idEntrada
 * @property {string} item
 * @property {number} quantidade
 * @property {number} preco
 * @property {number} montante
 */

/**
 * Service de Entradas Planejadas para o ambiente Workspace
 * Gerencia comunicação com as rotas de entradas planejadas e seus itens
 * Baseado no padrão do workspaceReceitasService
 */
export const workspaceEntradasPlanejadasService = {
  /**
   * Busca todas as entradas planejadas
   * Rota: GET /entradas_planejadas
   * @returns {Promise<EntradaPlanejada[]>}
   */
  fetchEntradasPlanejadas: () => handleRequest({
    mockFn: () => simulateLatency([]),
    apiFn: async () => {
      const response = await api.get('/entradas_planejadas');
      const raw = response?.data;
      let list = [];
      
      if (Array.isArray(raw)) {
        list = raw;
      } else if (raw?.Base_Dados_API !== undefined) {
        const base = raw.Base_Dados_API;
        list = Array.isArray(base) ? base : (typeof base === 'object' && base !== null ? Object.values(base) : []);
      } else if (raw && typeof raw === 'object') {
        list = Object.values(raw);
      }
      
      // Normalização dos dados
      return list.map(item => ({
        id: item.id || item.idempresa || item.identradas_planejadas || `EST-${item.numeroReferencia || ''}`,
        idempresa: item.idempresa || item.identradas_planejadas || item.id,

        dataCriacao: item.dataCriacao || '',
        dataEstimativa: item.dataEstimativa || '',
        numeroReferencia: item.numeroReferencia || '',
        cliente: item.cliente || '',
        nomeClienteCompleto: item.nomeClienteCompleto || item.cliente || '',
        vendedor: item.vendedor || '',
        status: item.status || 'RASCUNHO',
        total: Number(item.total || 0),
        subtotal: Number(item.subtotal || 0),
        desconto: Number(item.desconto || 0),
        observacoes: item.observacoes || '',
        emailDestinatario: item.emailDestinatario || '',
        termosCondicoes: item.termosCondicoes || 'Sem termos e condições',
        enderecoCobranca: item.enderecoCobranca || '',
        enderecoEntrega: item.enderecoEntrega || '',
        itens: item.itens || [],
        ...item
      }));
    }
  }),

  /**
   * Cria nova entrada planejada
   * Rota: POST /entradas_planejadas/create
   * @param {Object} payload - Dados completos da entrada planejada
   * @returns {Promise<any>}
   */
  createEntradaPlanejada: (payload) => handleRequest({
    mockFn: () => simulateLatency({ success: true, idempresa: Date.now() }),
    apiFn: async () => {
      // Remove itens do payload para garantir que a entrada seja criada isoladamente
      const { itens, ...parentData } = payload;
      const response = await api.post('/entradas_planejadas/create', parentData);
      return response.data;
    }
  }),


  /**
   * Edita entrada planejada existente
   * Rota: PUT /entradas_planejadas/update/<idempresa>
   * @param {number} idempresa - ID da entrada planejada
   * @param {Object} payload - Dados completos da entrada planejada
   * @returns {Promise<any>}
   */
  updateEntradaPlanejada: (idempresa, payload) => handleRequest({
    mockFn: () => simulateLatency({ success: true }),
    apiFn: async () => {
      // Remove itens do payload para garantir que a entrada seja atualizada isoladamente
      const { itens, ...parentData } = payload;
      const response = await api.put(`/entradas_planejadas/update/${idempresa}`, parentData);
      return response.data;
    }
  }),


  /**
   * Exclui entrada planejada
   * Rota: DELETE /entradas_planejadas/delete/<idempresa>
   * @param {number} idempresa - ID da entrada planejada
   * @returns {Promise<any>}
   */
  deleteEntradaPlanejada: (idempresa) => handleRequest({
    mockFn: () => simulateLatency({ success: true }),
    apiFn: async () => {
      const response = await api.delete(`/entradas_planejadas/delete/${idempresa}`);
      return response.data;
    }
  }),

  /**
   * Busca itens de uma entrada planejada
   * Rota: GET /entradas_planejadas_itens/apresentar?idEntrada=<idEntrada>
   * @param {number} idEntrada - ID da entrada planejada
   * @returns {Promise<ItemEntradaPlanejada[]>}
   */
  fetchItensEntradaPlanejada: (idEntrada) => handleRequest({
    mockFn: () => simulateLatency([]),
    apiFn: async () => {
      const response = await api.get('/entradas_planejadas_itens/apresentar', {
        params: { idEntrada }
      });
      const raw = response?.data;
      let list = [];
      
      if (Array.isArray(raw)) {
        list = raw;
      } else if (raw?.Base_Dados_API !== undefined) {
        const base = raw.Base_Dados_API;
        list = Array.isArray(base) ? base : (typeof base === 'object' && base !== null ? Object.values(base) : []);
      } else if (raw && typeof raw === 'object') {
        list = Object.values(raw);
      }
      
      return list.map(item => ({
        id: item.identradas_planejadas_itens || item.id,
        identradas_planejadas_itens: item.identradas_planejadas_itens || item.id,
        idEntrada: item.idEntrada || idEntrada,
        item: item.item || '',
        quantidade: Number(item.quantidade || 0),
        preco: Number(item.preco || 0),
        montante: Number(item.montante || 0),
        ...item
      }));
    }
  }),

  /**
   * Cria novo item em uma entrada planejada
   * Rota: POST /entradas_planejadas_itens/create
   * @param {Object} payload - { idEntrada, item, quantidade, preco, montante }
   * @returns {Promise<any>}
   */
  createItemEntradaPlanejada: (payload) => handleRequest({
    mockFn: () => simulateLatency({ success: true, identradas_planejadas_itens: Date.now() }),
    apiFn: async () => {
      const response = await api.post('/entradas_planejadas_itens/create', payload);
      return response.data;
    }
  }),

  /**
   * Edita item de uma entrada planejada
   * Rota: PUT /entradas_planejadas_itens/update/<id>
   * @param {number} id - ID do item
   * @param {Object} payload - { idEntrada, item, quantidade, preco, montante }
   * @returns {Promise<any>}
   */
  updateItemEntradaPlanejada: (id, payload) => handleRequest({
    mockFn: () => simulateLatency({ success: true }),
    apiFn: async () => {
      const response = await api.put(`/entradas_planejadas_itens/update/${id}`, payload);
      return response.data;
    }
  }),

  /**
   * Exclui item de uma entrada planejada
   * Rota: DELETE /entradas_planejadas_itens/delete/<id>
   * @param {number} id - ID do item
   * @returns {Promise<any>}
   */
  deleteItemEntradaPlanejada: (id) => handleRequest({
    mockFn: () => simulateLatency({ success: true }),
    apiFn: async () => {
      const response = await api.delete(`/entradas_planejadas_itens/delete/${id}`);
      return response.data;
    }
  })
};
