module ContextoConcern
	extend ActiveSupport::Concern

	included do
		helper_method :contexto_atual
		helper_method :ppa_atual
		helper_method :orcamento_atual
		helper_method :contabilidade_atual
		helper_method :administrativo_atual
		helper_method :obra_atual
		helper_method :gestao_de_estoque_atual
		helper_method :patrimonio_atual
		helper_method :logado_na_licitacao?
		helper_method :logado_no_administrativo?
		helper_method :logado_na_controladoria?
		helper_method :logado_na_contabilidade?
		helper_method :logado_na_alteracao_orcamentaria?
		helper_method :logado_na_obra?
		helper_method :logado_no_planejamento?
		helper_method :logado_no_financeiro?
		helper_method :logado_na_gestao_de_estoque?
		helper_method :logado_no_patrimonio?
		helper_method :home_contexto
		helper_method :exercicio_atual
		helper_method :nome_do_modulo
		helper_method :portal_atual
		helper_method :exibir_alerta_de_contexto?
		@contexto
	end

	def contabilidade_atual
		contexto_atual if session[:contexto_tipo] == 'Contabilidade'
	end

	def administrativo_atual
		contexto_atual if session[:contexto_tipo] == 'Administrativo'
	end

	def controladoria_atual
		contexto_atual if session[:contexto_tipo] == 'Controladoria'
	end

	def orcamento_atual
		contexto_atual if session[:contexto_tipo] == 'Orcamento' || logado_na_licitacao?  || logado_no_administrativo? || logado_na_controladoria? || logado_na_obra? || logado_no_planejamento? || logado_na_gestao_de_estoque? || logado_na_contabilidade? || logado_na_alteracao_orcamentaria? || logado_no_patrimonio?
	end

	def ppa_atual
		contexto_atual if session[:contexto_tipo] == 'Ppa::Ppa'
	end

	def obra_atual
		contexto_atual if session[:contexto_tipo] == 'Obra'
	end

	def gestao_de_estoque_atual
		contexto_atual if session[:contexto_tipo] == 'Gestao_de_estoque' || logado_no_administrativo?  || logado_na_gestao_de_estoque?
	end

	def patrimonio_atual
		contexto_atual if session[:contexto_tipo] == 'Patrimonio' || logado_no_patrimonio?
	end

	def portal_atual
		session[:contexto_tipo] == 'Portal da Transparência'
	end

	def contexto_atual
		teste_contexto_contabilidade = lambda {
			@contexto.try(:class).try(:name) == "Orcamento" && (session[:contexto_tipo].in?  %w(Contabilidade Licitacao Controladoria))
		}
		if session[:contexto_tipo].present? && session[:contexto_id].present?
			if @contexto.try(:class).try(:name) == session[:contexto_tipo] || teste_contexto_contabilidade.call()
				@contexto
			else
				tipo = ['Contabilidade', 'Licitacao', 'Administrativo', 'Controladoria', 'Obra', 'Alteracao_orcamentaria', 'Planejamento', 'Financeiro', 'Gestao_de_estoque', 'Patrimonio', 'Portal da Transparência'].include?(session[:contexto_tipo]) ? 'Orcamento' : session[:contexto_tipo]
				begin
					@contexto ||= tipo.constantize.find( session[:contexto_id] )
				rescue
					nil
				end
			end
		end
	end

	def exercicio_atual
		if contexto_atual.is_a? Ppa::Ppa
			contexto_atual.intervalo
		else
			contexto_atual.try(:exercicio)
		end
	end

	def logado_na_alteracao_orcamentaria?
		session[:modulo] == 'alteracao_orcamentaria'
	end

	def logado_no_financeiro?
		session[:modulo] == 'financeiro'
	end

	def logado_na_licitacao?
		session[:modulo] == 'licitacao'
	end

	def logado_no_administrativo?
		session[:modulo] == 'administrativo'
	end

	def logado_na_controladoria?
		session[:modulo] == 'controladoria'
	end

	def logado_na_contabilidade?
		session[:modulo] == 'contabilidade'
	end

	def logado_na_obra?
		session[:modulo] == 'obra'
	end

	def logado_no_planejamento?
		session[:modulo] == 'planejamento'
	end

	def logado_na_gestao_de_estoque?
		session[:modulo] == 'gestao_de_estoque'
	end

	def logado_no_patrimonio?
		session[:modulo] == 'patrimonio'
	end

	def home_contexto
		case session[:contexto_tipo]
		when 'Contabilidade'
			contabilidade_atual
		when 'Licitacao'
			licitacao_inicio_path
		when 'Administrativo'
			administrativo_inicio_path
		when 'Controladoria'
			controladoria_inicio_path
		when 'Orcamento'
			orcamento_atual
		when 'Ppa::Ppa'
			ppa_atual
		when 'Obra'
			obra_inicio_path
		when 'Gestao_de_estoque'
			gestao_de_estoque_inicio_path
		when 'Patrimonio'
			patrimonio_inicio_path
		else
			root_path
		end
	end

	def nome_do_modulo
		case session[:contexto_tipo]
		when 'Licitacao'
			'Licitação'
		when 'Orcamento'
			'Orçamento'
		when 'Ppa::Ppa'
			'PPA'
		when 'Obra'
			'Gestão de Obras'
		when 'Gestao_de_estoque'
			'Gestão de Estoque'
		when 'Patrimonio'
			'Patrimônio'
		when 'Portal da Transparência'
			'Portal da Transparência'
		else
			session[:contexto_tipo]
		end
	end

	def exibir_alerta_de_contexto?(data_do_objeto, objeto = nil, orcamento = nil)
		if objeto.present? && objeto.class.name == 'Contabilidade::Empenho'
			if objeto.restos_a_pagar == true
				if data_do_objeto.present?
					exibir_alerta = data_do_objeto.year == contexto_atual.exercicio ? true : false
				end
			else
				if data_do_objeto.present?
					exibir_alerta = data_do_objeto.year != contexto_atual.exercicio ? true : false
				end
			end
		else
			if data_do_objeto.present?
				exibir_alerta = data_do_objeto.year != contexto_atual.exercicio ? true : false
			end

			if orcamento.present?
				exibir_alerta = orcamento.exercicio != contexto_atual.exercicio ? true : false
			end
		end
		
		return exibir_alerta
	end

end
