#! /usr/bin/ruby

require 'collab-qa'
require 'optparse'

verbose = false
todofile = nil
disptime = false
restrict = nil
progname = File::basename($PROGRAM_NAME)
opts = OptionParser::new do |opts|
  opts.program_name = progname
  opts.banner = "Usage: #{progname} [options]"
  opts.separator ""
  opts.separator "Options:"

  opts.on("-v", "--verbose", "Verbose mode") do |v|
    verbose = true
  end

  opts.on("-t", "--TODO FILE", "Only TODO lines from file") do |f|
    todofile = f
  end

  opts.on("-r", "--restrict RE", "Only lines matching RE") do |r|
    restrict = /#{r}/
  end
end
opts.parse!(ARGV)

if todofile
  pkgs = IO::read(todofile).split(/\n/).grep(/ TODO/).map { |e| e.split(' ')[0] }
  files = []
  pkgs.each do |pkg|
    g = Dir::glob("#{pkg}_*log")
    g2 = Dir::glob("#{pkg}.*log")
    files << g[0] if g[0] != nil
    files << g2[0] if g2[0] != nil
  end
else
  files = Dir::glob("*log")
end

DATE=ENV['DATE']
if DATE.nil?
  puts "DATE environment variable not set. e.g export DATE=2011/08/23"
  exit(1)
end

files.sort.each do |file|
  puts
  puts "######## #{file} ########"
  log = CollabQA::Log::new(file)
  log.extract_log
  next if log.oneline_to_s(disptime) !~ restrict
  puts "--------- Error:"
  puts log.extract
  puts "----------------"
  puts log.sum_1l
  puts "----------------"
  nbl = log.extract.length
  puts "package: #{log.package}"
  puts "lines: #{nbl}"
  if nbl > 200
    puts "TOO MANY LINES"
  end
  bugs = IO::read(".bugs.#{log.package}").split(/\n/)
  bugs.each_with_index do |i, j|
    puts "#{j+1}: #{i}"
  end
  versions = `apt-cache showsrc #{log.package} |grep "^Version:" | awk '{print $2}'`.split
  versions.each do |v|
    if `dpkg --compare-versions #{v} gt #{log.version} ; echo $?`.to_i == 0
      puts "There's a newer version available: #{v} (vs: #{log.version})."
    end
  end
  ex = false
  while not ex
    l = STDIN.gets
    l.chomp!
    if l.to_i != 0
      bugnum = bugs[l.to_i-1].split[0]
      todo = IO::read(ENV['TODOFILE'])
      todo.gsub!(/^#{log.package} (.*) TODO.*$/, "#{log.package} \\1 ##{bugnum}")
      File::open(ENV['TODOFILE'], "w") do |f|
        f.print todo
      end
      ex = true
    elsif l =~ /^v /
      rest, b = l.split(' ')
      if b.to_i != 0
        bugnum = bugs[b.to_i-1].split[0]
        system("w3m -dump http://bugs.debian.org/#{bugnum}")
      end
    elsif l =~ /^sev /
      rest, b = l.split(' ')
      if b.to_i != 0
        bugnum = bugs[b.to_i-1].split[0]
        todo = IO::read(ENV['TODOFILE'])
        todo.gsub!(/^#{log.package} (.*) TODO.*$/, "#{log.package} \\1 ##{bugnum}")
        File::open(ENV['TODOFILE'], "w") do |f|
          f.print todo
        end
        ex = true
        system("bts severity #{bugnum} serious")
      end
    elsif l == 'r'
      File::open(".mail.#{log.package}", "w") do |f|
        f.puts log.to_mail(DATE, ENV['DEBFULLNAME'], ENV['DEBEMAIL'], ENV['BUGTYPE'], file)
      end
      cmd = "/usr/bin/mutt -e 'set autoedit' -H .mail.#{log.package}"
      system(cmd)
      if ENV['TODOFILE']
        puts "edit TODOFILE? ('n' if not!)"
        l = STDIN.gets
        l.chomp!
        if l != 'n'
          todo = IO::read(ENV['TODOFILE'])
          todo.gsub!(/^#{Regexp::escape(log.package)} (.*) TODO.*$/, "#{log.package} \\1 NNN")
          File::open(ENV['TODOFILE'], "w") do |f|
            f.print todo
          end
        end
      end
      ex = true
    elsif l == "s"
      puts "Skipping ..."
      ex = true
    elsif l =~ /^v/
      bugnum = bugs[l[1..-1].to_i-1].split[0]
      system("epiphany http://bugs.debian.org/#{bugnum} &>/dev/null &")
    else
      puts "Unknown command: #{l.inspect}"
    end
  end
end
