#!/usr/bin/ruby

require 'optparse'
require 'cgi'
require 'net/http'
require 'rexml/document'

options = { :skip => 0, :prefix => "" }

opts = OptionParser.new do |x|
  x.banner = "Usage: #$0 [options] <realmUrl> <query>"
  x.on("-d", "--dry-run", "Dry run only: show what WOULD be done") {
    options[:dryRun] = true
  }
  x.on("-k", "--skip NUM", "Skip the first NUM records (do not add)") { |n|
    options[:skip] = Integer(n)
  }
  x.on("-s", "--set-udb", "Set UDB from last component of ZURL") {
    options[:setUdb] = true
  }
  x.on("-p", "--udb-prefix STRING", "Prefix UDBs with constant string") { |s|
    options[:prefix] = s
  }
end

begin
  opts.parse!(ARGV)
  raise "#$0: No realmUrl specified" if ARGV.size != 2
rescue
  $stderr.puts $!, opts
  $stderr.puts "e.g. #$0 -p ebscoz- http://usi.indexdata.com/torus2/global.admin/ 'serviceProvider==EBSCO'"
  exit 1
end

url = ARGV[0].sub(/^http:\/\//, "")
query = ARGV[1]
host, path = url.split("/", 2)
path.sub!(/\/$/, "");
sourceUrl = "/" + path + "/world/?query=" + CGI::escape(query)
puts "host=#{host}, path=#{path}, query=#{query}, sourceUrl=#{sourceUrl}"

Conn = Net::HTTP.new(host, 80)
resp, data = Conn.get(sourceUrl)
doc = REXML::Document.new(data)

ids = Array.new
udbs = Array.new
doc.elements.each('records/record/layer/id') do |elem|
  ids << elem.text
end
doc.elements.each('records/record/layer/zurl') do |elem|
  udbs << elem.text.sub(/.*\//, "")
end

ids.each_with_index do |id, i|
  puts "#{i}. #{id} [#{udbs[i]}]"
  if (i < options[:skip]) then
    puts "skipping"
    next
  end

  xml = %[\
<record type="searchable">
  <layer name="override">
    <worldId>#{id}</worldId>
]
  if options[:setUdb] then
    xml += %[    <udb>#{options[:prefix]}#{udbs[i]}</udb>\n]
  end
  xml += %[\
  </layer>
</record>
]
  if options[:dryRun] then
    puts xml
  else
    resp, data = Conn.post(destUrl = "/" + path + "/records/", xml,
                           { "Content-Type" => "application/xml" })
    puts "#{resp}"
  end
end
