module GestaoDeEstoque
  class GestaoDeEstoque::ProgramasPorConsumoController < ApplicationController
    include ControllerConcern
		before_action :authenticate_usuario!
		before_action :autoriza_usuario!
		before_action :set_programa_por_consumo, only: [:show, :edit, :update, :destroy, :cadastrar_itens_por_consumo_e_programa, :atualizar_itens_por_consumo_e_programa]

    # GET /gestao_de_estoque/programas_por_consumo/new
    def new
      @programa_por_consumo = ProgramaPorConsumo.new
    end

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

		# POST /gestao_de_estoque/programas_por_consumo
		def create
			@programa_por_consumo = ProgramaPorConsumo.new(programa_por_consumo_params)
			@programa_por_consumo.transaction do
				if @programa_por_consumo.save
					redirect_to gestao_de_estoque_consumo_path(@programa_por_consumo.consumo)
				else
					disponibiliza_dependencias
					render :new
				end
			rescue Exception => e
				raise e
				raise ActiveRecord::Rollback
			end
		end

		# PATCH/PUT /gestao_de_estoque/programas_por_consumo/1
		def update
			if @programa_por_consumo.update( programa_por_consumo_params )
				redirect_to gestao_de_estoque_consumo_path(@escola_por_consumo.consumo), notice: 'Consumo foi atualizado(a) com sucesso.'
			else
				render :edit
			end
		end

		# DELETE /gestao_de_estoque/programas_por_consumo/1
		def destroy
			mensagem = apaga_e_retorna_mensagem(@consumo)
			redirect_to gestao_de_estoque_consumo_path(@programa_por_consumo.consumo), mensagem
		end

    def cadastrar_itens_por_consumo_e_programa
      disponibiliza_dependencias
      @programa_por_consumo.itens_do_consumo_por_programa.build if @programa_por_consumo.itens_do_consumo_por_programa.empty?

		end

		def atualizar_itens_por_consumo_e_programa
			@programa_por_consumo.transaction do
				if @programa_por_consumo.update(programa_por_consumo_params)
					mensagem = 'Itens atualizados com sucesso.'
					redirect_to gestao_de_estoque_consumo_path(@programa_por_consumo.consumo), notice: mensagem
				else
					disponibiliza_dependencias
					render :cadastrar_itens_por_consumo_e_programa
				end
			rescue Exception => e
				disponibiliza_dependencias
				render :cadastrar_itens_por_consumo_e_programa
				raise ActiveRecord::Rollback
			end
		end

    private
		def disponibiliza_dependencias
      @consumo = Consumo.find( params[:consumo_id] ) if params[:consumo_id].present?
      @estoques = GestaoDeEstoque::Estoque.where(almoxarifado_id: @consumo.almoxarifado_id, unidade_orcamentaria_id: @consumo.unidade_orcamentaria_id,
				programa_por_escola_id: params[:programa_por_escola_id].to_i).order('item_id ASC').select{ |estoque| estoque.quantidade_total_saldo > 0 }
    end

    def set_programa_por_consumo
			@programa_por_consumo = ProgramaPorConsumo.find( params[:id] )
		end

		# Permite apenas os parâmetros específicos
		def programa_por_consumo_params
			params.require(:gestao_de_estoque_programa_por_consumo)
				.permit(:consumo_id, :escola_id, :programa_por_escola_id, itens_do_consumo_por_programa_attributes: [
						:id, :estoque_id, :item_id, :programa_por_consumo_id, :quantidade, :_destroy
					]
				)
		end
  end
end
