#!/usr/bin/env ruby

$VERBOSE = true

require 'benchmark'
Dir.chdir File.expand_path(File.join('..', '..', 'lib'), __FILE__)
$LOAD_PATH.unshift Dir.pwd
require 'combine_pdf'
# require 'bundler/setup'

# You can add fixtures and/or initialization code here to make experimenting
# with your gem easier. You can also use a different console, if you like.

# (If you use this, don't forget to add pry to your Gemfile!)
# require "pry"
# Pry.start

pdf = CombinePDF.load "../../test\ pdfs/filled_form.pdf"
pdf.save '../tmp/01_check_radio_buttuns.pdf'
pdf = CombinePDF.load "../../test\ pdfs/filled_form.pdf"
pdf << CombinePDF.load("../../test\ pdfs/empty_form.pdf")
pdf << CombinePDF.load("../../test\ pdfs/filled_form.pdf")
pdf.save '../tmp/02_check_form_unification_middle_is_empty.pdf'

pdf = CombinePDF.load "../../test\ pdfs/check_form_data__objstreams_w_versions.pdf"
pdf.save '../tmp/02_01_check_form_data_ordering_issue.pdf'


pdf = CombinePDF.load '../../test pdfs/share-font-background.pdf'
pdf2 = CombinePDF.load '../../test pdfs/share-font-foreground.pdf'
i = 0
pdf.pages.each { |pg| pg << pdf2.pages[i] }
pdf.save '../tmp/03_check_font_conflict.pdf'

pdf = CombinePDF.load '../../test pdfs/nil_1.pdf'
pdf2 = CombinePDF.load '../../test pdfs/nil_2.pdf'
pdf << pdf2
pdf.save '../tmp/03_01_nil_value_conflict.pdf'

pdf = CombinePDF.load '../../test pdfs/space_after_streram_keyword.pdf'
pdf.save '../tmp/03_02_extra_space_after_stream_keyword.pdf'

pdf = CombinePDF.load '../../test pdfs/nested_difference.pdf'
pdf.save '../tmp/03_03_nested_difference.pdf'

pdf = CombinePDF.load '../../test pdfs/names_go_haywire_0.pdf'
pdf << CombinePDF.load('../../test pdfs/names_go_haywire_1.pdf')
pdf.save '../tmp/04_check_view_and_names_reference.pdf'

pdf = CombinePDF.load('../../test pdfs/outlines/self_merge_err.pdf')
pdf.save '../tmp/05_x1_scribus_test.pdf'
pdf = CombinePDF.load('../../test pdfs/outlines/self_merge_err.pdf')
pdf << CombinePDF.load('../../test pdfs/outlines/self_merge_err.pdf')
pdf.save '../tmp/05_x2_scribus_test.pdf'
pdf = CombinePDF.load "../../test pdfs/outlines/named_dest.pdf";nil
pdf.save '../tmp/05_check_named_dest_links.pdf' # this will take a while
pdf = CombinePDF.load "../../test pdfs/outlines/named_dest.pdf";nil
pdf << CombinePDF.load('../../test pdfs/outlines/named_dest.pdf'); nil
pdf.save '../tmp/05_1_timeless_check_named_dest_links.pdf' # never ends... :-(

pdf = CombinePDF.load '../../test pdfs/outline_small.pdf'
pdf << CombinePDF.load('../../test pdfs/outline_small.pdf')
pdf.save '../tmp/06_check_links_to_second_copy.pdf'

lists = %w(../../test\ pdfs/outlines/self_merge_err.pdf ../../test\ pdfs/outlines/big_toc.pdf ../../test\ pdfs/outlines/bigger_toc.pdf ../../test\ pdfs/outlines/named_dest_no_toc.pdf ../../test\ pdfs/outlines/named_dest_no_toc2.pdf ../../test\ pdfs/outlines/named_dest.pdf ../../test\ pdfs/outlines/named_dest2.pdf)

i = 0
lists.each do |n|
  # puts "loading #{n}"
  pdf = CombinePDF.load(n)
  # puts "saving 07_#{(i += 1)}_#{n.split('/')[-1]}"
  pdf.save("07_#{(i += 1)}_#{n.split('/')[-1]}")
  # puts "loading #{n}X2"
  pdf = CombinePDF.load(n) << CombinePDF.load(n)
  # puts "saving 07_#{i}x2_#{n.split('/')[-1]}"
  pdf.save("07_#{i}x2_#{n.split('/')[-1]}")
end
pdf = CombinePDF.new
lists.each { |n| pdf << CombinePDF.load(n) }
pdf.save('../tmp/07_named destinations.pdf')

pdf = CombinePDF.new
lists.each { |n| pdf << CombinePDF.load(n) }
pdf.number_pages(start_at: 1,
                           font_size: 14,
                           font_color: [0, 0, 0.4],
                           box_color: [0.8, 0.8, 0.8],
                           border_width: 1,
                           border_color: [0.3, 0.3, 0.3],
                           box_radius: 8,
                           number_location: [:top, :bottom],
                           opacity: 0.75)

pdf.save('../tmp/07_named destinations_numbered.pdf')

CombinePDF.load("../../test\ pdfs/Scribus-unknown_err.pdf").save '../tmp/08_1-unknown-err-empty-str.pdf'
CombinePDF.load("../../test\ pdfs/Scribus-unknown_err2.pdf").save '../tmp/08_2-unknown-err-empty-str.pdf'
CombinePDF.load("../../test\ pdfs/Scribus-unknown_err3.pdf").save '../tmp/08_3-unknown-err-empty-str.pdf'
CombinePDF.load("../../test\ pdfs/xref_in_middle.pdf").save '../tmp/08_4-xref-in-middle.pdf'
CombinePDF.load("../../test\ pdfs/xref_split.pdf").save '../tmp/08_5-xref-fragmented.pdf'

CombinePDF.load("../../test\ pdfs/nil_object.pdf").save('../tmp/09_nil_in_parsed_array.pdf')

encrypted = [ "../../test\ pdfs/pdf-reader/encrypted_version4_revision4_128bit_aes_user_pass_apples_enc_metadata.pdf",
              "../../test\ pdfs/AESv2\ encrypted.pdf",
              "../../test\ pdfs/pdf-reader/encrypted_version2_revision3_128bit_rc4_blank_user_pass.pdf",
              "../../test\ pdfs/AES\ enc.pdf",
              "../../test\ pdfs/RC4\ enc.pdf"]

encrypted.length.times do |i|
  fname = File.basename encrypted[i]
  begin
    CombinePDF.load(encrypted[i]).save "../tmp/10_#{i}_#{fname}"
  rescue => e
    puts e.class.name, e.message
    if(i == 0)
      puts "CombinePDF expected to fail to read AESv2 #{fname}"
    else
      puts "ERROR: CombinePDF failed to open #{fname}"
    end
  end
end

require 'prawn'
IO.binwrite '11_prawn.pdf', (Prawn::Document.new { text 'Hello World!' }).render
page = CombinePDF.parse((Prawn::Document.new { text 'Hello World!' }).render)
pdf = CombinePDF.new
pdf << page
pdf.save '../tmp/11_parsed_from_prawn.pdf'
pdf = CombinePDF.new
pdf << page << page
pdf.save('../tmp/11_AcrobatReader_is_unique_page.pdf')

puts GC.stat.inspect
# unify = [
#   "../../test\ pdfs/AESv2\ encrypted.pdf",
#   "../../test\ pdfs/data-in-comment.pdf",
#   "../../test\ pdfs/file_name.pdf",
#   "../../test\ pdfs/garbage_after_eof.pdf",
#   "../../test\ pdfs/Many\ comments.pdf",
#   "../../test\ pdfs/nested\ contents\ array.PDF",
#   "../../test\ pdfs/nested_resources.pdf",
#   "../../test\ pdfs/original-missing-endobje.pdf",
#   "../../test\ pdfs/original-multi-issue.pdf",
#   "../../test\ pdfs/page_stap_nil_secure.pdf",
#   "../../test\ pdfs/referenced\ decryption.pdf",
#   '',
#   '',
#   '',
#   '',
#   '',
#   '',
#   ''
# ]

# require 'irb'
# IRB.start
