class Loa::ElementosDeDespesaPorSubacaoController < ApplicationController
	include LoaControllersConcern
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:index]
	skip_before_action :verifica_se_sessao_eh_de_contabilidade

	def index
		elementos_de_despesa = retorna_elementos_de_despesa
		if elementos_de_despesa.any?
			@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.includes(:elemento_de_despesa).joins('left join contabilidade_solicitacao_de_alteracao_orcamentarias as b on loa_elementos_de_despesa_por_subacao.solicitacao_de_alteracao_orcamentaria_id = b.id').where('(b.status = ? or loa_elementos_de_despesa_por_subacao.solicitacao_de_alteracao_orcamentaria_id is null)', Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.status["confirmado"]).where(subacao_id: params[:subacao_id], elemento_de_despesa: elementos_de_despesa).order('base_elementos_de_despesa.codigo').all
		else
			@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.includes(:elemento_de_despesa).joins('left join contabilidade_solicitacao_de_alteracao_orcamentarias as b on loa_elementos_de_despesa_por_subacao.solicitacao_de_alteracao_orcamentaria_id = b.id').where('(b.status = ? or loa_elementos_de_despesa_por_subacao.solicitacao_de_alteracao_orcamentaria_id is null)', Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.status["confirmado"]).where(subacao_id: params[:subacao_id]).order('base_elementos_de_despesa.codigo').all
		end

		if params[:projeto_id].present? && !params[:contrato_id].present?
			projeto = Licitacao::Projeto.find(params[:projeto_id])
			dotacoes_do_projeto = projeto.orcamentos_da_despesa
			if dotacoes_do_projeto.present? && projeto.orcamento.try(:id) == params[:orcamento_do_empenho_id].to_i
				orcamentos_da_despesa_ids = dotacoes_do_projeto.pluck(:id)
				@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.where('loa_elementos_de_despesa_por_subacao.subacao_id = ?', params[:subacao_id]).joins(:orcamentos_da_despesa).where("loa_orcamentos_da_despesa.id in (?)", orcamentos_da_despesa_ids)
			else
				@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.includes(:elemento_de_despesa).joins('left join contabilidade_solicitacao_de_alteracao_orcamentarias as b on loa_elementos_de_despesa_por_subacao.solicitacao_de_alteracao_orcamentaria_id = b.id').where('(b.status = ? or loa_elementos_de_despesa_por_subacao.solicitacao_de_alteracao_orcamentaria_id is null)', Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.status["confirmado"]).where(subacao_id: params[:subacao_id]).order('base_elementos_de_despesa.codigo').all
			end
		end

		if params[:pedido_id].present?
			pedido = Licitacao::Pedido.find(params[:pedido_id])
			dotacoes_do_pedido = pedido.orcamentos_da_despesa
			
			if dotacoes_do_pedido.present? && pedido.orcamento.id == params[:orcamento_do_empenho_id].to_i
				
				orcamentos_da_despesa_ids = dotacoes_do_pedido.pluck(:id)
				@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.where('loa_elementos_de_despesa_por_subacao.subacao_id = ?', params[:subacao_id]).joins(:orcamentos_da_despesa).where("loa_orcamentos_da_despesa.id in (?)", orcamentos_da_despesa_ids)
			else
				@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.includes(:elemento_de_despesa).joins('left join contabilidade_solicitacao_de_alteracao_orcamentarias as b on loa_elementos_de_despesa_por_subacao.solicitacao_de_alteracao_orcamentaria_id = b.id').where('(b.status = ? or loa_elementos_de_despesa_por_subacao.solicitacao_de_alteracao_orcamentaria_id is null)', Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.status["confirmado"]).where(subacao_id: params[:subacao_id]).order('base_elementos_de_despesa.codigo').all
			end
		end

		if params[:contrato_id].present?
			contrato = Licitacao::Contrato.find(params[:contrato_id])
			dotacoes_do_contrato = contrato.orcamentos_da_despesa_ativos

			if contrato.orcamento.id == params[:orcamento_do_empenho_id].to_i && dotacoes_do_contrato.present?
				orcamentos_da_despesa_ids = dotacoes_do_contrato.pluck(:id)
				@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.where('loa_elementos_de_despesa_por_subacao.subacao_id = ?', params[:subacao_id]).joins(:orcamentos_da_despesa).where("loa_orcamentos_da_despesa.id in (?)", orcamentos_da_despesa_ids).distinct
			else
				if elementos_de_despesa.any?
					@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.includes(:elemento_de_despesa).joins('left join contabilidade_solicitacao_de_alteracao_orcamentarias as b on loa_elementos_de_despesa_por_subacao.solicitacao_de_alteracao_orcamentaria_id = b.id').where('(b.status = ? or loa_elementos_de_despesa_por_subacao.solicitacao_de_alteracao_orcamentaria_id is null)', Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.status["confirmado"]).where(subacao_id: params[:subacao_id], elemento_de_despesa: elementos_de_despesa).order('base_elementos_de_despesa.codigo').all.distinct
				else
					@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.includes(:elemento_de_despesa).joins('left join contabilidade_solicitacao_de_alteracao_orcamentarias as b on loa_elementos_de_despesa_por_subacao.solicitacao_de_alteracao_orcamentaria_id = b.id').where('(b.status = ? or loa_elementos_de_despesa_por_subacao.solicitacao_de_alteracao_orcamentaria_id is null)', Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.status["confirmado"]).where(subacao_id: params[:subacao_id]).order('base_elementos_de_despesa.codigo').all.distinct
				end
			end
		end

		if params[:reconhecimento_de_divida].present? && params[:reconhecimento_de_divida].present? == true
			@elementos_de_despesa_por_subacao = @elementos_de_despesa_por_subacao.joins(elemento_de_despesa: :elemento_de_gasto).includes(elemento_de_despesa: :elemento_de_gasto).where(natureza_da_despesa_elementos_de_despesa: {codigo: "92"}).order('natureza_da_despesa_elementos_de_despesa.codigo')
		end

		if params[:diaria_id].present?
			@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.joins(elemento_de_despesa: :elemento_de_gasto).where(subacao_id: params[:subacao_id], natureza_da_despesa_elementos_de_despesa: {codigo: "14"})
		end

		respond_to do |format|
			format.json { render json: @elementos_de_despesa_por_subacao, methods: :codigo_e_descricao_elemento }
			format.js
		end

	end

	def retorna_elementos_de_despesa
		if params[:projeto_id].present? && !params[:orcamento_do_empenho_id].present?
			Licitacao::Projeto.find(params[:projeto_id]).elementos_de_despesa_do_orcamento
		elsif params[:pedido_id].present? && !params[:orcamento_do_empenho_id].present?
			Licitacao::Pedido.find(params[:pedido_id]).elementos_de_despesa_do_orcamento
		else
			Base::ElementoDeDespesa.none
		end
	end
end
