#!/usr/bin/ruby

require 'optparse'

require 'debci'
require 'debci/job'

# defaults
class Options < Hash
  def use(opt, value)
    self[opt] ||= []
    self[opt] << value
  end
end

options = Options.new
yes = false

# parse command line
optparse = OptionParser.new do |opts|
  opts.banner = 'Usage: debci cancel [OPTIONS] [ID [ID ...]]'
  opts.separator 'Options:'

  opts.on('-s', '--suite SUITE', 'filter by suite') do |s|
    options.use(:suite, s)
  end

  opts.on('-a', '--arch ARCH', 'filter by architecture') do |a|
    options.use(:arch, a)
  end

  opts.on('-b', '--backend BACKEND', 'filter by backendbackend') do |b|
    options.use(:backend, b)
  end

  opts.on('-A', '--autopkgtest variant', 'filter by autopkgtest variant') do |a|
    options.use(:autopkgtest, a)
  end

  opts.on('-t', '--trigger TRIGGER', 'filter by trigger') do |t|
    options.use(:trigger, t)
  end

  opts.on('-r', '--requestor REQUESTOR', 'filter by requestor') do |r|
    user = Debci::User.find_by_username(r)
    options.use(:requestor, user)
  end

  opts.on('-P', '--priority N', 'filter by priority') do |p|
    options.use(:priority, Integer(p))
  end

  opts.on('-p', '--package PKG', 'filter by package') do |p|
    pkg = Debci::Package.find_by_name(p)
    options.use(:package, pkg)
  end

  opts.on('-y', '--yes', 'Do not ask for confirmation before cancelling jobs (dangerous)') do
    yes = true
  end
end
optparse.parse!

if !options.empty? && !ARGV.empty?
  Debci.error("Cannot pass both filtering options and job ids. Pick one.")
  exit 1
end

jobs = Debci::Job.where(date: nil)
if ARGV.empty?
  jobs = jobs.where(options)
else
  Debci.warn("W: Job ids given, ignoring all filtering options")
  jobs = jobs.where(run_id: ARGV)
end

count = jobs.count
if count.zero?
  puts "No jobs match"
  exit
end

Debci.log "Cancelling %d pending jobs\n" % jobs.count
print "Continue? [y|N] " unless yes
if yes || ['y', 'yes'].include?(gets.strip.downcase)
  jobs.update(
    date: Time.now,
    status: 'tmpfail',
    files_purged: true,
  )
  puts "Cancelled #{count} jobs."
else
  puts "Aborted."
end
