import { useState, useEffect, useCallback } from 'react';
import { fornecedoresService } from '@/services/fornecedoresService';
import { toast } from 'sonner';

/**
 * Hook para gerenciar fornecedores no Financeiro V2
 * Gerencia estado, carregamento e operações CRUD
 */
export const useFornecedores = () => {
  const [fornecedores, setFornecedores] = useState([]);
  const [isLoading, setIsLoading] = useState(false);
  const [error, setError] = useState(null);

  /**
   * Carrega todos os fornecedores do backend
   */
  const loadFornecedores = useCallback(async () => {
    console.log('[useFornecedores] loadFornecedores chamado');
    setIsLoading(true);
    setError(null);
    
    try {
      console.log('[useFornecedores] Chamando fornecedoresService.fetchFornecedores()');
      const data = await fornecedoresService.fetchFornecedores();
      console.log('[useFornecedores] Dados recebidos do serviço:', data);
      
      // Normaliza os dados para o formato esperado pela view
      const normalized = Array.isArray(data) ? data.map(item => ({
        id: item.idfornecedores || item.id || null,
        idfornecedores: item.idfornecedores || item.id || null,
        nome: item.nome_da_empresa || item.nome || '',
        nome_exibicao: item.nome_da_empresa || item.nome || '',
        email: item.email || '',
        telefone: item.telefone || '',
        cpf_cnpj: item.cpf_cnpj || '',
        tipo_pessoa: item.tipo_pessoa || 'JURIDICA',
        servico: item.servico || '',
        valor: item.valor || 0,
        obs: item.obs || '',
        idregra: Array.isArray(item.idregra) ? item.idregra : (item.idregra ? [item.idregra] : (item.regra_id ? [item.regra_id] : [])),
        regra_id: item.idregra || item.regra_id || null,
        nome_regra: item.nome_regra || null,
        // Campos opcionais para compatibilidade
        status: item.status || 'Ativo',
        endereco: item.endereco || '',
        bairro: item.bairro || '',
        cidade: item.cidade || '',
        uf: item.uf || '',
        cep: item.cep || '',
        moeda_padrao: item.moeda_padrao || 'BRL',
        periodo_vencimento: item.periodo_vencimento || 'Pagar no recebimento',
        contasPagar: item.contasPagar || 0,
        creditosNaoUtilizados: item.creditosNaoUtilizados || 0
      })) : [];
      
      console.log('[useFornecedores] Fornecedores normalizados:', normalized.length, 'itens');
      setFornecedores(normalized);
    } catch (err) {
      console.error('[useFornecedores] Erro ao carregar fornecedores:', err);
      setError(err.message || 'Erro ao carregar fornecedores');
      toast.error('Erro ao carregar fornecedores');
      setFornecedores([]);
    } finally {
      setIsLoading(false);
      console.log('[useFornecedores] loadFornecedores finalizado');
    }
  }, []);

  /**
   * Cria um novo fornecedor
   * @param {Object} fornecedorData - Dados do fornecedor
   * @returns {Object|null} - Novo fornecedor criado ou null se falhou
   */
  const createFornecedor = useCallback(async (fornecedorData) => {
    // Validação de campos obrigatórios
    const camposObrigatorios = [];
    if (!fornecedorData.nome_da_empresa?.trim() && !fornecedorData.nome?.trim()) {
      camposObrigatorios.push('Nome da Empresa');
    }
    if (!fornecedorData.email?.trim()) {
      camposObrigatorios.push('E-mail');
    }
    if (!fornecedorData.cpf_cnpj?.trim()) {
      camposObrigatorios.push('CPF/CNPJ');
    }
    if (!fornecedorData.telefone?.trim()) {
      camposObrigatorios.push('Telefone');
    }

    if (camposObrigatorios.length > 0) {
      toast.error(`Campos obrigatórios: ${camposObrigatorios.join(', ')}`);
      return null;
    }

    try {
      const newFornecedor = await fornecedoresService.createFornecedor(fornecedorData);
      
      // Normaliza o retorno
      const normalized = {
        id: newFornecedor.idfornecedores || newFornecedor.id || Date.now(),
        idfornecedores: newFornecedor.idfornecedores || newFornecedor.id || Date.now(),
        nome: newFornecedor.nome_da_empresa || newFornecedor.nome || fornecedorData.nome_da_empresa || fornecedorData.nome || '',
        nome_exibicao: newFornecedor.nome_da_empresa || newFornecedor.nome || fornecedorData.nome_da_empresa || fornecedorData.nome || '',
        email: newFornecedor.email || fornecedorData.email || '',
        telefone: newFornecedor.telefone || fornecedorData.telefone || '',
        cpf_cnpj: newFornecedor.cpf_cnpj || fornecedorData.cpf_cnpj || '',
        tipo_pessoa: newFornecedor.tipo_pessoa || fornecedorData.tipo_pessoa || 'JURIDICA',
        servico: newFornecedor.servico || fornecedorData.servico || '',
        valor: newFornecedor.valor || fornecedorData.valor || 0,
        obs: newFornecedor.obs || fornecedorData.obs || '',
        idregra: Array.isArray(newFornecedor.idregra) ? newFornecedor.idregra : (newFornecedor.idregra ? [newFornecedor.idregra] : (fornecedorData.idregra ? (Array.isArray(fornecedorData.idregra) ? fornecedorData.idregra : [fornecedorData.idregra]) : [])),
        regra_id: newFornecedor.idregra || newFornecedor.regra_id || fornecedorData.idregra || fornecedorData.regra_id || null,
        status: 'Ativo',
        moeda_padrao: 'BRL',
        periodo_vencimento: 'Pagar no recebimento',
        contasPagar: 0,
        creditosNaoUtilizados: 0
      };
      
      setFornecedores(prev => [...prev, normalized]);
      toast.success('Fornecedor criado com sucesso!');
      return normalized;
    } catch (err) {
      console.error('Erro ao criar fornecedor:', err);
      toast.error('Erro ao criar fornecedor');
      return null;
    }
  }, []);

  /**
   * Atualiza um fornecedor existente
   * @param {number|string} id - idfornecedores
   * @param {Object} fornecedorData - Dados atualizados
   * @returns {Object|undefined} - Fornecedor atualizado ou undefined se falhou
   */
  const updateFornecedor = useCallback(async (id, fornecedorData) => {
    // Validação de campos obrigatórios
    const camposObrigatorios = [];
    if (!fornecedorData.nome_da_empresa?.trim() && !fornecedorData.nome?.trim()) {
      camposObrigatorios.push('Nome da Empresa');
    }
    if (!fornecedorData.email?.trim()) {
      camposObrigatorios.push('E-mail');
    }
    if (!fornecedorData.cpf_cnpj?.trim()) {
      camposObrigatorios.push('CPF/CNPJ');
    }
    if (!fornecedorData.telefone?.trim()) {
      camposObrigatorios.push('Telefone');
    }

    if (camposObrigatorios.length > 0) {
      toast.error(`Campos obrigatórios: ${camposObrigatorios.join(', ')}`);
      return undefined;
    }

    try {
      const updated = await fornecedoresService.updateFornecedor(id, fornecedorData);
      
      // Normaliza o retorno
      const normalized = {
        id: id,
        idfornecedores: id,
        nome: updated.nome_da_empresa || updated.nome || fornecedorData.nome_da_empresa || fornecedorData.nome || '',
        nome_exibicao: updated.nome_da_empresa || updated.nome || fornecedorData.nome_da_empresa || fornecedorData.nome || '',
        email: updated.email || fornecedorData.email || '',
        telefone: updated.telefone || fornecedorData.telefone || '',
        cpf_cnpj: updated.cpf_cnpj || fornecedorData.cpf_cnpj || '',
        tipo_pessoa: updated.tipo_pessoa || fornecedorData.tipo_pessoa || 'JURIDICA',
        servico: updated.servico || fornecedorData.servico || '',
        valor: updated.valor || fornecedorData.valor || 0,
        obs: updated.obs || fornecedorData.obs || '',
        idregra: Array.isArray(updated.idregra) ? updated.idregra : (updated.idregra ? [updated.idregra] : (fornecedorData.idregra ? (Array.isArray(fornecedorData.idregra) ? fornecedorData.idregra : [fornecedorData.idregra]) : [])),
        regra_id: updated.idregra || updated.regra_id || fornecedorData.idregra || fornecedorData.regra_id || null,
        // Preserva campos existentes
        status: fornecedorData.status || 'Ativo',
        endereco: fornecedorData.endereco || '',
        bairro: fornecedorData.bairro || '',
        cidade: fornecedorData.cidade || '',
        uf: fornecedorData.uf || '',
        cep: fornecedorData.cep || '',
        moeda_padrao: fornecedorData.moeda_padrao || 'BRL',
        periodo_vencimento: fornecedorData.periodo_vencimento || 'Pagar no recebimento',
        contasPagar: fornecedorData.contasPagar || 0,
        creditosNaoUtilizados: fornecedorData.creditosNaoUtilizados || 0
      };
      
      setFornecedores(prev => prev.map(f => f.id === id || f.idfornecedores === id ? normalized : f));
      toast.success('Fornecedor atualizado com sucesso!');
      return normalized;
    } catch (err) {
      console.error('Erro ao atualizar fornecedor:', err);
      toast.error('Erro ao atualizar fornecedor');
      return undefined;
    }
  }, []);

  /**
   * Exclui um fornecedor
   * @param {number|string} id - idfornecedores
   */
  const deleteFornecedor = useCallback(async (id) => {
    try {
      await fornecedoresService.deleteFornecedor(id);
      setFornecedores(prev => prev.filter(f => f.id !== id && f.idfornecedores !== id));
      toast.success('Fornecedor excluído com sucesso!');
    } catch (err) {
      console.error('Erro ao excluir fornecedor:', err);
      toast.error('Erro ao excluir fornecedor');
    }
  }, []);

  // Carrega fornecedores quando o hook é montado
  useEffect(() => {
    console.log('[useFornecedores] Hook montado, chamando loadFornecedores');
    loadFornecedores();
  }, [loadFornecedores]);

  return {
    state: {
      fornecedores,
      isLoading,
      error
    },
    actions: {
      loadFornecedores,
      createFornecedor,
      updateFornecedor,
      deleteFornecedor,
      fetchRegraAplicada: fornecedoresService.fetchRegraAplicada
    }
  };
};
