module GestaoDeEstoque
class ProgramasPorAlmoxarifadoETransferenciaController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!
	before_action :disponibiliza_dependencias, only: [:cadastrar_itens_do_programa_por_almoxarifado_e_transferencia, :atualizar_itens_do_programa_por_almoxarifado_e_transferencia]
	before_action :set_programa_por_almoxarifado_e_transferencia, only: [:show, :edit, :update, :destroy, :cadastrar_itens_do_programa_por_almoxarifado_e_transferencia, :atualizar_itens_do_programa_por_almoxarifado_e_transferencia]

	# GET /gestao_de_estoque/programa_escolar
	def index
		@q = ProgramasPorAlmoxarifadoETransferencia.order(:id).search(params[:q])
		@programas_por_almoxarifado_e_transferencia = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
	end

	# GET /gestao_de_estoque/programa_escolar/1
	def show
	end

	# GET /gestao_de_estoque/programa_escolar/new
	def new
		@programa_por_almoxarifado_e_transferencia = ProgramaPorAlmoxarifadoETransferencia.new
	end

	# GET /gestao_de_estoque/programa_escolar/1/edit
	def edit
	end

	# POST /gestao_de_estoque/programa_escolar
	def create
		@programa_por_almoxarifado_e_transferencia = ProgramaPorAlmoxarifadoETransferencia.new(programa_por_almoxarifado_e_transferencia_params)

		if @programa_por_almoxarifado_e_transferencia.save
			redirect_to @programa_por_almoxarifado_e_transferencia, notice: 'Programa escolar foi criado(a) com sucesso.'
		else
			render :new
		end
	end

	# PATCH/PUT /gestao_de_estoque/programa_escolar/1
	def update
		if @programa_por_almoxarifado_e_transferencia.update( programa_por_almoxarifado_e_transferencia_params )
			redirect_to @programa_por_almoxarifado_e_transferencia, notice: 'Programa escolar foi atualizado(a) com sucesso.'
		else
			render :edit
		end
	end

	# DELETE /gestao_de_estoque/programa_escolar/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@programa_por_almoxarifado_e_transferencia)
		redirect_to @programa_por_almoxarifado_e_transferencia, mensagem
	end

  def cadastrar_itens_do_programa_por_almoxarifado_e_transferencia
    @programa_por_almoxarifado_e_transferencia.itens_do_programa_por_almoxarifado_e_transferencia.build if @programa_por_almoxarifado_e_transferencia.itens_do_programa_por_almoxarifado_e_transferencia.empty?
  end

  def atualizar_itens_do_programa_por_almoxarifado_e_transferencia
		@programa_por_almoxarifado_e_transferencia.transaction do
			if @programa_por_almoxarifado_e_transferencia.update(programa_por_almoxarifado_e_transferencia_params)
				mensagem = 'Itens atualizados com sucesso.'
				redirect_to gestao_de_estoque_transferencia_path(@transferencia), notice: mensagem
			else
				disponibiliza_dependencias
				render :cadastrar_itens_do_programa_por_almoxarifado_e_transferencia
			end
		rescue Exception => e
			disponibiliza_dependencias
			render :cadastrar_itens_do_programa_por_almoxarifado_e_transferencia
			raise ActiveRecord::Rollback
		end
  end

	def disponibiliza_dependencias
		@transferencia = GestaoDeEstoque::Transferencia.find( params[:transferencia_id] ) if params[:transferencia_id].present?
		@estoques = GestaoDeEstoque::Estoque.where("gestao_de_estoque_estoques.almoxarifado_id = #{@transferencia.almoxarifado_id} AND gestao_de_estoque_estoques.unidade_orcamentaria_id = #{@transferencia.unidade_orcamentaria_id}").select{ |estoque| estoque.quantidade_total_saldo > 0 }
		@programas = Loa::Acao.where('id in (?)', [5471, 5480, 5481, 5484, 5482])
	end

	private
	def set_programa_por_almoxarifado_e_transferencia
		@programa_por_almoxarifado_e_transferencia = ProgramaPorAlmoxarifadoETransferencia.find( params[:id] )
	end

	# Permite apenas os parâmetros específicos
	def programa_por_almoxarifado_e_transferencia_params
		params.require(:gestao_de_estoque_programa_por_almoxarifado_e_transferencia)
			.permit(:acao_id, :nome, :data_inicial, :data_final, itens_do_programa_por_almoxarifado_e_transferencia_attributes: [
				:id, :estoque_id, :item_id, :programa_por_almoxarifado_e_transferencia_id, :quantidade, :_destroy
			])
		
	end
end
end
