class Ppa::ProjecoesDeDespesaController < ApplicationController
	include ControllerConcern
	include PpaControllersConcern

	before_action :authenticate_usuario!
	before_action :autoriza_usuario!
	before_action :disponibiliza_programa, unless: lambda{ despesa_na_iniciativa? }
	before_action :renderiza_404_se_detalhamento_de_despesa_for_feito_na_iniciativa, unless: lambda{ despesa_na_iniciativa? }

	before_action :disponibiliza_iniciativa, if: lambda{ despesa_na_iniciativa? }
	before_action :renderiza_404_se_detalhamento_de_despesa_for_feito_no_programa, if: lambda{ despesa_na_iniciativa? }

	def edit
		despesa_na_iniciativa? ? edit_detalhe_iniciativa : edit_detalhe_programa
	end

	def update
		despesa_na_iniciativa? ? update_detalhe_iniciativa : update_detalhe_programa
	end

	private
	def edit_detalhe_programa
		if @programa.iniciativas.blank?
			redirect_to @programa, alert: "Para projetar as despesas é necessário possuir objetivo(s) e iniciativa(s)."
		else
			@projecoes_de_despesa = @programa
			.projecoes_de_despesa
			.joins(unidade_orcamentaria: :orgao)
			.order( "ppa_orgaos.codigo, ppa_unidades_orcamentarias.codigo, ppa_unidades_orcamentarias.nome", :exercicio, :tipo_de_despesa_id )
			.group_by{ |despesa| despesa.unidade_orcamentaria  }
		end
	end

	def update_detalhe_programa
		valores_das_projecoes_de_despesas = projecoes_de_despesa_programas_params.values
		valores_das_projecoes_de_despesas.each_index { |i| valores_das_projecoes_de_despesas[i][:valor] = 0.00 if valores_das_projecoes_de_despesas[i][:valor].blank? }

		if @programa.projecoes_de_despesa.update( projecoes_de_despesa_programas_params.keys, valores_das_projecoes_de_despesas  )
			redirect_to @programa, notice: "Projeções de despesa atualizadas com sucesso"
		else
			redirect_to  projecoes_de_despesa_edit_ppa_programa_path(id: @programa.id ), alert: "Um erro aconteceu ao atualizar as projeções de despesa"
		end
	end

	def edit_detalhe_iniciativa
		render "ppa/projecoes_de_despesa/iniciativas/edit"
	end

	def update_detalhe_iniciativa
		if @iniciativa.update( projecoes_de_despesa_iniciativas_params )
			redirect_to @iniciativa.objetivo, notice: 'Metas Financeiras atualizada(s) com sucesso.'
		else
			disponibiliza_iniciativa
			render "ppa/projecoes_de_despesa/iniciativas/edit"
		end

	end

	def disponibiliza_programa
		begin
			raise "Não é possivel realizar essa ação" if params[:orcador] == 'iniciativa'
			@programa = ppa_atual.programas.find( params[:id] )
		rescue
			redirect_to ppa_atual, alert: "Operação não permitida."
		end
	end

	def disponibiliza_iniciativa
		begin
			raise "Não é possivel realizar essa ação" if params[:orcador] == 'programa'
			@iniciativa = Ppa::Iniciativa.joins(objetivo: [programa: :ppa]).find_by("ppa_iniciativas.id = #{params[:id]} and ppa_ppas.id = #{ppa_atual.id}")
		rescue
			redirect_to ppa_atual, alert: "Operação não permitida."
		end
	end

	def projecoes_de_despesa_programas_params
		params.permit( projecoes_de_despesa: :valor ).require(:projecoes_de_despesa)
	end

	def projecoes_de_despesa_iniciativas_params
		params.require(:ppa_iniciativa).permit(projecoes_de_despesa_attributes: [:id,:valor])
	end

	def renderiza_404_se_detalhamento_de_despesa_for_feito_na_iniciativa
		renderiza_404 if ppa_atual.detalha_despesas_nas_iniciativas?
	end

	def renderiza_404_se_detalhamento_de_despesa_for_feito_no_programa
		renderiza_404 unless ppa_atual.detalha_despesas_nas_iniciativas?
	end

	def despesa_na_iniciativa?
		ppa_atual.detalha_despesas_nas_iniciativas?
	end
end
