class Ppa::IniciativasController < ApplicationController
	include ControllerConcern
	include PpaControllersConcern

	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:proximo_codigo]
	before_action :set_ppa_iniciativa, only: [:show, :edit, :update, :destroy, :editar_despesas, :atualizar_despesas]
	before_action :disponibiliza_recursos, only: [:index, :edit, :new]

	# GET /ppa/iniciativas
	def index
		@q = Ppa::Iniciativa.order(:id).search(params[:q])
		@ppa_iniciativas = @q.result.paginate(page: params[:page], per_page: 10)
	end

	# GET /ppa/iniciativas/1
	def show
	end

	# GET /ppa/iniciativas/new
	def new
		select_propostas
		objetivo = Ppa::Objetivo.find( params[:objetivo_id])
		@ppa_iniciativa = objetivo.iniciativas.build
	end

	# GET /ppa/iniciativas/1/edit
	def edit
	end

	# POST /ppa/iniciativas
	def create
		@ppa_iniciativa = Ppa::Iniciativa.new(ppa_iniciativa_params)
		@ppa_iniciativa.codigo = Ppa::Iniciativa.sugestao_de_codigo_para_a_proxima_iniciativa(ppa_atual.id, params[:ppa_iniciativa][:natureza_da_iniciativa_id])
		if @ppa_iniciativa.save
			if manter_form_apos_cadastro?
				redirect_path = { action: :new, objetivo_id: @ppa_iniciativa.objetivo.id }
			else
				redirect_path = !@ppa_iniciativa.ppa.detalha_despesas_nas_iniciativas? && params[:redirect] == 'projecao' ? projecoes_de_despesa_edit_ppa_programa_path(id: @ppa_iniciativa.programa.id) : @ppa_iniciativa.objetivo
			end
			redirect_to redirect_path, notice: 'Iniciativa foi criada com sucesso.'
		else
			select_propostas
			disponibiliza_recursos
			render :new
		end
	end

	# PATCH/PUT /ppa/iniciativas/1
	def update
		if @ppa_iniciativa.update(ppa_iniciativa_params)
			redirect_path = !@ppa_iniciativa.ppa.detalha_despesas_nas_iniciativas? && params[:redirect] == 'projecao' ? projecoes_de_despesa_edit_ppa_programa_path(id: @ppa_iniciativa.programa.id) : @ppa_iniciativa.objetivo
			redirect_to redirect_path, notice: 'Iniciativa foi atualizada com sucesso.'
		else
			disponibiliza_recursos
			render :edit
		end
	end

	# DELETE /ppa/iniciativas/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@ppa_iniciativa)
		redirect_to @ppa_iniciativa.objetivo, mensagem
	end

	def proximo_codigo
		proximo_codigo = Ppa::Iniciativa.sugestao_de_codigo_para_a_proxima_iniciativa( ppa_atual.id, params[:natureza_da_iniciativa_id] )
		respond_with proximo_codigo.digitos(3).to_json
	end

	private
	# Use callbacks to share common setup or constraints between actions.
	def set_ppa_iniciativa
		@ppa_iniciativa = Ppa::Iniciativa.find(params[:id])
	end

	# Only allow a trusted parameter "white list" through.
	def ppa_iniciativa_params
		params.require(:ppa_iniciativa).permit(:objetivo_id, :funcao_id, :sub_funcao_id, :descricao, :natureza_da_iniciativa_id, :unidade_orcamentaria_id, :proposta_id)
	end

	def disponibiliza_recursos
		@orgaos = Ppa::Orgao.where( ppa_id: ppa_atual ).order(:codigo)
		@naturezas_das_iniciativas = Ppa::NaturezaDaIniciativa.order(:codigo)
		@funcoes = Ppa::Funcao.where( ppa_id: ppa_atual.id ).order(:nome)
	end

	def select_propostas
		@propostas = ppa_atual.propostas.aprovadas
	end
end
