module Patrimonio
class CessaoDeBensPatrimoniaisController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!
	before_action :set_cessao_de_bem_patrimonial, only: [
		:show, :edit, :update, :destroy, :confirmar_cessao, :editar_bens_patrimoniais_cedidos,
		:atualiza_bens_patrimoniais_cedidos, :retornar_para_solicitado
	]
	before_action :set_dependencias, only: [:index, :new, :create, :edit]
	before_action :set_dependencias_bens, only: [:editar_bens_patrimoniais_cedidos, :atualiza_bens_patrimoniais_cedidos]

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

	# GET /patrimonio/cessao_de_bens_patrimoniais/1
	def show
		@bens_cedidos = @cessao_de_bem_patrimonial.bens_patrimoniais_cedidos.paginate(page: params[:page], per_page: 10)
	end

	# GET /patrimonio/cessao_de_bens_patrimoniais/new
	def new
		@cessao_de_bem_patrimonial = CessaoDeBemPatrimonial.new
		@cessao_de_bem_patrimonial.unidades_gestoras_da_cessao.build if @cessao_de_bem_patrimonial.unidades_gestoras_da_cessao.empty?
	end

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

	# POST /patrimonio/cessao_de_bens_patrimoniais
	def create
		@cessao_de_bem_patrimonial = CessaoDeBemPatrimonial.new(cessao_de_bem_patrimonial_params)

		if @cessao_de_bem_patrimonial.save
			redirect_to @cessao_de_bem_patrimonial, notice: 'Cessao de bem patrimonial foi criado(a) com sucesso.'
		else
			render :new
		end
	end

	# PATCH/PUT /patrimonio/cessao_de_bens_patrimoniais/1
	def update
		if @cessao_de_bem_patrimonial.update( cessao_de_bem_patrimonial_params )
			redirect_to @cessao_de_bem_patrimonial, notice: 'Cessao de bem patrimonial foi atualizado(a) com sucesso.'
		else
			render :edit
		end
	end

	def editar_bens_patrimoniais_cedidos
		@cessao_de_bem_patrimonial.bens_patrimoniais_cedidos.build unless @cessao_de_bem_patrimonial.bens_patrimoniais_cedidos.present?
	end

	def atualiza_bens_patrimoniais_cedidos
		return if bloqueia_usuario_com_base_em 'editar_bens_patrimoniais_cedidos'
		@cessao_de_bem_patrimonial.transaction do
			if @cessao_de_bem_patrimonial.update(bens_patrimoniais_cedidos_params)
				mensagem = 'Bens atualizados com sucesso.'
				redirect_to patrimonio_cessao_de_bem_patrimonial_path(@cessao_de_bem_patrimonial), notice: mensagem
			else
				render :editar_bens_patrimoniais_cedidos
			end
		rescue Exception => e
			render :editar_bens_patrimoniais_cedidos
			raise ActiveRecord::Rollback
		end
	end

	def confirmar_cessao
		if @cessao_de_bem_patrimonial.confirmar_cessao!
			redirect_to patrimonio_cessao_de_bem_patrimonial_path(@cessao_de_bem_patrimonial), notice: "Cessão de Bem Patrimonial confirmada."
		else
			render :show
		end
	end

	def retornar_para_solicitado
		if @cessao_de_bem_patrimonial.retornar_para_solicitado!
			redirect_to patrimonio_cessao_de_bem_patrimonial_path(@cessao_de_bem_patrimonial), notice: "Cessão de Bem Patrimonial Reaberta."
		else
			render :show
		end
	end

	# DELETE /patrimonio/cessao_de_bens_patrimoniais/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@cessao_de_bem_patrimonial)
		redirect_to patrimonio_cessao_de_bens_patrimoniais_url, mensagem
	end

	private
	def set_cessao_de_bem_patrimonial
		@cessao_de_bem_patrimonial = CessaoDeBemPatrimonial.find( params[:id] )
	end

	def set_dependencias
		@status = Patrimonio::CessaoDeBemPatrimonial.status_i18n.transform_keys{ |key| Patrimonio::CessaoDeBemPatrimonial.status[key] }
		@unidades_gestoras = Loa::UnidadeGestora.ativo_no_sistema.order('codigo ASC')
		@doadores = Base::Pessoa.includes(:tipo_de_pessoa).all.order(id: :asc)
	end

	def set_dependencias_bens
		bens_patrimoniais = Patrimonio::BemPatrimonial.where('patrimonio_bens_patrimoniais.status = 1 
			AND patrimonio_bens_patrimoniais.unidade_gestora_id in (?)', @cessao_de_bem_patrimonial.unidades_gestoras.pluck(:id)).includes(:item)

		bens_cedidos = Patrimonio::BemPatrimonialCedido.joins(:cessao_de_bem_patrimonial).where('patrimonio_cessao_de_bens_patrimoniais.id <> ?', @cessao_de_bem_patrimonial.id)

		bens_pendentes = []
		bens_cedidos.each do |bem|
			bens_pendentes << bem.bem_patrimonial_id
		end

		@bens_patrimoniais = bens_pendentes.flatten.present? ? bens_patrimoniais.where.not(id: bens_pendentes.flatten).order('id ASC') : bens_patrimoniais.order('id ASC')
	end

	# Permite apenas os parâmetros específicos
	def cessao_de_bem_patrimonial_params
		params.require(:patrimonio_cessao_de_bem_patrimonial).permit(
			:data_da_cessao, :numero_do_termo, :status, :beneficente_id, :responsavel,
			unidades_gestoras_da_cessao_attributes: [ 
				:id, :cessao_de_bem_patrimonial_id, :unidade_gestora_id, :_destroy 
			]
			)
		
	end

	def bens_patrimoniais_cedidos_params
		params.require(:patrimonio_cessao_de_bem_patrimonial).permit(
			bens_patrimoniais_cedidos_attributes: [
				:id, :cessao_de_bem_patrimonial_id, :bem_patrimonial_id, :_destroy 
			]
		)	
	end
end
end
