class Contabilidade::LancamentosDoOrcamentoDaReceitaController < ApplicationController
	include ContabilidadeControllerConcern
	include ControllerConcern

	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:receitas, :lancamentos, :lancamentos_agrupados, :lancamento_da_receita]
	before_action :set_lancamento, only: [:edit, :update]
	before_action :disponibiliza_dependencias, only: [:receitas]

	def receitas
		orcamento = logado_na_contabilidade? ? orcamento_atual : contexto_atual
		session[:todas_as_receitas] = params[:todas_as_receitas] unless params[:todas_as_receitas].nil?
		exibir_todas_receitas = session[:todas_as_receitas]

		receitas = contabilidade_atual.orcamentos_da_receita.ordenado_por_natureza
		@q = receitas.ransack(params[:q])

		if orcamento.utiliza_novo_tipo_para_receita?
			@categorias_economicas = orcamento.naturezas_da_receita.categorias_economicas(true)
		else
			@categorias_economicas = orcamento.naturezas_da_receita.categorias_economicas(false)
		end

		@orcamentos_da_receita_por_classificacao = @q.result(distinct: false).group_by(&:classificacao_da_receita).to_a.paginate(page: params[:page], per_page: 20)
	end

	def lancamentos_agrupados
		@natureza_da_receita = Base::NaturezaDaReceita.find_by_id(params[:natureza_da_receita_id].to_i)
		@orcamentos_da_receita = Loa::OrcamentoDaReceita.joins(:unidade_orcamentaria_por_natureza_da_receita).where('loa_unidades_orcamentarias_por_natureza_da_receita.natureza_da_receita_id = ?',@natureza_da_receita.id)
		@lancamentos_do_orcamento_da_receita = Contabilidade::LancamentoDoOrcamentoDaReceita.joins(orcamento_da_receita: :unidade_orcamentaria_por_natureza_da_receita).where('loa_unidades_orcamentarias_por_natureza_da_receita.natureza_da_receita_id = ?',@natureza_da_receita.id).order("data_do_lancamento asc", "created_at asc").group_by{ |lancamento| lancamento.referente_a }
	end

	def lancamento_da_receita
		@natureza_da_receita = Base::NaturezaDaReceita.find_by_id(params[:natureza_da_receita_id].to_i)
		@orcamentos_da_receita = Loa::OrcamentoDaReceita.joins(:unidade_orcamentaria_por_natureza_da_receita).where('loa_unidades_orcamentarias_por_natureza_da_receita.natureza_da_receita_id = ?',@natureza_da_receita.id)
		@lancamentos_do_orcamento_da_receita = Contabilidade::LancamentoDoOrcamentoDaReceita.joins(orcamento_da_receita: :unidade_orcamentaria_por_natureza_da_receita).where('loa_unidades_orcamentarias_por_natureza_da_receita.natureza_da_receita_id = ?',@natureza_da_receita.id).order("data_do_lancamento asc", "created_at asc")
	end

	def edit
	end

	def update
		if @lancamento_da_receita.update( lancamento_do_orcamento_da_receita_params )
			redirect_to @lancamento_da_receita.modulo, notice: 'Lançamento foi atualizado com sucesso.'
		else
			render :edit
		end
	end

	def lancamentos
		@q = Contabilidade::LancamentoDoOrcamentoDaReceita.where(orcamento_da_receita_id: params[:orcamento_da_receita]).order("data_do_lancamento asc", "created_at asc").search(params[:q])
		@lancamentos_do_orcamento_da_receita = @q.result(distinct: false)

		@orcamento_da_receita = Loa::OrcamentoDaReceita.find_by(id: params[:orcamento_da_receita])
	end

	private
	def disponibiliza_dependencias
		@fontes_de_recursos = contexto_atual.fontes_de_recursos.order(:codigo)
		@naturezas_da_receita = contexto_atual.naturezas_da_receita.order(:codigo)
		classificacoes_da_receita = contexto_atual.naturezas_da_receita.select{ |natureza| natureza.orcamentos_da_receita.sum(&:valor) != 0}.map{ |natureza| natureza.id}
		@classificacoes_da_receita = contexto_atual.naturezas_da_receita.where(id: classificacoes_da_receita)

		if current_usuario.desenvolvedor?
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.joins(:orgao).order('loa_orgaos.codigo, loa_unidades_orcamentarias.codigo, loa_unidades_orcamentarias.nome')
		else
			@unidades_orcamentarias = 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 set_lancamento
		@lancamento_da_receita =  Contabilidade::LancamentoDoOrcamentoDaReceita.find(params[:id])
	end

	def lancamento_do_orcamento_da_receita_params
		params.require(:contabilidade_lancamento_do_orcamento_da_receita).permit(
			:orcamento_da_receita_id, :data_do_lancamento, :valor, :modulo_id, :modulo_type, :created_at, :updated_at, :saldo
		)
	end
end
