# app/controllers/concerns/expections_errors.rb
module ControllerConcern
	extend ActiveSupport::Concern

	def apaga_e_retorna_mensagem(modelo, omitir_relacao=nil)
		begin
			if modelo.destroy
				mensagem = {notice: 'Registro apagado com sucesso'}
			else
				mensagem = {alert: 'Erro ao excluir registro'}
			end
		rescue Exception => e
			mensagem = {alert: e.message}
		rescue ActiveRecord::DeleteRestrictionError => e
			relacao_informada = omitir_relacao ? "dependências" : traduzir_modelo(e.message.split.last)
			mensagem = {
				alert: "Não foi possível excluir, pois existem #{relacao_informada.humanize} que impedem o registro de ser apagado."
			}
		rescue Exception => e
			mensagem = {alert: 'Erro ao excluir registro'}
		end

		return mensagem
	end

	def traduzir_modelo(modelo_nome)
		if t(modelo_nome, {scope: 'activerecord.models'}).include? 'translation missing'
			modelo_nome
		else
			t(modelo_nome, {scope: 'activerecord.models'})
		end
	end

	def redirect_back(fallback_location:, **args)
		if referer = request.headers["Referer"]
			redirect_to referer, **args
		else
			redirect_to fallback_location, **args
		end
	end

	def verifica_modulo_na_sessao modulos
		redirect_to contexto_path, alert: 'Você não pode acessar esse módulo.' unless session[:modulo].in? modulos
	end

	def usuario_pode_visualizar? objeto
		unless current_usuario.desenvolvedor?
			case objeto.class.name
			when "Contabilidade::Empenho"
				redirect_to empenhos_path(), alert: "Você não tem acesso a unidade desse empenho" unless current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id).include?(objeto.unidade_orcamentaria.try(:id))
			when "Contabilidade::Liquidacao"
				redirect_to administrativo_liquidacoes_path(), alert: "Vocẽ não tem acesso a unidade dessa liquidação" unless current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id).include?(objeto.unidade_orcamentaria.try(:id))
			when "Contabilidade::Pagamento"
				if logado_na_contabilidade?
					rota = administrativo_pagamentos_path()
				else
					rota = contabilidade_pagamentos_path()
				end
				redirect_to rota, alert: "Você não tem acesso a unidade desse pagamento" unless current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id).include?(objeto.unidade_orcamentaria.try(:id))
			when "Contabilidade::SolicitacaoDeAlteracaoOrcamentaria"
				if objeto.unidade_orcamentaria_id.present?
					redirect_to contabilidade_solicitacao_de_alteracao_orcamentarias_path(), alert: "Você não tem acesso a unidade dessa alteração orçamentária" unless current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id).include?(objeto.unidade_orcamentaria.try(:id))
				end
			when "Contabilidade::DespesaExtraOrcamentaria"
				redirect_to contabilidade_despesas_extra_orcamentarias_path(contexto_atual.exercicio), alert: "Você não tem acesso a unidade dessa despesa" unless current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id).include?(objeto.unidade_orcamentaria.try(:id))
			end
		end
	end

end
