module Pdf
	class Gerador
		@altura_atual_da_linha = nil
		@fonte = nil
		@estilo_da_fonte = nil
		@tamanho_fonte = nil
		@espessura_linha = nil
		@altura_padrao = nil

		def initialize
			@altura_atual_da_linha = 10
			@fonte = "Times"
			@estilo_da_fonte = "Roman"
			@tamanho_fonte = 10
			@espessura_linha = 0.1
			@altura_padrao = 7
		end

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

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

		def formata_texto(texto, coluna, adiciona_espaco=true, negrito=true, tamanho_fonte=@tamanho_fonte, formatacao)
			js = ""
			texto = texto.to_s.gsub("'", "")
			js += "pdf.setFontSize(#{tamanho_fonte});" if tamanho_fonte != @tamanho_fonte
			js += "pdf.setFontType(\"bold\");" if negrito
			js += formatacao
			js += "pdf.setFontType(\"normal\");"
			js += "pdf.setFontSize(#{@tamanho_fonte});"
			js += self.adiciona_espaco_vertical(@altura_padrao) if adiciona_espaco
			return js.html_safe
		end

		def texto(texto, coluna, adiciona_espaco=true, negrito=false, tamanho_fonte=@tamanho_fonte)
			formatacao = "pdf.text(#{coluna}, #{@altura_atual_da_linha}, '#{texto}');"
			return formata_texto(texto, coluna, adiciona_espaco, negrito, tamanho_fonte, formatacao)
		end

		def texto_centralizado(texto, adiciona_espaco=true, negrito=false, tamanho_fonte=@tamanho_fonte)
			formatacao =  "pdf.myText('#{texto}', {align: 'center'}, 0, #{@altura_atual_da_linha}, #{@tamanho_fonte});"
			return formata_texto(texto, nil, adiciona_espaco, negrito, tamanho_fonte, formatacao)
		end

		def texto_a_direita(texto, coluna, adiciona_espaco=true, negrito=true, tamanho_fonte=@tamanho_fonte)
			formatacao = "pdf.textEx('#{texto}', #{coluna}, #{@altura_atual_da_linha}, 'right', 'bottom');"
			return formata_texto(texto, coluna, adiciona_espaco, negrito, tamanho_fonte, formatacao)
		end

		def linha(inicio=8, fim=200, espessura=0.1,altura=@altura_padrao, adiciona_espaco=true)
			js = ""
			js += self.adiciona_espaco_vertical(2)
			js += "pdf.setLineWidth(#{espessura});"
			js += "pdf.line(#{inicio}, #{@altura_atual_da_linha}, #{fim}, #{@altura_atual_da_linha});"
			js += "pdf.setLineWidth(#{@espessura_linha});"
			if adiciona_espaco
				js += self.adiciona_espaco_vertical(altura - 2)
			end
			return js.html_safe
		end

		def linha_vertical(fim=200, espessura=0.1, coluna=90, tamanho=200, inicio=@altura_atual_da_linha)
			fim ||= inicio + tamanho
			js = ""
			js += "pdf.setLineWidth(#{espessura});"
			js += "pdf.line(#{coluna}, #{inicio}, #{coluna}, #{fim});"
			js += "pdf.setLineWidth(#{@espessura_linha});"
			return js.html_safe
		end

		def cabecalho
			js = "pdf.text(10, #{@altura_atual_da_linha}, '<<< CABEÇALHO DO GERADOR >>>');"
			@altura_atual_da_linha += 30
			return js.html_safe
		end

		def espaco(tamanho)
			adiciona_espaco_vertical(tamanho)
		end

		def campo_e_valor(campo, valor, coluna, adiciona_espaco=true, tamanho_fonte=@tamanho_fonte)
			js = ""

			campo = campo.to_s.gsub("'", "")
			valor = valor.to_s.gsub("'", "")

			js += "pdf.text(#{coluna}, #{@altura_atual_da_linha}, '#{campo}: #{valor}');"

			if adiciona_espaco
				js += self.adiciona_espaco_vertical(@altura_padrao)
			end

			return js.html_safe
		end

		def cabecalho_tabela(campos)
			js = ""
			campos.each do |valor, coluna|
				js += "pdf.text(#{coluna}, #{@altura_atual_da_linha}, '#{valor}');"
			end
			js += self.adiciona_espaco_vertical(2)
			js += "pdf.setLineWidth(0.3);"
			js += "pdf.line(8, #{@altura_atual_da_linha}, 200, #{@altura_atual_da_linha});"
			js += "pdf.setLineWidth(#{@espessura_linha});"
			js += self.adiciona_espaco_vertical(@altura_padrao - 2)
			return js.html_safe
		end

		def dados_tabela(dados, colunas, linhas=true)
			js = ""
			dados.each do |dado|
				colunas.each do |chave, valor|
					coluna = valor[:coluna]
					alinhamento = valor[:alinhamento]
					texto = dado[chave.to_i]
					if alinhamento=="direita"
						js += "pdf.textEx('#{texto.to_s.gsub("'", "")}', #{coluna}, #{@altura_atual_da_linha}, 'right', 'bottom');"
					else
						js += "pdf.textEx('#{texto.to_s.gsub("'", "")}', #{coluna}, #{@altura_atual_da_linha}, 'left', 'bottom');"
					end
				end
				js += self.adiciona_espaco_vertical(2)
				if linhas
					js += "pdf.setDrawColor(108,108,108);"
					js += "pdf.line(8, #{@altura_atual_da_linha}, 200, #{@altura_atual_da_linha});"
					js += "pdf.setDrawColor(0,0,0);"
				end
					js += self.adiciona_espaco_vertical(@altura_padrao - 2)
			end
			return js.html_safe
		end

		def adiciona_espaco_vertical(espaco)
			js = ""
			if @altura_atual_da_linha >= 190
				js = "pdf.addPage();"
				@altura_atual_da_linha = 10
			end
			@altura_atual_da_linha += espaco.to_i
			return js.html_safe
		end
	end
end
