class Base::IntermodulosController < ApplicationController
	before_action :authenticate_usuario!

	before_action :disponibiliza_dependencias_movimentacoes_do_estoque, only: [:movimentacoes_do_estoque]
	before_action :set_estoques, only: [:movimentacoes_por_sub_elemento]
	before_action :disponibiliza_dependencias_do_filtro_de_obras, only: [:obras_sem_classificacao_pcasp, :medicoes_da_obra]
	before_action :set_utilizando_intermodulos

	def menu_de_obras
		bloqueia_usuario_com_base_em 'index', 'contabilidade/obras'
	end

	def gestao_de_estoque
		cookies[:tipo_do_estoque] = params[:tipo_do_estoque]
	end

	def patrimonio
	end

	def patrimonio_relatorios
		if current_usuario.desenvolvedor?
			@unidades_gestoras = Loa::UnidadeGestora.all.order("loa_unidades_gestoras.codigo::integer")
		else
			@unidades_gestoras = current_usuario.unidades_gestoras.order("loa_unidades_gestoras.codigo::integer").uniq
		end
	end

	def medicoes_da_obra
		@q = Contabilidade::MedicaoDaObra.ransack(query_params)
		if query_params["obra_codigo"].present?
			codigosplit = query_params["obra_codigo"].split(".")
			if codigosplit[1].present?
				medicoes_filtradas = @q.result.joins(:obra).where("contabilidade_obras.codigo = ? AND SUBSTRING(EXTRACT('year' FROM contabilidade_obras.data_de_inicio)::text, 3, 2) = ?",codigosplit[0],codigosplit[1])
			else
				medicoes_filtradas = @q.result.joins(:obra).where("contabilidade_obras.codigo = ?",codigosplit[0])
			end	
		else
			medicoes_filtradas = @q.result
		end
		
		@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.order(:codigo, :nome)
		@medicoes_da_obra = medicoes_filtradas.confirmada.distinct.paginate(page: params[:page], per_page: 10)
	end

	def medicoes_da_obra_lancadas
		@q = Contabilidade::MedicaoDaObra.search(params[:q])
		@obras = Contabilidade::Obra.joins(:medicoes_da_obra).where.not( contabilidade_medicoes_da_obra: { obra_id: nil } ).where( contabilidade_medicoes_da_obra: { status: Contabilidade::MedicaoDaObra.status[:lancada] } )
		@medicoes_da_obra = @q.result.lancada.paginate(page: params[:page], per_page: 10)
	end

	def movimentacoes_do_estoque
		tipo_estoque = cookies[:tipo_do_estoque]
		cookies[:detalhamento_do_estoque] = params[:relatorio].to_sym
		tipo_material = GestaoDeEstoque::Estoque.tipos_de_materiais[params[:relatorio].to_sym]
		modelo = cookies[:tipo_do_estoque] == 'recebimento' ? GestaoDeEstoque::RecebimentoDeMaterial : GestaoDeEstoque::ItemDoConsumo

		@q = GestaoDeEstoque::MovimentacaoDoEstoque.includes(:estoque).joins(:estoque)
			.where(orcamento_id: contexto_atual.id)
			.where("origem_type ILIKE ?", "%#{tipo_estoque}%")
			.where(gestao_de_estoque_estoques: { tipo_de_material: tipo_material })
			.search(params[:q])

		unless params[:q].present? && (params[:q]["status_entrada"].present? || params[:q]["status_saida"].present?)
			if cookies[:tipo_do_estoque] == 'recebimento'
				origens_ids = @q.result.status_entrada("aguardando_reconhecimento").order('data_da_movimentacao, gestao_de_estoque_movimentacoes_do_estoque.unidade_orcamentaria_id DESC').pluck(:origem_id).uniq
				@movimentacoes = modelo.where(id: origens_ids).paginate(page: params[:page], per_page: 10)
			else
				origens_ids = @q.result.status_saida("aguardando_reconhecimento").order('data_da_movimentacao, gestao_de_estoque_movimentacoes_do_estoque.unidade_orcamentaria_id DESC').pluck(:origem_id).uniq
				@movimentacoes = modelo.where(consumo_id: origens_ids, status_de_reconhecimento: 'aguardando_reconhecimento').includes(:consumo).order('gestao_de_estoque_consumos.data_de_consumo DESC').paginate(page: params[:page], per_page: 10)
			end
		else
			origens_ids = @q.result.order('data_da_movimentacao, gestao_de_estoque_movimentacoes_do_estoque.unidade_orcamentaria_id DESC').pluck(:origem_id).uniq

			if cookies[:tipo_do_estoque] == 'consumo'
				@movimentacoes = modelo.where(consumo_id: origens_ids, status_de_reconhecimento: params[:q]["status_saida"]).includes(:consumo).order('gestao_de_estoque_consumos.data_de_consumo DESC').paginate(page: params[:page], per_page: 10)
			else
				@movimentacoes = modelo.where(id: origens_ids).paginate(page: params[:page], per_page: 10)
			end
		end
	end

	def reconhecer_ou_desreconhecer_movimentacoes_do_estoque
		modelo = cookies[:tipo_do_estoque] == 'recebimento' ? GestaoDeEstoque::RecebimentoDeMaterial : GestaoDeEstoque::ItemDoConsumo
		movimentacao_ids = params[:movimentacao_ids]
		status_selecionado = params[:status_selecionado]
		status_de_reconhecimento = modelo.status_de_reconhecimentos.except(status_selecionado).first[0]

		modelo.where('id IN (?)', movimentacao_ids).each do |objeto|
			objeto.status_de_reconhecimento = status_de_reconhecimento
			objeto.save
		end
		redirect_back(fallback_location: root_path, success: "Movimentos #{status_selecionado == 'reconhecido' ? 'desreconhecidos' : 'reconhecidos'} com sucesso!")
	end

	def show_gestao_de_estoque_recebimento
		if cookies[:tipo_do_estoque] == 'recebimento'
			@recebimento_de_material = GestaoDeEstoque::RecebimentoDeMaterial.find(params[:id])
		end
	end

	def show_gestao_de_estoque_consumo
		if cookies[:tipo_do_estoque] == 'consumo'
			@consumo = GestaoDeEstoque::Consumo.find(params[:id])
		end
	end

	def obras_sem_classificacao_pcasp
		filtro_de_obras_vigentes_no_exercicio_atual = "
			(extract(year from contabilidade_obras.data_de_inicio) = #{contexto_atual.exercicio}
				OR extract(year from contabilidade_obras.data_prevista_de_termino) >= #{contexto_atual.exercicio}
			)
			OR (
				licitacao_aditivos.status = #{Licitacao::Aditivo.status[:confirmado]} AND
				licitacao_aditivos.modalidade = #{Licitacao::Aditivo.modalidades[:por_prazo]} AND
				extract(year from licitacao_aditivos.fim_da_vigencia) >= #{contexto_atual.exercicio}
			)
			OR (
				licitacao_aditivos.status = #{Licitacao::Aditivo.status[:confirmado]} AND
				licitacao_aditivos.modalidade = #{Licitacao::Aditivo.modalidades[:prazo_e_acrescimo]} AND
				extract(year from licitacao_aditivos.fim_da_vigencia) >= #{contexto_atual.exercicio}
			)
			OR (
				licitacao_aditivos.status = #{Licitacao::Aditivo.status[:confirmado]} AND
				licitacao_aditivos.modalidade = #{Licitacao::Aditivo.modalidades[:prazo_e_reducao]} AND
				extract(year from licitacao_aditivos.fim_da_vigencia) >= #{contexto_atual.exercicio}
			)
			OR (
				licitacao_aditivos.status = #{Licitacao::Aditivo.status[:confirmado]} AND
				licitacao_aditivos.modalidade = #{Licitacao::Aditivo.modalidades[:prazo_e_reajuste_acrescimo]} AND
				extract(year from licitacao_aditivos.fim_da_vigencia) >= #{contexto_atual.exercicio}
			)
			OR (
				licitacao_aditivos.status = #{Licitacao::Aditivo.status[:confirmado]} AND
				licitacao_aditivos.modalidade = #{Licitacao::Aditivo.modalidades[:prazo_e_reajuste_decrescimo]} AND
				extract(year from licitacao_aditivos.fim_da_vigencia) >= #{contexto_atual.exercicio}
			)
			"

		@q = Contabilidade::Obra.ransack(query_params) #possivel edição de id
		@obras = @q.result.left_joins(contratos: [:aditivos]).where(conta_pcasp_id: nil).where(filtro_de_obras_vigentes_no_exercicio_atual).paginate(page: params[:page], per_page: 10)
	end

	def movimentacoes_por_sub_elemento
	end

	private

	def disponibiliza_dependencias_do_filtro_de_obras
		@tipos_de_status_da_obra = Contabilidade::SituacaoDaObra.tipos_de_status_da_obra
		@fontes_de_origem = Contabilidade::Obra.fontes_de_origem #possivel edição de id
		@fontes_de_contrapartida = Contabilidade::Obra.fontes_de_contrapartida
		@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.joins(:orgao).order('loa_orgaos.codigo, loa_unidades_orcamentarias.codigo, loa_unidades_orcamentarias.nome')
		@pessoas = Base::Pessoa.includes(:tipo_de_pessoa).fornecedores
		@engenheiros_da_obra = Base::TipoDePessoa.find_by(codigo: '1').pessoas.order(:nome)
	end

	def disponibiliza_dependencias_movimentacoes_do_estoque
		@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.order(:codigo, :nome)
		@fornecedores = Base::Pessoa.includes(:tipo_de_pessoa).all.order(:nome)
		@status_de_reconhecimento = GestaoDeEstoque::RecebimentoDeMaterial.status_de_reconhecimentos_i18n
	end

	def set_estoques
		estoque = GestaoDeEstoque::Estoque.find_by(id: params[:estoque_id] )
		@estoques = GestaoDeEstoque::Estoque.select("DISTINCT ON (sub_elemento_de_despesa_id) *").order('sub_elemento_de_despesa_id').where(almoxarifado_id: estoque.almoxarifado_id, unidade_orcamentaria_id: estoque.unidade_orcamentaria_id, tipo_de_material: GestaoDeEstoque::Estoque.tipos_de_materiais[estoque.tipo_de_material.to_sym])
	end

	def set_utilizando_intermodulos
		session[:set_utilizando_intermodulos] = true
	end
end
