#!/usr/bin/ruby

# Invoke in ../etc as
#	../bin/generate-drupal-pages -q science http://mk2.indexdata.com/torus2/searchable.mike/ db.html section.html list.html htdocs

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

options = {
  :verbose => 0,
  :query => 'cql.allRecords=1',
}

opts = OptionParser.new do |x|
  x.banner = "Usage: #$0 [options] <realmUrl> <db> <section> <list> <outputdir>"
  x.on("-v", "--verbose", "Comment on what is being done") {
    options[:verbose] = true
  }
  x.on("-u", "--auth USER/PASS", "User HTTP Basic authentication") { |s|
    options[:user], options[:password] = s.split("/", 2)
  }
  x.on("-q", "--query QUERY", "Limit set of records used") { |q|
    options[:query] = q
  }
end

begin
  opts.parse!(ARGV)
  raise "#$0: realmUrl, templates and output directory not specified" if ARGV.size != 5
rescue
  $stderr.puts $!, opts
  $stderr.puts "e.g. #$0 http://mk2.indexdata.com/torus2/searchable.mike/ db.html section.html list.html htdocs"
  exit 1
end

url, dbTemplateName, sectionTemplateName, listTemplateName, outdir = ARGV

url = url.sub(/^http:\/\//, "")
host, path = url.split("/", 2)
path.sub!(/\/$/, "")
sourceUrl = "/" + path + "/records/?layers=final&query=#{options[:query]}%20sortby%20displayName"

dbTemplate = File.read(dbTemplateName)
sectionTemplate = File.read(sectionTemplateName)
listTemplate = File.read(listTemplateName)

conn = Net::HTTP.new(host, 80)
request = Net::HTTP::Get.new(sourceUrl)
request.basic_auth options[:user], options[:password] if options[:user]
resp = conn.request(request)
data = resp.body
if resp.code !~ /^2/
  raise "HTTP GET error #{resp.code} #{resp.msg}\n#{resp.body}"
end

doc = REXML::Document.new(data)
$list = ""
section = ""
lastname = "."
lastletter = "."
count = 0

def output_section(outdir, template, letter, text)
    output = template.gsub(/\$\{LETTER\}/, letter).gsub(/\$\{LIST\}/, text)
    filename = "INDEX-" + letter + ".html"
    File.open(outdir + "/" + filename, "w") { |f| f.write output }
    $list += " <li><a href=\"#{filename}\">Beginning with '#{letter}'</a>\n"
end

doc.elements.each('records/record/layer') do |layer|
  dn = layer.elements['displayName'].text || next
  next if dn == lastname
  lastname = dn

  letter = ActiveSupport::Multibyte::Chars.new(dn).mb_chars.normalize(:kd)[0,1].upcase.to_s
  if letter != lastletter && lastletter != "."
    output_section(outdir, sectionTemplate, lastletter, section)
    section = ""
  end
  lastletter = letter

  output = dbTemplate.gsub(/\$\{(.*?)\}/) { |x|
    x.sub!(/^\$\{/, "").sub!(/\}$/, "")
    elem = layer.elements[x]
    elem ? elem.text : ""
  }

  if false # Do not generate pages for each target *snif*
    filename = dn.gsub(/[^a-z0-9_-]/i, "_") + ".html"
    File.open(outdir + "/" + filename, "w") { |f| f.write output }
  end

  section += " <li>#{dn}"
  sp = layer.elements['serviceProvider']
  sp = sp ? sp.text : nil
  section += " [#{sp}]" if sp
  section += "</li>\n"
  count += 1
end

output_section(outdir, sectionTemplate, lastletter, section)

output = listTemplate.gsub(/\$\{COUNT\}/, count.to_s).gsub(/\$\{LIST\}/, $list)
File.open(outdir + "/index.html", "w") { |f| f.write output }
