import { toast } from 'sonner';

/**
 * Handles API errors for GR module operations, displaying user-friendly toast messages.
 * 
 * @param {Error} error - The error object caught from the try-catch block.
 * @param {string} defaultMessage - Fallback message if no specific error can be parsed.
 */
export const handleGrError = (error, defaultMessage = "Ocorreu um erro inesperado.") => {
  console.error("GR [ERROR]:", error);

  let message = defaultMessage;
  let description = "";
  let status = error.response?.status;

  // 1. Redirecionamento para 401 e 403 (Segurança)
  if (status === 401 || status === 403) {
    toast.error("Sessão expirada ou acesso negado", {
      description: "Por segurança, você será redirecionado para a tela de login."
    });
    
    // Pequeno delay para o usuário ler a mensagem antes do redirect
    setTimeout(() => {
      window.location.href = '/plataforma/gr/login';
    }, 2000);
    return;
  }

  // 2. Extração e Sanitização da mensagem do Backend
  if (error.response?.data) {
    const data = error.response.data;
    
    // Tenta extrair mensagem de vários formatos comuns (FastAPI detail, erro, message, etc)
    let rawMessage = '';
    
    if (data.detail) {
      if (Array.isArray(data.detail)) {
        rawMessage = data.detail.map(d => `${d.loc[d.loc.length - 1]}: ${d.msg}`).join(', ');
      } else if (typeof data.detail === 'string') {
        rawMessage = data.detail;
      }
    }
    
    if (!rawMessage) {
      rawMessage = data.erro || data.message || data.error || '';
    }
    
    // Lista de termos que indicam exposição de código ou logs técnicos
    const technicalTerms = ['sql', 'exception', 'traceback', 'internal server error', 'undefined', 'null', 'nan', '{', '[', 'stack', 'database', 'query'];
    
    if (rawMessage && !technicalTerms.some(term => String(rawMessage).toLowerCase().includes(term))) {
      // Se tivermos uma mensagem amigável do backend, usamos como descrição detalhada
      description = rawMessage;
    } else if (rawMessage) {
      // Se a mensagem parecer técnica, usamos um fallback amigável
      message = "Erro no processamento";
      description = "Não foi possível completar a operação devido a um erro interno. Por favor, tente novamente.";
    }
  }

  // 3. Tratamento amigável por Status Code
  switch (status) {
    case 400:
      // Se não tiver descrição da sanitização, coloca uma padrão mais amigável
      if (!description) description = "Verifique se todos os campos obrigatórios foram preenchidos corretamente e tente salvar novamente.";
      break;
    case 409:
      message = "Conflito de Informações";
      if (!description) description = "Este registro já existe ou há um conflito com os dados enviados (ex: CPF já cadastrado).";
      break;
    case 404:
      message = "Informação não encontrada";
      description = "O registro ou a página que você está tentando acessar não foi localizado ou pode ter sido removido.";
      break;
    case 500:
    case 502:
      message = "Sistema em Manutenção";
      description = "O serviço está temporariamente indisponível. Nossa equipe técnica já foi notificada.";
      break;
    default:
      if (!error.response) {
        if (error.code === 'ECONNABORTED' || error.message?.toLowerCase().includes('timeout')) {
          message = "Tempo de Resposta Excedido";
          description = "O servidor demorou muito para responder. Por favor, verifique sua conexão ou tente novamente via tela de configuração.";
        } else {
          message = "Falha na Rede";
          description = "Não conseguimos conectar ao servidor. Verifique sua conexão com a internet.";
        }
      }
      break;
  }


  // 4. Exibição via Sonner de forma Premium
  toast.error(message, {
    description: description,
    duration: 5000,
  });
};
