class Contabilidade::LancamentosDoOrcamentoDaDespesaController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:despesas, :lancamentos]

  def despesas
		disponibiliza_dependencias
		programa_de_governo_ids = contexto_atual.programas_de_governo.pluck(:id)
		acao_ids = Loa::Acao.where("programa_de_governo_id in (?)", programa_de_governo_ids).pluck(:id)

		if !contabilidade_atual.present?
			unidade_orcamentaria_ids = current_usuario.unidades_orcamentarias.do_exercicio(exercicio_atual).pluck(:id)
			subacoes_ids = Loa::Subacao.where("acao_id in (?)", acao_ids).where("unidade_orcamentaria_id in (?)",unidade_orcamentaria_ids).pluck(:id)
		else
			subacoes_ids = Loa::Subacao.where("acao_id in (?)", acao_ids).pluck(:id)
		end

		elemento_de_despesa_por_subacao_ids = Loa::ElementoDeDespesaPorSubacao.where("subacao_id in (?)", subacoes_ids).pluck(:id)
		@q = Loa::OrcamentoDaDespesa.where("elemento_de_despesa_por_subacao_id in (?)", elemento_de_despesa_por_subacao_ids).joins(elemento_de_despesa_por_subacao: [subacao: [acao: :natureza_da_acao]]).includes(elemento_de_despesa_por_subacao: [subacao: [acao: :natureza_da_acao]]).order('base_naturezas_das_acoes.codigo', 'loa_acoes.codigo').search(params[:q])

		dados = @q.result(distinct: false)
		if params["q"] && params["q"]["valor_maximo_lteq"].present?
			dados = dados.select { |i| i.saldo <= params["q"]["valor_maximo_lteq"].to_d }
		end
		if params["q"] && params["q"]["valor_minimo_gteq"].present?
			dados = dados.select { |i| i.saldo >= params["q"]["valor_minimo_gteq"].to_d }
		end

		if request.format.pdf?
			titulo1 = "Relação de Orçamentos da Despesa"
			titulo2 = ""
			if params[:q].present? && params[:q]["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_eq"].present?
				unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:q]["elemento_de_despesa_por_subacao_subacao_unidade_orcamentaria_id_eq"])
				titulo2 += "Unidade Orçamentária: #{unidade_orcamentaria.codigo_e_nome} - "
			else
				titulo2 += "Unidade Orçamentária: CONSOLIDADO "
			end

			@lista_orcamentos_da_despesa = dados.includes( elemento_de_despesa_por_subacao: [:elemento_de_despesa]).sort_by{ |lanc| lanc.elemento_de_despesa_por_subacao.elemento_de_despesa.codigo_formatado }
			@total_valor_fixado_lista_orcamentos_da_despesa = @lista_orcamentos_da_despesa.sum(&:valor)
			@total_saldo_lista_orcamentos_da_despesa = @lista_orcamentos_da_despesa.sum(&:saldo)
		else
			@orcamentos_da_despesa = dados.paginate(page: params[:page], per_page: 10)
		end

		@configuracoes = Configuracao.last
		respond_to do |format|
			format.html
			format.json

			format.pdf do
				render pdf: "orcamentos_da_despesa",
				template: 'contabilidade/lancamentos_do_orcamento_da_despesa/despesas.pdf.slim',
				orientation: 'Landscape',
				header: {
					html: {
						template: 'layouts/_cabecalho_pdf.html.slim',
						locals: { titulo1: titulo1 , titulo2: titulo2 }
					},
					spacing: 0
				},
				footer: { right: '[page]', font_size: 8 },
				disable_smart_shrinking: true,
				dpi: '96',
				margin: @configuracoes.margens_customizadas(top: 4)
			end
		end

  end

	def lancamentos
		@q = Contabilidade::LancamentoDoOrcamentoDaDespesa.where(orcamento_da_despesa_id: params[:orcamento_da_despesa]).where.not(modulo_type: "Loa::OrcamentoDaDespesa").order("data_do_lancamento asc", "sequencia asc").search(params[:q])
		@lancamentos_do_orcamento_da_despesa = @q.result(distinct: false)

		@orcamento_da_despesa = Loa::OrcamentoDaDespesa.find(params[:orcamento_da_despesa])
		@orcamento_da_despesa.atualiza_saldo_dos_lancamentos if @orcamento_da_despesa.present?

		@saldo = @orcamento_da_despesa.valor.to_d
  end

	private
	def disponibiliza_dependencias
		@fontes_de_recursos = contexto_atual.fontes_de_recursos.order(:codigo)
		programa_de_governo_ids = contexto_atual.programas_de_governo.pluck(:id)
		acao_ids = Loa::Acao.where("programa_de_governo_id in (?)", programa_de_governo_ids).pluck(:id)
		@subacoes = Loa::Subacao.where("acao_id in (?)", acao_ids).joins(acao: :natureza_da_acao).order('base_naturezas_das_acoes.codigo', 'loa_acoes.codigo')
		@elementos_de_despesa = contexto_atual.elementos_de_despesa.order(:codigo)

		if current_usuario.desenvolvedor?
			@unidade_orcamentaria = contexto_atual.unidades_orcamentarias.order("loa_unidades_orcamentarias.codigo", "loa_unidades_orcamentarias.nome")
		else
			@unidade_orcamentaria = contexto_atual.unidades_orcamentarias.where(id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)).order("loa_unidades_orcamentarias.codigo", "loa_unidades_orcamentarias.nome")
		end
	end

	def empenhos
		@empenhos = Contabilidade::Empenho.where(orcamento_da_despesa: @orcamento_da_despesa).paginate(page: params[:page], per_page: 10)
	end
end

