/**
 * Utilitários para tratar e traduzir erros técnicos em mensagens amigáveis ao usuário
 */

export interface MensagemErro {
	titulo: string;
	mensagem: string;
	instrucoes?: string;
	mostrarDetalhesTecnicos?: boolean;
	detalhesTecnicos?: string;
}

/**
 * Traduzir erros técnicos para mensagens amigáveis ao usuário
 */
export function traduzirErro(error: unknown): MensagemErro {
	if (!(error instanceof Error)) {
		return {
			titulo: 'Erro inesperado',
			mensagem: 'Ocorreu um erro inesperado. Por favor, tente novamente em alguns instantes.',
			instrucoes: 'Se o problema persistir, entre em contato com o suporte técnico.',
			detalhesTecnicos: String(error)
		};
	}

	const mensagemErro = error.message.toLowerCase();
	const erroCompleto = error.message;

	// Erro: Função do Convex não encontrada (servidor não sincronizado)
	if (mensagemErro.includes('could not find public function')) {
		return {
			titulo: 'Servidor em atualização',
			mensagem: 'O sistema está sendo atualizado no momento. Isso geralmente leva apenas alguns segundos.',
			instrucoes: 'Por favor, aguarde de 10 a 30 segundos e tente iniciar a chamada novamente. Se o problema persistir, recarregue a página (F5).',
			mostrarDetalhesTecnicos: false
		};
	}

	// Erro: Não autenticado
	if (mensagemErro.includes('não autenticado') || mensagemErro.includes('não autenticado')) {
		return {
			titulo: 'Sessão expirada',
			mensagem: 'Sua sessão expirou. É necessário fazer login novamente para continuar.',
			instrucoes: 'Você será redirecionado para a tela de login em alguns instantes.',
			mostrarDetalhesTecnicos: false
		};
	}

	// Erro: Permissão negada
	if (
		mensagemErro.includes('permissão') ||
		mensagemErro.includes('não tem permissão') ||
		mensagemErro.includes('não participa')
	) {
		return {
			titulo: 'Acesso negado',
			mensagem: 'Você não tem permissão para realizar esta ação.',
			instrucoes: 'Verifique se você faz parte desta conversa ou se possui as permissões necessárias.',
			mostrarDetalhesTecnicos: false
		};
	}

	// Erro: Recurso já existe
	if (
		mensagemErro.includes('já existe') ||
		mensagemErro.includes('já está') ||
		mensagemErro.includes('ativo')
	) {
		return {
			titulo: 'Ação não disponível',
			mensagem: erroCompleto,
			instrucoes: 'Verifique o status atual e tente novamente.',
			mostrarDetalhesTecnicos: false
		};
	}

	// Erro: Conexão
	if (
		mensagemErro.includes('connection') ||
		mensagemErro.includes('network') ||
		mensagemErro.includes('conexão') ||
		mensagemErro.includes('timeout')
	) {
		return {
			titulo: 'Problema de conexão',
			mensagem: 'Não foi possível conectar com o servidor. Verifique sua conexão com a internet.',
			instrucoes: 'Verifique se você está conectado à internet e tente novamente. Se o problema persistir, recarregue a página (F5).',
			mostrarDetalhesTecnicos: false
		};
	}

	// Erro: Não encontrado
	if (mensagemErro.includes('não encontrado') || mensagemErro.includes('not found')) {
		return {
			titulo: 'Recurso não encontrado',
			mensagem: 'O item que você está tentando acessar não foi encontrado.',
			instrucoes: 'Verifique se o item ainda existe ou se foi removido. Recarregue a página (F5) para atualizar a lista.',
			mostrarDetalhesTecnicos: false
		};
	}

	// Erro genérico com mensagem do sistema
	if (erroCompleto && erroCompleto.length < 200) {
		// Se a mensagem for curta e compreensível, usá-la diretamente
		const mensagemLimpa = erroCompleto
			.replace(/\[.*?\]/g, '') // Remove tags como [CONVEX M(...)]
			.replace(/Request ID:.*/i, '') // Remove Request IDs
			.trim();

		if (mensagemLimpa.length > 0) {
			return {
				titulo: 'Erro ao processar ação',
				mensagem: mensagemLimpa,
				instrucoes: 'Por favor, tente novamente. Se o problema persistir, recarregue a página (F5) ou entre em contato com o suporte.',
				mostrarDetalhesTecnicos: false
			};
		}
	}

	// Erro genérico desconhecido
	return {
		titulo: 'Erro ao processar ação',
		mensagem: 'Ocorreu um erro ao processar sua solicitação. Por favor, tente novamente.',
		instrucoes: 'Se o problema persistir:\n1. Recarregue a página (pressione F5)\n2. Aguarde alguns instantes e tente novamente\n3. Entre em contato com o suporte técnico se o erro continuar',
		mostrarDetalhesTecnicos: true,
		detalhesTecnicos: erroCompleto
	};
}

