require 'active_support/concern'

module MantenedorDoOrcamento extend ActiveSupport::Concern
	included do
		has_many :unidades_orcamentarias_por_usuario, class_name: 'Loa::UnidadeOrcamentariaPorUsuario'

		has_many :unidades_orcamentarias, through: :unidades_orcamentarias_por_usuario, class_name:'Loa::UnidadeOrcamentaria' do
			def do_exercicio(exercicio=nil)
				if exercicio
					joins(orgao: :orcamento).where(orcamentos: {exercicio: exercicio})
				end
			end
		end

		has_many :subacoes, through: :unidades_orcamentarias, class_name: 'Loa::Subacao' do
			def do_exercicio(exercicio=nil)
				if exercicio
					joins(acao:[programa_de_governo: :orcamento]).where(orcamentos: {exercicio: exercicio})
				end
			end
		end

		has_many :acoes, through: :subacoes, class_name: 'Loa::Acao' do
			def do_exercicio(exercicio=nil)
				if exercicio
					joins(programa_de_governo: :orcamento).where(orcamentos: {exercicio: exercicio})
				end
			end
		end

		# MARCAR PARA TESTAR

		has_many :unidades_gestoras, through: :unidades_orcamentarias, class_name: 'Loa::UnidadeGestora' do
			def do_exercicio(exercicio=nil)
				if exercicio
					where("data_encerramento >= ? or data_encerramento is null", Date.new(exercicio, 1, 1))
					# joins(:orcamento).where(orcamentos: {exercicio: exercicio})
				end
			end
		end

		has_many :pedidos, through: :unidades_orcamentarias, class_name: 'Licitacao::Pedido' do
			def do_exercicio(exercicio=nil)
				if exercicio
					joins(:orcamento).where(orcamentos: {exercicio: exercicio})
				end
			end
		end

		has_many :projetos, through: :unidades_orcamentarias, class_name: 'Licitacao::Projeto' do
			def do_exercicio(exercicio=nil)
				if exercicio
					joins(:orcamento).where(orcamentos: {exercicio: exercicio})
				end
			end
		end

		has_many :processos, through: :unidades_orcamentarias, class_name: 'Licitacao::Processo' do
			def do_exercicio(exercicio=nil)
				if exercicio
					joins(:orcamento).where(orcamentos: {exercicio: exercicio})
				end
			end
		end

		has_many :atas_de_registro_de_precos, through: :projetos, class_name: 'Licitacao::AtaDeRegistroDePrecos' do
			def do_exercicio(exercicio=nil)
				if exercicio
					joins(processo: :orcamento).where(orcamentos: {exercicio: exercicio})
				end
			end
		end

		has_many :contratos, through: :unidades_orcamentarias, class_name: 'Licitacao::Contrato' do
			def do_exercicio(exercicio=nil)
				if exercicio
					joins(unidade_orcamentaria_por_pedido: [unidade_orcamentaria:[orgao: :orcamento]]).where(orcamentos: {exercicio: exercicio})
				end
			end
		end

		has_many :obras, class_name: 'Contabilidade::Obra' do
			def do_exercicio(exercicio=nil)
				if exercicio
					joins(contratos: [unidade_orcamentaria_por_pedido: [unidade_orcamentaria:[orgao: :orcamento]]]).where(orcamentos: {exercicio: exercicio})
				end
			end
		end

		has_many :ordens_de_compra, through: :unidades_orcamentarias, class_name: 'Licitacao::OrdemDeCompra' do
			def do_exercicio(exercicio=nil)
				if exercicio
					joins(empenho: :orcamento).where(orcamentos: {exercicio: exercicio})
				end
			end
		end

		has_many :diarias, through: :unidades_orcamentarias, class_name: 'Contabilidade::Diaria' do
			def do_exercicio(exercicio=nil)
				if exercicio
					joins(unidade_orcamentaria: [orgao: :orcamento]).where(orcamentos: {exercicio: exercicio})
				end
			end
		end

		has_many :empenhos, through: :unidades_orcamentarias, class_name: 'Contabilidade::Empenho' do
			def do_exercicio(exercicio=nil)
				if exercicio
					joins(:orcamento).where(orcamentos: {exercicio: exercicio})
				end
			end
		end

		has_many :liquidacoes, through: :empenhos, class_name: 'Contabilidade::Liquidacao' do
			def do_exercicio(exercicio=nil)
				if exercicio
					joins(:orcamento).where(orcamentos: {exercicio: exercicio})
				end
			end

			def menor_ou_igual(exercicio=nil)
				if exercicio
					joins(:orcamento).where("exercicio < ? OR (status_restos_a_pagar = 2 AND exercicio = ?)", exercicio, exercicio)
				end
			end

			def duplicadas_para_restos_a_pagar(exercicio=nil)
				if exercicio
					joins(:orcamento).where("exercicio < ? and (contabilidade_liquidacoes.restos_a_pagar is false or contabilidade_liquidacoes.restos_a_pagar is null)", exercicio)
				end
			end

			# def entre(exercicio_inicial=nil, exercicio_final=nil)
			# 	if exercicio_inicial && exercicio_final
			# 		joins(:orcamento).where("exercicio between ? and ?", exercicio_inicial, exercicio_final)
			# 	end
			# end
		end

		has_many :passagens, through: :projetos, class_name: 'Contabilidade::Passagem' do
			def do_exercicio(exercicio=nil)
				if exercicio
					joins(projeto:[pedido: :orcamento]).where(orcamentos: {exercicio: exercicio})
				end
			end
		end

		has_many :contas_bancarias_por_unidade_orcamentaria, through: :unidades_orcamentarias, class_name: 'Base::ContaBancariaPorUnidadeOrcamentaria' do
			def do_exercicio(exercicio=nil)
				if exercicio
					joins(:orcamento).where(orcamentos: {exercicio: exercicio})
				end
			end
		end

		has_many :contas_bancarias, through: :contas_bancarias_por_unidade_orcamentaria, class_name: 'Base::ContaBancaria' do
			def do_exercicio(exercicio=nil)
				if exercicio
					joins(conta_bancaria_por_unidade_orcamentaria: :orcamento).where(orcamentos: {exercicio: exercicio})
				end
			end
		end

		def visualiza? objeto
			if objeto.try(:unidade_orcamentaria)
				if objeto.class.name == "Licitacao::Contrato"
					ids_unidades_do_contrato_e_dos_aditivos = objeto.aditivos.pluck(:unidade_orcamentaria_id).compact.push(objeto.unidade_orcamentaria.try(:id))

					return (unidades_orcamentarias.ids & ids_unidades_do_contrato_e_dos_aditivos).any?
				else
					unidades_orcamentarias.include?(objeto.unidade_orcamentaria)
				end
			elsif objeto.try(:unidades_orcamentarias) && objeto.try(:unidades_orcamentarias).any?
				(unidades_orcamentarias & objeto.unidades_orcamentarias).to_a.any?
			else
				true
			end
		end
	end
end
