module Ppa
	class ConveniosController < ApplicationController
		include ControllerConcern
		include PpaControllersConcern

		before_action :authenticate_usuario!
		before_action :autoriza_usuario!, except: [:relatorio_por_classificacao_da_receita_status_e_ano]
		before_action :set_convenio, only: [:show, :edit, :update, :destroy]
		before_action :set_ppa, only: [:index, :new, :create ]
		before_action :disponibiliza_dependencias, only: [ :new, :edit,:index ]


		# GET /ppa/convenios
		def index
			@q = @ppa.convenios.ransack(query_params)
			@convenios = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
		end

		# GET /ppa/convenios/1
		def show
		end

		# GET /ppa/convenios/new
		def new
			@convenio = @ppa.convenios.new
		end

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

		def create
			@convenio = @ppa.convenios.new( convenio_params )
			if @convenio.save
				if manter_form_apos_cadastro?
					disponibiliza_dependencias
					redirect_path = { action: :new }
				else
					disponibiliza_dependencias
					redirect_path =  @convenio
				end
				redirect_to redirect_path, notice: 'Convênio foi criado(a) com sucesso.'
			else
				disponibiliza_dependencias
				render :new
			end
		end


		# PATCH/PUT /ppa/convenios/1
		def update
			respond_to do |format|
				if @convenio.update( convenio_params )
					format.html { redirect_to @convenio, notice: 'Convênio foi editado com sucesso.' }
					format.json { render json: @convenio, status: :created, location: @convenio }
				else
					disponibiliza_dependencias
					format.html { render :edit }
					format.json { render json: @convenio.errors, status: :unprocessable_entity }
				end
			end
		end

		# DELETE /ppa/convenios/1
		def destroy
			mensagem = apaga_e_retorna_mensagem(@convenio)
			redirect_to ppa_convenios_path( ppa_id: @convenio.ppa.id ), mensagem
		end

		def relatorio_unico_convenio
			@convenio = Convenio.find( params[:id] )
			@receitas_dados =  Convenio.dados_relatorio_receita(ppa_atual, @convenio)
			@convenio_dados = Convenio.dados_unico_convenio(@convenio)

			respond_to do |format|
				format.js
			end
		end

		def relatorio_por_classificacao_da_receita_status_e_ano
			return if bloqueia_usuario_com_base_em 'read'
			@dados_do_relatorio = ppa_atual.relatorio_de_convenios_por_classificacao_da_receita_status_e_ano
			@titulo = "RELATÓRIO DE CONVÊNIOS POR CLASSIFICAÇÃO DA RECEITA, CLASSIFICAÇÃO E ANO"

			respond_to do |format|
				format.js
			end
		end


		def relatorio_por_subarea_tematica_classificacao_ano
			@dados_do_relatorio = ppa_atual.try(:relatorio_de_convenios_por_subarea_tematica_classificacao_ano, params[:esfera])
			com_esfera = ", ESFERA " if params[:esfera].eql? 'sim'
			@titulo = "RELATÓRIO DE CONVENIOS POR SUBÁREA TEMÁTICA, CLASSIFICAÇÃO#{com_esfera} E ANO"

			if !@dados_do_relatorio.blank?
				respond_to do |format|
					format.js
					format.xlsx { response.headers['Content-Disposition'] = "attachment; filename=\"#{@titulo.downcase.parameterize}.xlsx\"" }
				end
			else
				flash[:alert] = "O relatório não pode ser impresso, pois há dados faltando."
				render json: ppa_convenios_path
			end
		end

		def relatorio_por_subarea_tematica_status_ano
			@dados_do_relatorio = ppa_atual.relatorio_de_convenios_por_subarea_tematica_status_ano
			@titulo = "RELATÓRIO DE CONVÊNIOS POR SUBÁREA TEMÁTICA, STATUS E ANO"

			respond_to do |format|
				format.js
				format.xlsx { response.headers['Content-Disposition'] = "attachment; filename=\"#{@titulo.downcase.parameterize}.xlsx\"" }
			end
		end

		def relatorio_por_subarea_e_ano
			@dados_do_relatorio = ppa_atual.relatorio_por_subarea_e_ano
			@ppa = Ppa.find( ppa_atual.id )

			respond_to do |format|
				format.js
			end
		end

		def imprimir_resumo_de_previsao_de_convenios
			@dados_do_relatorio = Convenio.resumo_de_previsao_de_convenios( ppa_atual.id, params[:unidade_orcamentaria] )
			@ppa = Ppa.find( ppa_atual.id )

			if params[:unidade_orcamentaria].present?
				@titulo = "RESUMO DE PREVISÃO DE CONVÊNIOS POR UNIDADE ORÇAMENTÁRIA"
			end

			respond_to do |format|
				format.js
				format.xlsx { response.headers['Content-Disposition'] = "attachment; filename=\"#{@titulo.downcase.parameterize}.xlsx\"" }
			end
		end


		def imprimir_relatorio_status
			if params[:status] == "0"
				@status = "Em execução"
			elsif params[:status] == "1"
				@status = "Em cadastro"
			else
				@status= "Nova demanda"
			end
			@dados = Convenio.relatorio_por_status(ppa_atual, params[:status])
		end

		def imprimir_por_unidade_orcamentaria
			unidade = ppa_atual.unidades_orcamentarias.find_by_id(params[:unidade_orcamentaria])
			@unidade_orcamentaria = unidade.try(:nome)
			@relatorio = Convenio.relatorio_por_unidade_orcamentaria(ppa_atual, params[:unidade_orcamentaria])

			respond_to do |format|
				format.js
			end
		end

		def imprimir_todos_os_convenios
			@dados = Convenio.relatorio_todos_os_convenios(ppa_atual)
			respond_to do |format|
				format.js
			end
		end

		private
		def set_convenio
			@convenio = Convenio.find( params[:id] )
		end

		def set_ppa
			@ppa = Ppa.find( ppa_atual.id )
		end

		def disponibiliza_dependencias
			@funcoes  = ppa_atual.funcoes.order( :codigo )
			@orgaos   = ppa_atual.orgaos.order( :codigo )
			@unidade_orcamentaria = ppa_atual.unidades_orcamentarias
			@areas_tematicas = ppa_atual.areas_tematicas
			@sub_areas_tematicas = Array.new
			@receitas_correntes = ppa_atual.try(:projecao_de_receita).try(:receitas).try(:correntes).try(:de_convenio).try(:analiticas).try(:select) { |receita| receita.receitas_dos_calculos_de_projecao.empty? }
			@receitas_de_capital = ppa_atual.try(:projecao_de_receita).try(:receitas).try(:de_capital).try(:de_convenio).try(:analiticas).try(:select) { |receita| receita.receitas_dos_calculos_de_projecao.empty? }
		end

		# Permite apenas os parâmetros específicos
		def convenio_params
			params.require(:ppa_convenio).permit(:ppa_id, :orgao_id, :unidade_orcamentaria_id, :receita_corrente_id, :receita_de_capital_id, :objeto, :concedente, :esfera, :valor, :sub_area_tematica_id, :numero_do_convenio, :status)
		end
	end
end