class Contabilidade::ItensDoEmpenhoController < ApplicationController
	include ControllerConcern
	include Contabilidade::ItensDoEmpenhoHelper
	before_action -> { verifica_modulo_na_sessao(["contabilidade", "administrativo"]) }
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!
	before_action :set_empenho, only: [:new, :create, :index]
	before_action :set_item_do_empenho, only: [:show, :destroy]
	before_action :disponibiliza_dependencias, only: [:new]
	before_action :set_itens_do_empenho, only: [:new, :edit]
	def index
		@q = @empenho.itens_do_empenho.order('valor_unitario DESC').search(params[:q])
		@itens_do_empenho = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
	end

	# GET /contabilidade/itens_do_empenho/new
	def new
		if @empenho.existe_liquidacoes?
			redirect_to contabilidade_empenho_path(@empenho) + "?tab=itens", notice: "Empenho já tem liquidação, itens não podem ser alterados."
		end
	end

	# POST /contabilidade/itens_do_empenho
	def create
		if salva_itens_do_empenho
			redirect_to empenho_path + "?tab=itens", notice: 'Itens do empenho foram criados com sucesso.'
		else
			set_itens_do_empenho
			disponibiliza_dependencias
			render :new
		end
	end

	# DELETE /contabilidade/itens_do_empenho/1
	def destroy
		if @item_do_empenho.empenho.existe_liquidacoes?
			redirect_to empenho_path(@item_do_empenho.empenho) + "?tab=itens", notice: "Empenho já tem liquidação, itens não podem ser alterados."
		else
			mensagem = apaga_e_retorna_mensagem(@item_do_empenho)
			redirect_to empenho_path(@item_do_empenho.empenho) + "?tab=itens", mensagem
		end
	end

	private
	def set_empenho
		@empenho = contexto_atual.empenhos.find( params[:empenho_id] )
	end

	def set_item_do_empenho
		@item_do_empenho = Contabilidade::ItemDoEmpenho.find( params[:id] )
	end

	def disponibiliza_dependencias
		@itens =
		if @empenho.derivado_de_licitacao? && !@empenho.derivado_de_contrato?
			@empenho.projeto.itens_do_lote.map {|item_do_lote| item_do_lote.item }
		elsif @empenho.derivado_de_contrato?
			@empenho.contrato.itens_do_contrato.map {|item_do_contrato| item_do_contrato.item_do_lote.item }
		else
			Base::Item.order(:unidade_de_medida_id)
		end
	end

	def set_itens_do_empenho
		if @empenho.projeto && @empenho.contrato
			itens_do_lote = @empenho.projeto.itens_do_lote
			itens_do_lote.each do |item_do_lote|
				@empenho.itens_do_empenho.find_or_initialize_by(item: item_do_lote.item)
			end
		elsif @empenho.contrato.present?
			itens_do_lote = @empenho.contrato.itens_do_lote_do_contrato
			itens_do_lote.each do |item_do_lote|
				@empenho.itens_do_empenho.find_or_initialize_by(item: item_do_lote.item)
			end
		else
			Base::Item.all.each do |item|
				@empenho.itens_do_empenho.find_or_initialize_by(item: item)
			end
		end
	end

	# Permite apenas os parâmetros específicos
	def itens_do_empenho_params
		ajusta_itens_do_empenho_a_serem_removidos
		params.require(:contabilidade_empenho).permit(
			itens_do_empenho_attributes:[:id,:empenho_id, :item_id, :quantidade, :valor_unitario, :total, :_destroy]
		)
	end

	def salva_itens_do_empenho
		@empenho.update(itens_do_empenho_params)
	end

	def ajusta_itens_do_empenho_a_serem_removidos
		params['contabilidade_empenho']['itens_do_empenho_attributes'].each { |key, value|
			value['_destroy'] = 1 if value['quantidade'].to_f == 0 || value['quantidade'].blank?
		}
	end
end
