class Loa::OrcamentosDaDespesaController < ApplicationController
	include ControllerConcern
	# include LoaControllersConcern
	before_action :set_subacao, only: [:edit, :update]
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:index]
	before_action :bloquear_orcamento, only: [:new, :edit, :destroy]
	skip_before_action :verifica_se_sessao_eh_de_contabilidade, only: [:index, :edit], raise: false

	def index
		@orcamentos_da_despesa = Loa::OrcamentoDaDespesa.where( elemento_de_despesa_por_subacao_id: params[:elemento_id] ).distinct.order(:fonte_de_recursos_id)

		if params[:projeto_id].present? && !params[:contrato_id].present?
			projeto = Licitacao::Projeto.find(params[:projeto_id])
			dotacoes_do_projeto = projeto.orcamentos_da_despesa_por_projetos

			if projeto.orcamento.id == params[:orcamento_do_empenho_id].to_i && dotacoes_do_projeto.present?
				@orcamentos_da_despesa = dotacoes_do_projeto.joins(orcamento_da_despesa: :elemento_de_despesa_por_subacao).where('loa_elementos_de_despesa_por_subacao.id = ?', params[:elemento_id]).map(&:orcamento_da_despesa).uniq
			else
				@orcamentos_da_despesa = Loa::OrcamentoDaDespesa.where( elemento_de_despesa_por_subacao_id: params[:elemento_id] ).distinct.order(:fonte_de_recursos_id)
			end
		elsif params[:pedido_id].present? && !params[:contrato_id].present?
			@orcamentos_da_despesa = Loa::OrcamentoDaDespesa.where( elemento_de_despesa_por_subacao_id: params[:elemento_id] ).distinct.order(:fonte_de_recursos_id)
		end

		if params[:contrato_id].present?
			contrato = Licitacao::Contrato.find(params[:contrato_id])
			if contrato.orcamento.id == params[:orcamento_do_empenho_id].to_i
				@orcamentos_da_despesa = contrato.orcamentos_da_despesa_ativos.joins(:elemento_de_despesa_por_subacao).where('loa_elementos_de_despesa_por_subacao.id = ?', params[:elemento_id]).distinct
			else
				@orcamentos_da_despesa = Loa::OrcamentoDaDespesa.where( elemento_de_despesa_por_subacao_id: params[:elemento_id] ).distinct.order(:fonte_de_recursos_id)
			end
		end

		respond_to do |format|
			format.json { render json: @orcamentos_da_despesa, methods: :codigo_e_descricao_fonte }
			format.js
		end
	end

	def edit
		if @subacao.acao.iniciativa_id.present? && !@subacao.valid?
			redirect_to subacao_ou_acao_correspondente(@subacao), notice: 'Complemente os dados da subação importada do PPA para ter acesso ao orçamento clicando no editar.'
		end
		disponibiliza_dependencias
	end

	def update
		@subacao.transaction do
			begin
				if params.has_key?(:loa_subacao)
					params = elementos_de_despesa_por_subacao_params

					if (params[:elementos_de_despesa_por_subacao_attributes]).present?
						params[:elementos_de_despesa_por_subacao_attributes].to_unsafe_h.map do |unidade_orcamentaria|
							unidade_orcamentaria[1][:status_do_orcamento] = contexto_atual[:status]
							if (unidade_orcamentaria[1][:orcamentos_da_despesa_attributes]).present?
								unidade_orcamentaria[1][:orcamentos_da_despesa_attributes].map do |fonte_de_recurso|
									fonte_de_recurso[1][:status_do_orcamento] = contexto_atual[:status]
								end
							end
						end
					end

					if @subacao.update(params)
						redirect_to subacao_ou_acao_correspondente(@subacao), notice: 'Orcamento da despesa foi atualizado com sucesso.'
					else
						disponibiliza_dependencias
						render :edit
					end
				else
					redirect_to subacao_ou_acao_correspondente @subacao
				end
			end
			rescue Exception => e
				if e.message.include?("Cannot delete record because of dependent empenhos")
					mensagem = "Registro não pode ser deletado. Orcamento da despesa não pode ser deletado pois possui empenhos"
				else
					mensagem = e.message
				end

				disponibiliza_dependencias
				redirect_to loa_edit_orcamento_da_despesa_path @subacao
				flash[:alert] = mensagem
				raise ActiveRecord::Rollback
		end
	end

	def retorna_codigo_fonte_de_recurso
		orcamento_da_despesa = Loa::OrcamentoDaDespesa.find(params[:id])
		@fonte_de_recursos = orcamento_da_despesa.fonte_de_recursos
		respond_to do |format|
			format.json { render json:
				{
					codigo_fonte_recurso: @fonte_de_recursos.codigo_completo,
				}
			}
		end
	end

	private
	def set_subacao
		if params[:id]
			@subacao = Loa::Subacao.find(params[:id])
		elsif params[:acao_id]
			@subacao = Loa::Acao.find(params[:acao_id]).subacao
		end
	end

	def disponibiliza_dependencias
		if @subacao && @subacao.acao.natureza_da_acao.codigo == '9'
			@elementos_de_despesa = contexto_atual.elementos_de_despesa.where(codigo: "99999900", exibir_elemento_de_despesa: true)
		else
			@elementos_de_despesa = contexto_atual.elementos_de_despesa.where(exibir_elemento_de_despesa: true).order(:codigo)
		end

		#Retirada regra apenas provisoriamente e listando todas chamado #2207 
		#@fontes_de_recursos = contexto_atual.fontes_de_recursos.where("base_fontes_stn.codigo_tipo_exercicio = 1")
		@fontes_de_recursos = contexto_atual.fontes_de_recursos
		@iduso = Loa::OrcamentoDaDespesa.idusos
	end

	# Permite apenas os parâmetros específicos
	def elementos_de_despesa_por_subacao_params
		params.require(:loa_subacao).permit(
			:fixacao_da_despesa,
			elementos_de_despesa_por_subacao_attributes: [
				:id, :elemento_de_despesa_id, :_destroy,
				orcamentos_da_despesa_attributes: [
					:id, :fonte_de_recursos_id, :valor, :iduso, :_destroy
				]
			]
		)
	end
end
