module Pdf
	class Criar
		@altura_da_pagina = nil
		@altura_limite_da_pagina = nil
		@altura_atual_da_linha = nil
		@altura_inicial_da_pagina = nil
		@largura_da_pagina = nil
		@fonte = nil
		@estilo_da_fonte = nil
		@tamanho_fonte = nil
		@espessura_linha = nil
		@tamanho_quebra_de_linha = nil
		@tamanho_meia_quebra_de_linha = nil
		@tamanho_fonte_do_titulo = nil

		@configuracoes = nil
		@cabecalho = nil
		@cabecalho_para_relatorio = nil
		@rodape_para_relatorio = nil
		@configuracao_sistema = nil

		# Parametros possiveis
		# orientacao: landscape ou portrait (tipo de pagina deitada ou em pé respectivamente)
		# tamanho_quebra_de_linha: 5, 6 ou 7 (quebra de linha de um texto para outro)
		# tamanho_quebra_de_linha_para_texto_completo: 5, 6 ou 7 (quebra de linha em texto unico. Só irá funcionar caso o parametro imprime_texto_completo do objeto configuracoes esteja setado como true)
		# tamanho_fonte: 5 a 10
		def initialize(params)
			if params[:orientacao] == 'landscape'
				@altura_da_pagina = 200
				@largura_da_pagina = 290
			else
				@altura_da_pagina = 290
				@largura_da_pagina = 200
			end

			if params[:altura_inicial_da_pagina].present?
				@altura_atual_da_linha = params[:altura_inicial_da_pagina]
				@altura_inicial_da_pagina = params[:altura_inicial_da_pagina]
			elsif params[:encadernar].present?
				@altura_atual_da_linha = 25
				@altura_inicial_da_pagina = 25
			else
				@altura_inicial_da_pagina = 10
				@altura_atual_da_linha = 10
			end

			if params[:tamanho_quebra_de_linha].present?
				@tamanho_quebra_de_linha = params[:tamanho_quebra_de_linha]
			else
				@tamanho_quebra_de_linha = 7
			end

			if params[:tamanho_quebra_de_linha_para_texto_completo].present?
				@tamanho_quebra_de_linha_para_texto_completo = params[:tamanho_quebra_de_linha_para_texto_completo]
			else
				@tamanho_quebra_de_linha_para_texto_completo = 5
			end

			@tamanho_meia_quebra_de_linha = (@tamanho_quebra_de_linha/2.to_f).round
			@quantidade_de_quebras_de_linha_para_nova_linha = 0
			@quantidade_limite_de_quebras_de_linha_para_registro = 10

			@fonte = "Times"
			@estilo_da_fonte = "Roman"

			if params[:tamanho_fonte].present?
				@tamanho_fonte = params[:tamanho_fonte]
			else
				@tamanho_fonte = 10
			end

			@tamanho_fonte_do_titulo = 12

			if params[:quantidade_de_paginas_do_contexto].present?
				@quantidade_de_paginas_do_contexto = params[:quantidade_de_paginas_do_contexto]
			else
				@quantidade_de_paginas_do_contexto = 0
			end

			@espessura_linha = 0.1
			@ultima_pagina = 1
			@configuracao_sistema = Configuracao.first
			@configuracoes = {numero_da_pagina: 1, subir_tabela_ao_quebrar_pagina: true}
			@altura_limite_da_pagina = @altura_da_pagina
		end

		def setar_tamanho_fonte_do_titulo(tamanho)
			@tamanho_fonte_do_titulo = tamanho
		end

		def setar_tamanho_da_fonte(tamanho)
			@tamanho_fonte = tamanho.to_i
		end

		def get_tamanho_da_fonte
			@tamanho_fonte
		end

		def get_tamanho_meia_quebra_de_linha
			return @tamanho_meia_quebra_de_linha
		end

		def setar_padroes
			js = "pdf.setFont(\"#{@fonte}\", \"#{@estilo_da_fonte}\");"
			# js = "pdf.setFont(\"#{@fonte}\");"
			js += "pdf.setFontSize(#{@tamanho_fonte});";
			js += "pdf.setLineWidth(#{@espessura_linha});";
			js += "pdf.setFontType(\"normal\");"
			return js.html_safe
		end

		def criar_cabecalho
			js = ''

			tem_subcoluna = false
			posicao_anterior_da_linha_vertical = @configuracoes[:coordenada_inicial][0]
			posicao_horizontal_do_texto = @configuracoes[:coordenada_inicial][1]

			@altura_atual_da_linha += @tamanho_meia_quebra_de_linha

			@cabecalho.each_with_index.map do |coluna, index|

				posicao_inicial_da_coluna = posicao_horizontal_do_texto
				posicao_final_da_coluna = posicao_horizontal_do_texto + coluna[:tamanho]

 				js += criar_texto({texto: coluna[:nome], estilo: {negrito: true}, alinhamento: 'centralizado', altura: @altura_atual_da_linha, posicao_por_coluna: [posicao_inicial_da_coluna, posicao_final_da_coluna], independente: false})

				if index < @cabecalho.size
					posicao_horizontal_do_texto += coluna[:tamanho]
					coluna[:posicao_da_linha_vertical_final] = posicao_horizontal_do_texto
					coluna[:posicao_da_linha_vertical_inicial] = posicao_anterior_da_linha_vertical

					if coluna[:subcolunas].present?
						eixo_x = @altura_atual_da_linha + @tamanho_meia_quebra_de_linha
						eixo_y = posicao_anterior_da_linha_vertical
						tamanho = coluna[:posicao_da_linha_vertical_final] - coluna[:posicao_da_linha_vertical_inicial]
						linha_horizontal = { coordenada: [eixo_x, eixo_y], tamanho: tamanho}
						js += criar_linha_horizontal(linha_horizontal)
					end

					posicao_anterior_da_linha_vertical = coluna[:posicao_da_linha_vertical_final]
				end

				if coluna[:subcolunas].present?
					tem_subcoluna = true
				end
 			end

			if tem_subcoluna
				js += criar_subcolunas_do_cabecalho
			end

			js += criar_linha_horizontal({coordenada: [@altura_atual_da_linha + @configuracoes[:margem_vertical_extra_para_linha_horizontal_inferior_da_tabela], @configuracoes[:coordenada_inicial][1]], tamanho: @configuracoes[:tamanho_linha_horizontal_da_tabela]})

 			return js.html_safe
		end

		def criar_tabela(tabela)
			@configuracoes = @configuracoes.merge(tabela[:configuracoes])
			@cabecalho = tabela[:cabecalho]
			@configuracoes[:tamanho_das_colunas] = tamanho_das_colunas
			@configuracoes[:alinhamento_das_colunas] = alinhamento_das_colunas
			@configuracoes[:tamanho_linha_vertical_da_tabela] = @configuracoes[:coordenada_final][0] - @configuracoes[:coordenada_inicial][0]
			@configuracoes[:tamanho_linha_horizontal_da_tabela] = @configuracoes[:coordenada_final][1] - @configuracoes[:coordenada_inicial][1]
			@configuracoes[:margem_vertical_extra_para_linha_horizontal_inferior_da_tabela] = 2

			@configuracoes[:linha_numero_por_pagina] = 0
			@configuracoes[:total_itens_por_pagina] = 0

			unless @configuracoes[:quantidade_de_linhas_com_totais].present?
				@configuracoes[:quantidade_de_linhas_com_totais] = 0
			end

			@altura_atual_da_linha = @configuracoes[:coordenada_inicial][0]

			js = ''
			js += criar_cabecalho unless @configuracoes[:sem_contorno].present?

			js += dados_tabela(tabela)
			js += criar_contorno_da_tabela unless @configuracoes[:sem_contorno].present?
			js += criar_linhas_verticais_para_colunas unless @configuracoes[:sem_contorno].present?

			@configuracoes = {numero_da_pagina: get_numero_da_pagina, subir_tabela_ao_quebrar_pagina: true}

			return js.html_safe
		end

		def criar_linha_vertical(linha)
			linha = {'eixo_vertical': [ linha[:coordenada][0], linha[:coordenada][0] + linha[:tamanho] ], 'eixo_horizontal': [ linha[:coordenada][1], linha[:coordenada][1] ] }
			return criar_linha(linha)
		end

		def criar_linha_horizontal(linha)
			linha = {'eixo_vertical': [ linha[:coordenada][0], linha[:coordenada][0] ], 'eixo_horizontal': [ linha[:coordenada][1], linha[:coordenada][1] + linha[:tamanho] ] }
			return criar_linha(linha)
		end

		def criar_linha(linha)
			return "pdf.line(#{linha[:eixo_horizontal][0]}, #{linha[:eixo_vertical][0]}, #{linha[:eixo_horizontal][1]}, #{linha[:eixo_vertical][1]});"
		end

		def quebrar_linha(tamanho_quebra_de_linha = @tamanho_quebra_de_linha)
			js = ""

			if deve_criar_pagina?
				js += criar_nova_pagina
			end

			@altura_atual_da_linha += tamanho_quebra_de_linha.to_i
			return js.html_safe
		end

		def criar_texto(texto)
			texto[:quebrar_linha] = false if texto[:quebrar_linha].nil?
			texto[:completo] = false if texto[:completo].nil?
			texto[:independente] = true if texto[:independente].nil?

			texto[:estilo] = {} unless texto[:estilo].present?
			texto[:estilo][:negrito] = false unless texto[:estilo][:negrito].present?
			texto[:tamanho_fonte] = @tamanho_fonte unless texto[:tamanho_fonte].present?

			texto[:texto] = texto[:texto].to_s.gsub("\r\n",' ').gsub("\n",' ').to_s.gsub("'", "")

			if texto[:estilo][:transformar_texto] == 'caixa_alta'
				texto[:texto] = texto[:texto].upcase
			elsif texto[:estilo][:transformar_texto] == 'capitalizar'
				texto[:texto] = texto[:texto].capitalize
			elsif texto[:estilo][:transformar_texto] == 'caixa_camelo'
				texto[:texto] = texto[:texto].camelize
			elsif texto[:estilo][:transformar_texto] == 'caixa_baixa'
				texto[:texto] = texto[:texto].downcase
			elsif texto[:estilo][:transformar_texto] == 'inicial'
				texto[:texto] = texto[:texto]
			else
				texto[:texto] = texto[:texto].upcase
			end

			js = ""

			if @altura_atual_da_linha >= @altura_limite_da_pagina
				js += criar_nova_pagina

				if texto[:completo]
					js += quebrar_linha(@tamanho_quebra_de_linha_para_texto_completo)
				else
					js += quebrar_linha
				end
			end

			js += "pdf.setFontSize(#{texto[:tamanho_fonte]})\;"
			js += "pdf.setFontType(\"bold\");" if texto[:estilo][:negrito]

			if texto[:alinhamento].present?
				js += alinhar_texto(texto)
			else
				if texto[:posicao].kind_of?(Array)
					js += "pdf.text(#{texto[:posicao][1]}, #{texto[:posicao][0]}, '#{texto[:texto]}');"
				else
					js += "pdf.text(#{texto[:posicao]}, #{@altura_atual_da_linha}, '#{texto[:texto]}');"
				end
			end

			if texto[:independente]
				js += ajustar_quebra_da_proxima_linha_de_acordo_com_a_anterior
			end

			if texto[:quebrar_linha]
				js += quebrar_linha
			end

			js += setar_padroes

			return js.html_safe
		end

		def dados_tabela(dados)
			js = ""
			qtd_dados = dados[:corpo].size
			linha_numero = 0

			dados[:corpo].each do |dado|
				@configuracoes[:linha_numero_por_pagina] += 1
				estilo = {}

				if dado.kind_of?(Array)
					dado = dado.last
				end

				if dado[:estilo].present?
					estilo = dado[:estilo]
					dado.delete(:estilo)
				end

				if dado[:adicionar_linha].present?
					js += criar_linha_horizontal({coordenada: [ @altura_atual_da_linha + @tamanho_meia_quebra_de_linha - 1, @configuracoes[:coordenada_inicial][1] ], tamanho: @configuracoes[:tamanho_linha_horizontal_da_tabela]})
					js += quebrar_linha(2)
					dado.delete(:adicionar_linha)
				end

				if dado[:quebrar_linha].present? && dado[:quebrar_linha] > 0
					dado[:quebrar_linha].times do
						js += quebrar_linha
						qtd_dados += 1
						linha_numero += 1
						@configuracoes[:linha_numero_por_pagina] += 1
					end

					dado = nil
				end

				unless @configuracoes[:imprime_texto_completo].nil?
					texto_completo = @configuracoes[:imprime_texto_completo]
				else
					texto_completo = true
				end

				if dado.present?
					if texto_completo && linha_numero > 0
						js += quebrar_linha(@tamanho_quebra_de_linha_para_texto_completo)
					else
						js += quebrar_linha
					end
				end

				js += gerar_linha_horizontal_totalizadora(linha_numero, qtd_dados)

				if dado.present?
					posicao_inicial_da_coluna = @configuracoes[:coordenada_inicial][1]

					dado.each_with_index do |valor, index|
						posicao_final_da_coluna = posicao_inicial_da_coluna + @configuracoes[:tamanho_das_colunas][index]

						if valor.kind_of?(Array)
							valor = valor[1]
						end

						if estilo[:tabulacao].present? && estilo[:tabulacao][:posicoes].include?(index)
							posicao_inicial_da_coluna += estilo[:tabulacao][:quantidade]
						end

						if estilo[:tabulacao_esquerda].present? && estilo[:tabulacao_esquerda][:posicoes].include?(index)
							posicao_inicial_da_coluna += estilo[:tabulacao_esquerda][:quantidade]
						end

						if estilo[:tabulacao_direita].present? && estilo[:tabulacao_direita][:posicoes].include?(index)
							posicao_final_da_coluna -= estilo[:tabulacao_direita][:quantidade]
						end

						js += criar_texto({texto: valor.to_s, alinhamento: @configuracoes[:alinhamento_das_colunas][index], estilo: estilo, posicao_por_coluna: [posicao_inicial_da_coluna, posicao_final_da_coluna], completo: texto_completo, independente: false })

						posicao_inicial_da_coluna = posicao_final_da_coluna
					end
				end

				linha_numero += 1
				js += ajustar_quebra_da_proxima_linha_de_acordo_com_a_anterior
			end

			return js.html_safe
		end

		def get_numero_da_pagina
			@configuracoes[:numero_da_pagina]
		end

		def definir_numero_da_pagina(numero_pagina=nil)
			if numero_pagina.present?
				@configuracoes[:numero_da_pagina] = numero_pagina
			else
				numero_pagina = @configuracoes[:numero_da_pagina]
			end

			js = ''

			if @ultima_pagina < @configuracoes[:numero_da_pagina]
				@ultima_pagina = @configuracoes[:numero_da_pagina]
				js += "pdf.addPage();"
			end

			js += "pdf.setPage(#{numero_pagina});"
			return js
		end

		def get_altura_atual_da_linha
			@altura_atual_da_linha
		end

		def set_altura_atual_da_linha altura
			@altura_atual_da_linha = altura
		end

		def criar_nova_pagina_para_nova_tabela?
			js = ''
			if get_altura_atual_da_linha + 5 > @altura_limite_da_pagina - 25
				js += criar_nova_pagina(false)
			end
			return js.html_safe
		end

		def imprimir_texto_por_posicao(texto, horizontal, vertical = @altura_atual_da_linha, alinhamento='left')
			texto = texto.to_s.gsub("\r\n",' ').gsub("\n",' ')

			js = "pdf.textEx('#{texto}', #{horizontal}, #{vertical}, '#{alinhamento}', 'middle');"
			@altura_atual_da_linha = vertical
			return js.html_safe
		end

		def criar_cabecalho_para_relatorio(dados)
			@cabecalho_para_relatorio = dados
			js = imprimir_brasao_no_cabecalho
			js += imprimir_textos_no_cabecalho(dados)

			return js.html_safe
		end

		def criar_rodape_para_relatorio(dados)
			js = ''
			unless @configuracao_sistema.ocultar_rodape
				@rodape_para_relatorio = dados
				js = imprimir_textos_no_rodape(dados)
			end
			return js.html_safe
		end

		def criar_nova_pagina(tem_tabela = true, com_cabecalho = true, com_rodape = true)
			js = ""
			@configuracoes[:total_itens_por_pagina] = @configuracoes[:linha_numero_por_pagina]
			@configuracoes[:linha_numero_por_pagina] = 0
			@configuracoes[:numero_da_pagina] += 1

			if @configuracoes[:coordenada_inicial_vertical_ao_criar_nova_pagina].present?
				@configuracoes[:coordenada_inicial][0] = @configuracoes[:coordenada_inicial_vertical_ao_criar_nova_pagina]
				@configuracoes[:tamanho_linha_vertical_da_tabela] = @configuracoes[:coordenada_final][0] - @configuracoes[:coordenada_inicial][0]
			end

			if @configuracoes[:coordenada_inicial].present? && tem_tabela
				js += criar_contorno_da_tabela unless @configuracoes[:sem_contorno].present?
				js += criar_linhas_verticais_para_colunas unless @configuracoes[:sem_contorno].present?
			end

			js += definir_numero_da_pagina

			@altura_limite_da_pagina = @altura_da_pagina

			definir_altura_inicial_da_nova_pagina

			if @cabecalho_para_relatorio.present? && com_cabecalho
				js += criar_cabecalho_para_relatorio(@cabecalho_para_relatorio)
			end

			if @rodape_para_relatorio.present? && com_rodape
				js += criar_rodape_para_relatorio(@rodape_para_relatorio)
			end

			definir_altura_inicial_da_nova_pagina

			if @configuracoes[:coordenada_inicial].present? && tem_tabela
				if @configuracoes[:subir_tabela_ao_quebrar_pagina].present?
					@configuracoes[:coordenada_inicial][0] = @altura_atual_da_linha
				end
				js += criar_cabecalho
			end

			return js.html_safe
		end

		def imprimir_imagem(base64_imagem, imagem_tipo, horizontal_inicial, vertical_inicial, tamanho_horizontal, tamanho_vertical)
			js = "pdf.addImage('#{base64_imagem}', '#{imagem_tipo}', #{horizontal_inicial}, #{vertical_inicial}, #{tamanho_horizontal}, #{tamanho_vertical});"
			set_altura_atual_da_linha(@altura_atual_da_linha + tamanho_vertical)
			js.html_safe
		end

		private
		def imprime_texto_completo(texto)
			js = ''

			if texto[:posicao_por_coluna].present?
				margem_limite_esquerda_do_texto = texto[:posicao_por_coluna][0]
				margem_limite_direita_do_texto = texto[:posicao_por_coluna][1]
			else
				margem_limite_esquerda_do_texto = 0
				margem_limite_direita_do_texto = 0
			end

			is_upcase = texto[:texto] == texto[:texto].to_s.upcase ? true : false
			indicador = calcula_indicador_para_quebra_de_linha(is_upcase)

			tamanho_limite_texto = ((margem_limite_direita_do_texto - margem_limite_esquerda_do_texto)/indicador).to_i

			maior_altura_do_texto_da_linha = get_maior_altura_do_texto_da_linha(tamanho_limite_texto, texto)

			if deve_criar_pagina?(maior_altura_do_texto_da_linha)
				js += criar_nova_pagina
				js += quebrar_linha
				texto[:altura] = @altura_atual_da_linha
			end

			js += calcula_margens_e_imprime_texto_completo(tamanho_limite_texto, texto)

			return js
		end

		def alinhar_texto(texto)
			js = ''

			unless texto[:altura]
				texto[:altura] = @altura_atual_da_linha
			end

			unless texto[:completo]
				js += imprime_texto_por_alinhamento(texto)
			else
				js += imprime_texto_completo(texto)
			end

			return js
		end

		def criar_subcolunas_do_cabecalho
			js = quebrar_linha

			@cabecalho.each do |coluna|
				if coluna[:subcolunas].present?
					posicao_da_subcoluna = coluna[:posicao_da_linha_vertical_inicial]

					coluna[:subcolunas].each.map do |subcoluna|
						subcoluna[:altura_da_subcoluna] = @altura_atual_da_linha
						subcoluna[:posicao_inicial_da_subcoluna] = posicao_da_subcoluna
						subcoluna[:posicao_final_da_subcoluna] = subcoluna[:posicao_inicial_da_subcoluna] + subcoluna[:tamanho]

						js += criar_texto({texto: subcoluna[:nome], alinhamento: 'centralizado', estilo: {negrito: true}, posicao_por_coluna: [subcoluna[:posicao_inicial_da_subcoluna], subcoluna[:posicao_final_da_subcoluna]], independente: false})
						posicao_da_subcoluna += subcoluna[:tamanho]
					end
				end
			end

			return js
		end

		def tamanho_das_colunas
			array_tamanho_colunas = []
			index = 0
			@cabecalho.each do |coluna|
				if coluna[:subcolunas].present?
					coluna[:subcolunas].each do |subcoluna|
						array_tamanho_colunas[index] = subcoluna[:tamanho]
						index += 1
					end
				else
					array_tamanho_colunas[index] = coluna[:tamanho]
					index += 1
				end
			end

			return array_tamanho_colunas
		end

		def alinhamento_das_colunas
			array_alinhamento_colunas = []
			index = 0
			@cabecalho.each do |coluna|
				if coluna[:subcolunas].present?
					coluna[:subcolunas].each do |subcoluna|
						array_alinhamento_colunas[index] = subcoluna[:alinhamento]
						index += 1
					end
				else
					array_alinhamento_colunas[index] = coluna[:alinhamento]
					index += 1
				end
			end

			return array_alinhamento_colunas
		end

		def criar_contorno_da_tabela

			# linha horizontal superior da tabela
			js = criar_linha_horizontal({coordenada: @configuracoes[:coordenada_inicial], tamanho: @configuracoes[:tamanho_linha_horizontal_da_tabela]})
			# linha vertical a esquerda da tabela
			js += criar_linha_vertical({coordenada: @configuracoes[:coordenada_inicial], tamanho: @altura_atual_da_linha - @configuracoes[:coordenada_inicial][0] + @configuracoes[:margem_vertical_extra_para_linha_horizontal_inferior_da_tabela]})
			# linha vertical a direita da tabela
			js += criar_linha_vertical({coordenada: [@configuracoes[:coordenada_inicial][0], @configuracoes[:coordenada_final][1]], tamanho: @altura_atual_da_linha - @configuracoes[:coordenada_inicial][0] + @configuracoes[:margem_vertical_extra_para_linha_horizontal_inferior_da_tabela]})
			# linha horizontal inferior da tabela
			js += criar_linha_horizontal({coordenada: [@altura_atual_da_linha + @configuracoes[:margem_vertical_extra_para_linha_horizontal_inferior_da_tabela], @configuracoes[:coordenada_inicial][1]], tamanho: @configuracoes[:tamanho_linha_horizontal_da_tabela]})

			return js
		end

		def definir_altura_inicial_da_nova_pagina
			unless @cabecalho_para_relatorio.present?
				if @configuracoes[:coordenada_inicial].present?
						if @configuracoes[:subir_tabela_ao_quebrar_pagina].present?
							@altura_atual_da_linha = @altura_inicial_da_pagina
						else
							@altura_atual_da_linha = @configuracoes[:coordenada_inicial][0]
						end
				else
					@altura_atual_da_linha = @altura_inicial_da_pagina
				end
			end
		end

		def criar_linhas_verticais_para_colunas
			js = ''

			@cabecalho.each_with_index do |coluna, index_coluna|
				if index_coluna != @cabecalho.size - 1
					js += criar_linha_vertical({coordenada: [@configuracoes[:coordenada_inicial][0], coluna[:posicao_da_linha_vertical_final]], tamanho: @altura_atual_da_linha - @configuracoes[:coordenada_inicial][0] + @configuracoes[:margem_vertical_extra_para_linha_horizontal_inferior_da_tabela]})
				end

				if coluna[:subcolunas].present?
					coluna[:subcolunas].each_with_index do |subcoluna, index_subcoluna|
						if index_subcoluna != coluna[:subcolunas].size - 1

							complemento_para_quebra_de_linha = getComplementoParaQuebraDelinha

							js += criar_linha_vertical({coordenada: [subcoluna[:altura_da_subcoluna] - complemento_para_quebra_de_linha[0], subcoluna[:posicao_final_da_subcoluna]], tamanho: @altura_atual_da_linha - @configuracoes[:coordenada_inicial][0] - @tamanho_quebra_de_linha + @configuracoes[:margem_vertical_extra_para_linha_horizontal_inferior_da_tabela] - complemento_para_quebra_de_linha[1]})
						end
					end
				end
			end

			return js
		end

		def gerar_linha_horizontal_totalizadora(linha_numero, qtd_dados)
			js = ''
			if (linha_numero == qtd_dados - @configuracoes[:quantidade_de_linhas_com_totais])
				@configuracoes[:total_itens_por_pagina] = qtd_dados if @configuracoes[:total_itens_por_pagina] == 0
				quantidade_restante_de_itens_da_tabela = qtd_dados.remainder @configuracoes[:total_itens_por_pagina]
				quantidade_de_paginas_utilizadas = qtd_dados.to_f / @configuracoes[:total_itens_por_pagina]

				if ( quantidade_restante_de_itens_da_tabela > @configuracoes[:quantidade_de_linhas_com_totais]) || @configuracoes[:numero_da_pagina] <= quantidade_de_paginas_utilizadas
					js += quebrar_linha(2)
					js += criar_linha_horizontal({coordenada: [ @altura_atual_da_linha - @tamanho_meia_quebra_de_linha - 1.to_i, @configuracoes[:coordenada_inicial][1] ], tamanho: @configuracoes[:tamanho_linha_horizontal_da_tabela]})
				end
			end

			return js
		end

		def getComplementoParaQuebraDelinha
			if @tamanho_quebra_de_linha == 7
				complemento = [3,1]
			elsif @tamanho_quebra_de_linha == 6
				complemento = [3,0]
			elsif @tamanho_quebra_de_linha == 5
				complemento = [2,1]
			else
				complemento = [@tamanho_meia_quebra_de_linha,0]
			end
			return complemento
		end

		def calcula_indicador_para_quebra_de_linha(is_upcase = true)
			if is_upcase
				if @tamanho_fonte == 6
					indicador_para_quebra_de_linha = 1.5
				elsif @tamanho_fonte >= 7
					indicador_para_quebra_de_linha = 2
				else
					indicador_para_quebra_de_linha = 1.5
				end
			else
				if @tamanho_fonte == 6
					indicador_para_quebra_de_linha = 0.83
				elsif @tamanho_fonte == 7
					indicador_para_quebra_de_linha = 0.97
				elsif @tamanho_fonte == 8
					indicador_para_quebra_de_linha = 1.1
				elsif @tamanho_fonte == 9
					indicador_para_quebra_de_linha = 1.28
				elsif @tamanho_fonte >= 10
					indicador_para_quebra_de_linha = 1.4
				else
					indicador_para_quebra_de_linha = 2
				end
			end

			return indicador_para_quebra_de_linha
		end

		def imprime_texto_por_alinhamento(texto)
			js = ''
			unless texto[:posicao_por_coluna].present?
				js += imprime_texto_padrao_por_alinhamento(texto)
			else
				js += imprime_texto_com_margens_por_alinhamento(texto)
			end

			return js
		end

		def imprime_texto_padrao_por_alinhamento(texto)
			if texto[:alinhamento] == 'direita'
				js = "pdf.textEx('#{texto[:texto]}', #{@largura_da_pagina}, #{@altura_atual_da_linha}, 'right', 'middle');"
			elsif texto[:alinhamento] == 'esquerda'
				js = "pdf.textEx('#{texto[:texto]}', 10, #{@altura_atual_da_linha}, 'left', 'middle');"
			elsif texto[:alinhamento] == 'centralizado'
				js = "pdf.myText('#{texto[:texto]}', {align: 'center'}, 0, #{@altura_atual_da_linha}, #{@tamanho_fonte});"
			end
		end

		def imprime_texto_com_margens_por_alinhamento(texto)

			if texto[:completo].present?
				completo = texto[:completo]
			else
				completo = false
			end

			if texto[:alinhamento] == 'centralizado'
				js = "pdf.textCenterColumn('#{texto[:texto]}', #{texto[:posicao_por_coluna]}, #{texto[:altura]}, #{@tamanho_fonte});"
			elsif texto[:alinhamento] == 'esquerda'
				js = "pdf.textLeftColumn('#{texto[:texto]}', #{texto[:posicao_por_coluna]}, #{texto[:altura]}, #{@tamanho_fonte}, #{completo});"
			elsif texto[:alinhamento] == 'direita'
				js = "pdf.textRightColumn('#{texto[:texto]}', #{texto[:posicao_por_coluna]}, #{texto[:altura]}, #{@tamanho_fonte});"
			end

			return js
		end

		def ajustar_quebra_da_proxima_linha_de_acordo_com_a_anterior
			js = ''
			while @quantidade_de_quebras_de_linha_para_nova_linha > 0
				js += quebrar_linha(@tamanho_quebra_de_linha_para_texto_completo)
				@quantidade_de_quebras_de_linha_para_nova_linha -= 1
			end

			return js
		end

		def imprimir_brasao_no_cabecalho
			js = ''

			if @configuracao_sistema.existe_imagem?
				base64_imagem = @configuracao_sistema.gerar_brasao_em_base64
				imagem_tipo = @configuracao_sistema.get_imagem_tipo
				vertical_inicial = @altura_inicial_da_pagina - 2
				horizontal_inicial = 20
				tamanho_horizontal = 18
				tamanho_vertical = 18

				js += imprimir_imagem(base64_imagem, imagem_tipo, horizontal_inicial, vertical_inicial, tamanho_vertical, tamanho_horizontal)
			end

			return js
		end

		def imprimir_textos_no_rodape(dados)
			if dados[:exibir_numero_da_pagina] == nil
				dados[:exibir_numero_da_pagina] = true
			end

			@altura_limite_da_pagina = @altura_da_pagina - 10
			js = "pdf.setFontSize(10);";
			js += "pdf.myText('#{dados[:titulo]}', {align: 'center'}, 0, #{@altura_da_pagina}, #{@tamanho_fonte});" if dados[:titulo].present?

			if dados[:exibir_numero_da_pagina]
				js += "pdf.textEx('#{@configuracoes[:numero_da_pagina] + @quantidade_de_paginas_do_contexto}', #{@largura_da_pagina}, #{@altura_da_pagina}, 'right', 'middle');"
			end

			js += setar_padroes
			return js
		end

		def imprimir_textos_no_cabecalho(dados)
			js = ''

			js += "pdf.setFont('Times', 'Roman');"
			js += "pdf.setFontSize(12);";

			js += imprimir_texto_por_posicao(@configuracao_sistema.nome_da_prefeitura.to_s.upcase, 42, @altura_inicial_da_pagina)
			js += quebrar_linha

			unless @configuracao_sistema.ocultar_titulo_cabecalho
				js += imprimir_texto_por_posicao(dados[:titulo].to_s.upcase, 42, @altura_atual_da_linha)
				js += quebrar_linha
			end

			js += "pdf.setFontSize(12);";
			js += "pdf.setFontType('bold');"

			texto = {estilo: {transformar_texto: 'inicial'}, tamanho_fonte: @tamanho_fonte_do_titulo, alinhamento: 'esquerda', completo: true, texto: dados[:topico].to_s.upcase, altura: @altura_atual_da_linha, posicao_por_coluna: [40, @largura_da_pagina], independente: false}
			js += criar_texto(texto)
			js += quebrar_linha

			if @configuracao_sistema.ocultar_titulo_cabecalho
				js += quebrar_linha
			end

			unless dados[:sem_escala]
				js += alinhar_texto({texto: 'R$ 1,00', alinhamento: 'direita' })
				@altura_atual_da_linha += 2
			end

			js += setar_padroes
			return js
		end

		def deve_criar_pagina?(altura_atual_da_linha = @altura_atual_da_linha)
			if altura_atual_da_linha >= @altura_limite_da_pagina
				return true
			elsif @configuracoes.present?
				if @configuracoes[:coordenada_final].present? && altura_atual_da_linha >= @configuracoes[:coordenada_final][0]
					return true
				end
			end

			return false
		end

		def get_maior_altura_do_texto_da_linha(tamanho_limite_texto, texto)

			posicao_a_direita_corrente_do_texto_na_coluna = tamanho_limite_texto
			posicao_a_esquerda_corrente_do_texto_na_coluna = 0
			quantidade_de_quebras_de_linha_do_texto = 0

			while texto[:texto].size > posicao_a_esquerda_corrente_do_texto_na_coluna && quantidade_de_quebras_de_linha_do_texto < @quantidade_limite_de_quebras_de_linha_para_registro do
				if posicao_a_direita_corrente_do_texto_na_coluna < texto[:texto].size && texto[:texto][0..posicao_a_direita_corrente_do_texto_na_coluna].rindex(' ').present?
					posicao_a_direita_corrente_do_texto_na_coluna = texto[:texto][0..posicao_a_direita_corrente_do_texto_na_coluna].rindex(' ') - 1
				end

				posicao_a_esquerda_corrente_do_texto_na_coluna = posicao_a_direita_corrente_do_texto_na_coluna + 1
				posicao_a_direita_corrente_do_texto_na_coluna = posicao_a_esquerda_corrente_do_texto_na_coluna + tamanho_limite_texto

				if posicao_a_esquerda_corrente_do_texto_na_coluna < texto[:texto].size
					quantidade_de_quebras_de_linha_do_texto += 1

					if @quantidade_de_quebras_de_linha_para_nova_linha < quantidade_de_quebras_de_linha_do_texto
						@quantidade_de_quebras_de_linha_para_nova_linha = quantidade_de_quebras_de_linha_do_texto
					end
				end
			end

			maior_altura_do_texto_da_linha = (@quantidade_de_quebras_de_linha_para_nova_linha * @tamanho_quebra_de_linha_para_texto_completo) + texto[:altura]

			return maior_altura_do_texto_da_linha
		end

		def calcula_margens_e_imprime_texto_completo(tamanho_limite_texto, texto)
			posicao_a_direita_corrente_do_texto_na_coluna = tamanho_limite_texto
			posicao_a_esquerda_corrente_do_texto_na_coluna = 0
			quantidade_de_quebras_de_linha_do_texto = 0
			js = ''

			while texto[:texto].size > posicao_a_esquerda_corrente_do_texto_na_coluna && quantidade_de_quebras_de_linha_do_texto < @quantidade_limite_de_quebras_de_linha_para_registro do
				if posicao_a_direita_corrente_do_texto_na_coluna < texto[:texto].size && texto[:texto][0..posicao_a_direita_corrente_do_texto_na_coluna].rindex(' ').present?
					posicao_a_direita_corrente_do_texto_na_coluna = texto[:texto][0..posicao_a_direita_corrente_do_texto_na_coluna].rindex(' ')
				end

				texto_da_linha = texto.dup
				texto_da_linha[:texto] = texto[:texto][posicao_a_esquerda_corrente_do_texto_na_coluna..posicao_a_direita_corrente_do_texto_na_coluna]

				js += imprime_texto_por_alinhamento(texto_da_linha)

				posicao_a_esquerda_corrente_do_texto_na_coluna = posicao_a_direita_corrente_do_texto_na_coluna + 1
				posicao_a_direita_corrente_do_texto_na_coluna = posicao_a_esquerda_corrente_do_texto_na_coluna + tamanho_limite_texto

				if posicao_a_esquerda_corrente_do_texto_na_coluna < texto[:texto].size
					texto[:altura] += @tamanho_quebra_de_linha_para_texto_completo
				end

				quantidade_de_quebras_de_linha_do_texto += 1
			end

			return js
		end
	end
end
