class Ppa::Relatorios::ImpressaoDePpaController < ApplicationController
	include RelatoriosConcern
	include PpaControllersConcern
	include DadosGraficosConcern

	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except:[:imprimir_ppa, :preparar_impressao_ppa, :dados_do_relatorio_de_criticas, :gerar_capa, :salvar_capa]
	skip_before_action :force_pdf_response_format, only: [:opcoes, :gerar_capa, :salvar_capa, :preparar_impressao_ppa, :prioridades_e_metas, :prepara_impressao_graficos, :dados_do_relatorio_de_criticas, :graficos]

	def opcoes
		@dados_obrigatorios_invalidos = get_dados_obrigatorios_do_ppa_invalidos
		@ppa = ppa_atual
	end

	def dados_do_relatorio_de_criticas
		@dados_obrigatorios_invalidos = get_dados_obrigatorios_do_ppa_invalidos
		@dados_opcionais_invalidos = get_dados_opcionais_do_ppa_invalidos
		respond_to do |format|
			format.json {
				render json: { obrigatorio: @dados_obrigatorios_invalidos, opcional: @dados_opcionais_invalidos }
			}
		end
	end

	def gerar_capa
		@altura_da_pagina = params[:altura_da_pagina].to_i
		@largura_da_pagina = params[:largura_da_pagina].to_i
		respond_to do |format|
			format.json { render json: {'mensagem': 'Capa Gerada com sucesso', 'tipo': 'sucesso'} }
			format.js
		end
	end

	def salvar_capa
		arquivo = File.new(Rails.root.join('tmp', "capa_ppa.pdf"), "w")
		arquivo.write(Base64.decode64(params[:data_pdf]).force_encoding('UTF-8'))
		arquivo.close

		respond_to do |format|
			format.json { render json: {'mensagem': 'Capa Gerada com sucesso', 'tipo': 'sucesso'} }
		end
	end

	def imprimir_ppa
		arquivo = File.new(Rails.root.join('tmp', "imprimir_ppa.pdf"), "w")
		arquivo.write(Base64.decode64(params[:data_pdf]).force_encoding('UTF-8'))
		arquivo.close

		if inclui_contexto? || (inclui_capa? && File.exist?(Rails.root.join('tmp', "capa_ppa.pdf")) )
			combinar_dados(arquivo)
		end

		send_file( Rails.root.join('tmp', "imprimir_ppa.pdf"),
			filename: "imprimir_ppa.pdf",
			type: 'application/pdf',
			disposition: 'inline'
		)
	end

	def graficos
		@ppa = ppa_atual
	end

	def prepara_impressao_graficos
		@consolida_tres_ultimos_exercicios = consolida_tres_ultimos_exercicios?
		if params[:graficos].nil? || dados_para_graficos(params[:graficos].keys).nil?
			format.json { render json: {'mensagem': 'Ocorreu um erro na impressão'} }
		else
			respond_to do |format|
				format.json { render json: {'mensagem': 'Dados dos Gráficos carregados com sucesso. Aguarde..', 'tipo': 'sucesso'} }
				format.js
			end
		end
	end

	def preparar_impressao_ppa
		carrega_dados_basicos_ppa

		@consolida_tres_ultimos_exercicios = consolida_tres_ultimos_exercicios?
		@eixos = ppa_atual.eixos.order(:id)
		@encadernar = encadernar?
		@programas_tematicos = ppa_atual.programas.where(tipo_de_programa_id: 1).sort_by(&:codigo_completo)
		@programas_de_gestao_e_manutencao = ppa_atual.programas.order(:codigo).where(tipo_de_programa_id: 2)

		if params[:graficos].present? && params[:graficos].keys.include?('grafico_fontes_de_financiamento_ppa_por_exercicio') && @consolida_tres_ultimos_exercicios
			params[:graficos].delete_if {|grafico| grafico == 'grafico_fontes_de_financiamento_ppa_por_exercicio' }
			params[:graficos][:grafico_fontes_de_financiamento_ppa_por_exercicio_sendo_3_ultimos_consolidados] = '1'
		end

		if exibir_graficos? && params[:graficos].present?
			dados_para_graficos(params[:graficos].keys)
		end

		respond_to do |format|
			format.json { render json: {'mensagem': 'Dados do PPA carregados com sucesso. Aguarde..', 'tipo': 'sucesso'} }
			format.js
		end

	end

	def prioridades_e_metas
		carrega_dados_basicos_prioridades_e_metas
		@exercicio = params[:exercicio]
		@relatorio_de_prioridades_e_metas = ppa_atual.relatorio_de_prioridades_e_metas(@exercicio)
	end

	def carrega_dados_basicos_ppa

		configuracao = Configuracao.first

		@logo = configuracao.brasao.path

		@prefeitura = configuracao.nome_da_prefeitura
		@quantidade_de_paginas_do_contexto = informa_numero_de_paginas_do_contexto
		@exibir_metas_fisicas = exibir_metas_fisicas?
		@ocultar_orgao = ocultar_orgao_dos_programas_e_objetivos?
		@ocultar_objetivos_programa_gestao = ocultar_objetivos_programa_gestao?
		@ocultar_fontes = ocultar_fontes?
		@opcoes_iniciativas = ocultar_iniciativas?
		@opcoes_iniciativas_tematicas = ocultar_iniciativas_tematica?

		@quantidade_de_programas = ppa_atual.programas.count
		@valor_total_da_despesa = ppa_atual.valor_total_da_despesa
		@quantidade_de_eixos = ppa_atual.eixos.count
		@possui_eixo_com_diretrizes = ppa_atual.possui_eixo_com_diretrizes?
		@titulo_do_ppa = ppa_atual.titulo_para_relatorio_ppa
	end

	def carrega_dados_basicos_prioridades_e_metas
		configuracao = Configuracao.first
		@logo = configuracao.brasao.path
		@prefeitura = configuracao.nome_da_prefeitura
		@titulo_do_ppa = ppa_atual.titulo_para_relatorio_ppa
	end

	def informa_numero_de_paginas_do_contexto
		if  inclui_contexto? && ppa_atual.url_arquivo_de_contexto_updated_at.present?
			io = open(ppa_atual.url_arquivo_de_contexto.path)
			reader = PDF::Reader.new(io)
			reader.page_count
		else
			0
		end
	end

	def combinar_dados relatorio
		pdf = CombinePDF.new
		pdf << CombinePDF.load(Rails.root.join('tmp', "capa_ppa.pdf")) if inclui_capa? && File.exist?(Rails.root.join('tmp', "capa_ppa.pdf"))
		pdf << CombinePDF.load(  ppa_atual.url_arquivo_de_contexto.path ) if inclui_contexto?
		pdf << CombinePDF.load( Rails.root.join('tmp', "imprimir_ppa.pdf") )

		pdf.save Rails.root.join('tmp', "imprimir_ppa.pdf")
	end

	def consolida_tres_ultimos_exercicios?
		params[:opcoes].try( :[], 'consolidar') == 'sim'
	end

	def encadernar?
		params[:opcoes].try( :[], 'encadernar') == 'sim'
	end

	def inclui_contexto?
		params[:opcoes].try( :[], 'incluir_contexto') == 'sim' && ppa_atual.try(:url_arquivo_de_contexto_updated_at).present?
	end

	def inclui_capa?
		params[:opcoes].try( :[], 'incluir_capa') == 'sim'
	end

	def exibir_metas_fisicas?
		params[:opcoes].try( :[], 'metas_fisicas') == 'sim'
	end

	def ocultar_orgao_dos_programas_e_objetivos?
		params[:opcoes].try( :[], 'orgao') == 'sim'
	end

	def ocultar_objetivos_programa_gestao?
		params[:opcoes].try( :[], 'objetivo') == 'sim'
	end

	def exibir_graficos?
		params[:opcoes].try( :[], 'graficos') == 'sim'
	end

	def ocultar_fontes?
		params[:opcoes].try( :[], 'fontes') == 'sim'
	end

	def ocultar_iniciativas?
		params[:opcoes].try( :[], 'iniciativas') == 'sim'
	end

	def ocultar_iniciativas_tematica?
		params[:opcoes].try( :[], 'iniciativas_tematicas') == 'sim'
	end

end
