#!/usr/bin/ruby

require 'fileutils'
require 'rss'

require 'debci'

repository = Debci::Repository.new

feeds_dir = File.join(Debci.config.data_basedir, 'feeds')
$site_base = 'http://ci.debian.net' # FIXME read this from configuration

FileUtils.mkdir_p(feeds_dir)

past_timestamp = Time.parse('2014-05-10T21:17:00 UTC')

def insert_items(news, feed)
  news.each do |status|
    feed.items.new_item do |item|
      prefix = status.package.sub(/^((lib)?.).*/, '\1')
      item.link = "#{$site_base}/data/packages/#{status.suite}/#{status.architecture}/#{prefix}/#{status.package}/#{status.run_id}.log"
      item.title = status.headline
      item.date = status.date
      item.description = [
        "<p>#{status.description}</p>",
        '<ul>',
        "<li>Version: #{status.version}</li>",
        "<li>Date: #{status.date}</li>",
        "<li><a href=\"#{$site_base}/packages/#{prefix}/#{status.package}/#{status.suite}/#{status.architecture}\">Package history page</a></li>",
        "<li><a href=\"#{$site_base}/data/packages/#{status.suite}/#{status.architecture}/#{prefix}/#{status.package}/#{status.run_id}.log\">debci log</a></li>",
        "<li><a href=\"#{$site_base}/data/packages/#{status.suite}/#{status.architecture}/#{prefix}/#{status.package}/#{status.run_id}.autopkgtest.log\">autopkgtest log</a></li>",
        "<li><a href=\"#{$site_base}/data/autopkgtest/#{status.suite}/#{status.architecture}/#{prefix}/#{status.package}/#{status.run_id}/\">autopkgtest artifacts</a></li>",
        status.status == :fail && "<li>Packages blamed: #{status.blame.join(', ')}</a></li>" || nil,
        '</ul>',
      ].compact.join("\n")
    end
  end
end

packages = ARGV
if packages.empty?
  packages = repository.packages
end

packages.each do |pkg|
  news = repository.news_for(pkg)
  prefix = pkg.sub(/^((lib)?.).*/, '\1')
  feedfile = File.join(feeds_dir, prefix, pkg + '.xml')
  FileUtils.mkdir_p(File.dirname(feedfile))

  feed = RSS::Maker.make('atom') do |feed|
    feed.channel.author = 'Debian Continuous Integration'
    feed.channel.updated = news.first && news.first.date || past_timestamp
    feed.channel.about = $site_base + '/#package/' + pkg
    feed.channel.title = pkg + ' CI news feed'
    feed.channel.description = "News for #{pkg}. Includes only state transitions (pass-fail, and fail-pass). Full history is available in the package page and in the published data files."

    insert_items(news, feed)
  end

  File.open(feedfile, 'w') do |f|
    f.write(feed.to_s.gsub('<summary>', '<summary type="html">'))
  end
end

global_news = repository.news_for('*', 50)
global_feed = RSS::Maker.make('atom') do |feed|
  feed.channel.author = 'Debian Continuous Integration'
  feed.channel.updated = global_news.first && global_news.first.date || past_timestamp
  feed.channel.about = $site_base
  feed.channel.title = 'Debian Continuous Integration news'
  feed.channel.description = "News about all packages. Includes only state transitions (pass-fail, fail-pass). Full history is available in each individual package page and in their published data files."
  insert_items(global_news, feed)
end
File.open(File.join(feeds_dir, 'all-packages.xml'), 'w') do |f|
  f.write(global_feed.to_s.gsub('<summary>', '<summary type="html">'))
end
