module Patrimonio
class DevolucaoDeBensPatrimoniaisController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!
	before_action :set_devolucao_de_bem_patrimonial, only: [
		:show, :edit, :update, :destroy, :editar_itens_da_devolucao, :atualiza_itens_da_devolucao, :confirmar_devolucao, :retornar_devolucao_para_solicitado
	]
	before_action :referencia_de_links_dependencias, except: :index
	before_action :set_dependencias, only: [:new, :create, :edit, :update]
	before_action :set_dependencias_itens, only: [:editar_itens_da_devolucao, :atualiza_itens_da_devolucao]

	# GET /patrimonio/devolucao_de_bens_patrimoniais
	def index
		@q = DevolucaoDeBemPatrimonial.order(:id).search(params[:q])
		@devolucao_de_bens_patrimoniais = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
	end

	# GET /patrimonio/devolucao_de_bens_patrimoniais/1
	def show
		if @devolucao_de_bem_patrimonial.present? && @devolucao_de_bem_patrimonial.origem_id? && @devolucao_de_bem_patrimonial.origem_type?
			@origem_type = @devolucao_de_bem_patrimonial.origem_type
			@origem_id = @devolucao_de_bem_patrimonial.origem_id
			if @origem_type == 'Patrimonio::CessaoDeBemPatrimonial'
				@origem = Patrimonio::CessaoDeBemPatrimonial.find(@origem_id.to_i)
			end
		end
	end

	# GET /patrimonio/devolucao_de_bens_patrimoniais/new
	def new
		@devolucao_de_bem_patrimonial = DevolucaoDeBemPatrimonial.new
	end

	# GET /patrimonio/devolucao_de_bens_patrimoniais/1/edit
	def edit
	end

	# POST /patrimonio/devolucao_de_bens_patrimoniais
	def create
		@devolucao_de_bem_patrimonial = DevolucaoDeBemPatrimonial.new(devolucao_de_bem_patrimonial_params)
		@devolucao_de_bem_patrimonial.orcamento = contexto_atual

		if @devolucao_de_bem_patrimonial.save
			if @devolucao_de_bem_patrimonial.tipo == "total"
				adiciona_itens_total
				redirect_to patrimonio_devolucao_de_bem_patrimonial_path(@devolucao_de_bem_patrimonial), notice: 'Devolucao de bem patrimonial foi criado(a) com sucesso.'
			else
				redirect_to @devolucao_de_bem_patrimonial, notice: 'Devolucao de bem patrimonial foi criado(a) com sucesso.'
			end
		else
			render :new
		end
	end

	# PATCH/PUT /patrimonio/devolucao_de_bens_patrimoniais/1
	def update
		if @devolucao_de_bem_patrimonial.update( devolucao_de_bem_patrimonial_params )
			redirect_to @devolucao_de_bem_patrimonial, notice: 'Devolucao de bem patrimonial foi atualizado(a) com sucesso.'
		else
			render :edit
		end
	end

	def editar_itens_da_devolucao
		@devolucao_de_bem_patrimonial.itens_da_devolucao_de_bens_patrimoniais.build unless @devolucao_de_bem_patrimonial.itens_da_devolucao_de_bens_patrimoniais.present?
	end

	def atualiza_itens_da_devolucao
		return if bloqueia_usuario_com_base_em 'editar_itens_da_devolucao'
		@devolucao_de_bem_patrimonial.transaction do
			if @devolucao_de_bem_patrimonial.update(itens_da_devolucao_de_bens_patrimoniais_params)
				mensagem = 'Bens atualizados com sucesso.'
				redirect_to patrimonio_devolucao_de_bem_patrimonial_path(@devolucao_de_bem_patrimonial), notice: mensagem
			else
				render :editar_itens_da_devolucao
			end
		rescue Exception => e
			render :editar_itens_da_devolucao
			raise ActiveRecord::Rollback
		end
	end

	def confirmar_devolucao
		if @devolucao_de_bem_patrimonial.confirmar_devolucao!
			redirect_to patrimonio_devolucao_de_bem_patrimonial_path(@devolucao_de_bem_patrimonial), notice: "Devolução Patrimonial confirmada."
		else
			render :show
		end
	end

	def retornar_devolucao_para_solicitado
		if @devolucao_de_bem_patrimonial.retornar_devolucao_para_solicitado!
			redirect_to patrimonio_devolucao_de_bem_patrimonial_path(@devolucao_de_bem_patrimonial), notice: "Devolução Patrimonial Reaberta."
		else
			render :show
		end
	end

	# DELETE /patrimonio/devolucao_de_bens_patrimoniais/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@devolucao_de_bem_patrimonial)
		redirect_to polymorphic_path(@devolucao_de_bem_patrimonial.origem), mensagem
	end

	private
	def set_devolucao_de_bem_patrimonial
		@devolucao_de_bem_patrimonial = DevolucaoDeBemPatrimonial.find( params[:id] )
	end

	def set_dependencias
		@tipos = Patrimonio::DevolucaoDeBemPatrimonial.tipos
	end

	def set_dependencias_itens
		@bens_patrimoniais = @devolucao_de_bem_patrimonial.origem.bens_patrimoniais.where(status_complementar: 1)
	end

	def referencia_de_links_dependencias
		if params[:origem_type].present? || params['patrimonio_devolucao_de_bem_patrimonial'].present?
			@origem_type = params[:origem_type] || params['patrimonio_devolucao_de_bem_patrimonial']['origem_type']
			@origem_id = params[:origem_id] || params['patrimonio_devolucao_de_bem_patrimonial']['origem_id']
			if @origem_type == 'Patrimonio::CessaoDeBemPatrimonial'
				@origem = Patrimonio::CessaoDeBemPatrimonial.find(@origem_id.to_i)
			end
		end
	end

	def adiciona_itens_total
		if @devolucao_de_bem_patrimonial.origem_type == 'Patrimonio::CessaoDeBemPatrimonial'
			@cessao = Patrimonio::CessaoDeBemPatrimonial.find(@devolucao_de_bem_patrimonial.origem_id)
			if @cessao.present?
				@cessao.bens_patrimoniais_cedidos.each do |bem_cedido|
					@devolucao_de_bem_patrimonial.itens_da_devolucao_de_bens_patrimoniais.find_or_initialize_by(
						devolucao_de_bem_patrimonial_id: @devolucao_de_bem_patrimonial.id,
						bem_patrimonial_id: bem_cedido.bem_patrimonial_id
					)
				end
			end
		end

		@devolucao_de_bem_patrimonial.save
	end

	# Permite apenas os parâmetros específicos
	def devolucao_de_bem_patrimonial_params
		params.require(:patrimonio_devolucao_de_bem_patrimonial).permit(
			:data_da_devolucao, :numero_da_devolucao, :origem_id, :origem_type,
			:status, :tipo, :responsavel, :observacao, :orcamento_id
		)
	end

	def itens_da_devolucao_de_bens_patrimoniais_params
		params.require(:patrimonio_devolucao_de_bem_patrimonial).permit(
			itens_da_devolucao_de_bens_patrimoniais_attributes: [
				:id, :devolucao_de_bem_patrimonial_id, :bem_patrimonial_id, :_destroy 
			]
		)	
	end
end
end
