#!/usr/bin/ruby

require 'fileutils'

require 'debci'
require 'debci/html'
require 'debci/graph'

writer = Debci::HTML.new

writer.index('index.html')
writer.status('status/index.html')
writer.status_alerts('status/alerts/index.html')
writer.blacklist('status/blacklist/index.html')

repository = Debci::Repository.new

# Generate a JSON file for storing the current suite/architectures that are
# available. The file is used for the JavaScript data charts.
File.open(File.join(Debci.config.html_dir, 'status/platforms.json'), 'w') do |file|
  platforms = []

  repository.suites.each do |suite|
    repository.architectures.each do |arch|
      platforms.push("platform" => suite + '/' + arch) if repository.status_history(suite, arch)
    end
  end

  file.write(JSON.pretty_generate(platforms))
end

packages = ARGV
if packages.empty?
  packages = repository.packages
else
  packages += Debci.blacklist.packages.keys
end

prefixes = Set.new

packages.each do |pkg|
  package = repository.find_package(pkg)

  writer.package(package, "packages/#{package.prefix}/#{package.name}/index.html")
  package.suites.each do |suite|
    package.architectures.each do |arch|
      writer.history(package, suite, arch, "packages/#{package.prefix}/#{package.name}/#{suite}/#{arch}/index.html")
    end
  end
  prefixes << package.prefix
end


# Maintain a JSON file for storing a package's suite/architectures and
# status. The file is used for the JavaScript package search.
json_filename = File.join(Debci.config.html_dir, 'packages/packages.json')
if File.exist?(json_filename)
  json_package_data = JSON.load(File.read(json_filename))
else
  json_package_data = []
end

packages.each do |pkg|
  package = repository.find_package(pkg)

  status = {}

  package.status.flatten.each do |s|
    begin
      if package.history(s.suite, s.architecture)
        status["#{s.suite}/#{s.architecture}"] = s.status if s.status != :no_test_data
      end
    rescue JSON::ParserError
      puts "[ERROR] #{package.name} <#{s.suite}/#{s.architecture}> history: Could not parse JSON"
    end
  end

  entry = json_package_data.find { |entry| entry['package'] == pkg }
  if !entry
    entry = { 'package' => pkg }
    json_package_data.push(entry)
  end

  entry['status'] = status
end
FileUtils.mkdir_p File.dirname(json_filename)
File.open(json_filename, 'w') do |f|
  f.write(JSON.pretty_generate(json_package_data))
end

writer.prefix(nil, "packages/index.html")

prefixes.each do |p|
  writer.prefix(p, "packages/#{p}/index.html")
end
