#!/usr/bin/env ruby

require 'dmenu'

JAVA_DOC_LOCATION = "/usr/share/doc/api"
JAVAFX_DOC_LOCATION = "/usr/share/doc/javafx-sdk-docs-*"

USER_DOC_LOCATION = (ENV['XDG_DATA_HOME'] || ENV['HOME'] + '/.local/share') + '/javadoc/*'

class DocIndex
  attr_reader :items

  def initialize(path)
    @items = []
    find_entries(path)
  end

  private

  def gen_candidates(dir)
    Dir.entries(dir).reject {|e| e == '.' ||
                             e == '..' ||
                             e == 'class-use' ||
                             e == 'src-html' ||
                             (e =~ /^[a-z].*\..*/ && e != 'package-summary.html')}
  end

  def find_entries(dir, path = [])
    candidates = gen_candidates(dir)
    candidates.each do |entry|
      if entry == "package-summary.html"
        @items << Dmenu::Item.new(path.join(?.),  dir + ?/ + entry)
      elsif entry.end_with? ".html"
        @items << Dmenu::Item.new(
          path.join(?.) + ?. + File.basename(entry, '.html'),
          dir + ?/ + entry
        )
      elsif File.directory?(dir + ?/ + entry)
        find_entries(dir + ?/ + entry, path + [entry])
      end
    end
  end
end


user_libs = Dir.glob(USER_DOC_LOCATION)
java_folder = Dir.glob(JAVA_DOC_LOCATION).last
jfx_folder = Dir.glob(JAVAFX_DOC_LOCATION).last + "/html"


libmenu = Dmenu.new
libmenu.items = [
  Dmenu::Item.new("Java Standard Library (std)", java_folder),
  Dmenu::Item.new("javafx", jfx_folder)
] + user_libs.map{|f| Dmenu::Item.new(File.basename(f), f)}

libmenu.case_insensitive = true
libmenu.prompt = "Library:"
libmenu.lines = 20

menu = Dmenu.new
menu.items = DocIndex.new(libmenu.run.value).items
menu.case_insensitive = true
menu.prompt = "Javadoc:"
menu.lines = 20
system("xdg-open #{menu.run.value}")