class Ppa::ProgramasController < ApplicationController
	include ControllerConcern
	include PpaControllersConcern

	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:proximo_codigo]
	before_action :set_ppa_programa, only: [:show, :edit, :update, :destroy, :edit_projecoes_de_despesa, :update_projecoes_de_despesa]
	before_action :disponibiliza_dependencias, only: [:index, :edit, :new]

	# GET /ppa/programas
	def index
		@q = Ppa::Programa.where( ppa_id: ppa_atual.id ).order(:tipo_de_programa_id).order(:codigo).ransack(query_params)
		@ppa_programas = @q.result.paginate(page: params[:page], per_page: 10)
	end

	# GET /ppa/programas/1
	def show
		@projecoes_de_despesa_resumidas = @ppa_programa.projecoes_de_despesa_resumidas
		@objetivos = @ppa_programa.objetivos.order(codigo: :asc)
	end

	# GET /ppa/programas/new
	def new
		tipo_de_programa = Ppa::TipoDePrograma.find_by(id: params[:tipo_de_programa_id])

		if tipo_de_programa
			@ppa_programa = ppa_atual.programas.new(tipo_de_programa_id: tipo_de_programa.id)
		else
			redirect_to ppa_programas_url, alert: 'Selecione o tipo de programa.'
		end
	end

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

	# POST /ppa/programas
	def create
		@ppa_programa = ppa_atual.programas.new(ppa_programa_params)
		if @ppa_programa.save
			redirect_to @ppa_programa, notice: 'Programa foi criado com sucesso.'
		else
			disponibiliza_dependencias
			render :new
		end
	end

	# PATCH/PUT /ppa/programas/1
	def update
		if @ppa_programa.update(ppa_programa_params)
			redirect_to @ppa_programa, notice: 'Programa foi atualizado com sucesso.'
		else
			disponibiliza_dependencias
			render :edit
		end
	end

	# DELETE /ppa/programas/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@ppa_programa)
		if mensagem[:alert].present?
			redirect_to @ppa_programa, mensagem
		else
			redirect_to ppa_programas_url, mensagem
		end
	end

	def proximo_codigo
		codigo = Ppa::Programa( params[:codigo], params[:codigo_programa])
		respond_with codigo.digitos(3).to_json
	end

	def resumo_financeiro_dos_programas
		@relatorio_de_resumo_financeiro_por_programas = ppa_atual.relatorio_de_resumo_financeiro_por_programas

		respond_to do |format|
			format.js
		end
	end

	def resumo_financeiro_por_programa
		@programa = Ppa::Programa.joins(:ppa).where('ppa_programas.id = ?', params[:programa_id].to_i).last
		@consolidado = params[:consolidado].eql? "sim"

		respond_to do |format|
			format.js
		end
	end

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

	# Only allow a trusted parameter "white list" through.
	def ppa_programa_params
		params.require(:ppa_programa).permit(:nome, :codigo, :justificativa, :ppa_id, :eixo_id, :tipo_de_programa_id, :orgao_id)
	end

	def disponibiliza_dependencias
		@tipos_de_programa = Ppa::TipoDePrograma.order(:codigo)
		@eixos = Ppa::Eixo.where(ppa_id: ppa_atual.id).order(:nome)
		@orgaos = Ppa::Orgao.where(ppa_id: ppa_atual.id).order(:nome)
	end
end
