#!/usr/bin/env ruby

require 'rubygems'
require 'tmpdir'
require 'geera'
require 'yaml'
require 'optparse'

config = File.join(ENV['HOME'], '.geera')
login  = YAML.load(File.read config) rescue nil
BUG_TEMPLATE = File.expand_path(File.join(
  File.dirname(__FILE__), '..', 'lib', 'template.txt'))

unless login
  File.open config, 'wb' do |f|

    options = {
      'username' => 'FIXME',
      'password' => 'FIXME',
      'url'      => 'FIXME',
      'qa'       => 'FIXME'
    }

    YAML.dump options, f
    f.chmod(0600)
  end
  abort "Created ~/.geera for you. Fill it out"
end


options = {}
OptionParser.new do |opts|
  opts.banner = <<-EOF
  Usage: geera <command> <ticket|project> [options]

  Commands:
    show - Shows ticket details
      `geera show TK-421`
    create - Creates a new ticket in a project
      `geera create TK`
    fix - Marks a ticket as fixed and assigns to QA.
      `geera fix TK-421`
    assign - Assigns a ticket to someone else
      `geera reassign TK-421 glucas`
    take - Assigns a ticket to yourself
      `geera take TK-421`
    list - Lists tickets in a filter
      `geera list 1138`
      `geera list my-filter-name`
    filters - Lists your filters
      `geera filters`
    comment - Simply comment on the ticket
      `geera comment TK-421 --message 'This is a difficult bug.'`

    Options:
  EOF

  opts.on("-m", "--message MESSAGE", "Add a comment") do |v|
    options[:message] = v
  end
end.parse!

exec = Geera::Executable.new login, ARGV, options
geera = exec.geera

command = ARGV.shift
number  = ARGV.shift
ticket  = geera.ticket number

project = number # for readability

case command
when 'start'
  command = Geera::Commands::Start.new login, number, geera, ARGV
  command.execute!
when 'estimate'
  command = Geera::Commands::Estimate.new login, number, geera, ARGV
  command.execute!
when 'fix'
  command = Geera::Commands::Fix.new login, number, geera, ARGV
  command.execute!
when 'resolve'
  command = Geera::Commands::Resolve.new login, number, geera, ARGV
  command.execute!
when 'assign'
  command = Geera::Commands::Assign.new login, number, geera, ARGV
  command.execute!
when 'take'
  command = Geera::Commands::Take.new login, number, geera, ARGV
  command.execute!
when 'show'
  command = Geera::Commands::Show.new login, number, geera, ARGV
  command.execute!
when 'filters'
  command = Geera::Commands::Filters.new login, number, geera, ARGV
  command.execute!
when 'list'
  number = (login['filters'] && login['filters'][number]) || number

  command = Geera::Commands::List.new login, number, geera, ARGV
  command.execute!
when /components?/
  p Hash[*geera.components(project).map { |c| [c.name, c.id] }.flatten]
when /quicky?/
  # TODO: this is horrid UI, but it works for me for now...
  component = ARGV.shift
  user      = ARGV.shift
  summary   = ARGV.join(" ")
  ticket = geera.create_ticket(:project    => project,
                               :summary    => summary,
                               :assignee   => user,
                               :components => geera.component(project,
                                                              component))
  puts "Created ticket: #{ticket.number}"
when 'create'
  fname = File.join(Dir.tmpdir, 'bug.txt')
  File.open(fname, 'wb') do |f|
    f.write File.read(BUG_TEMPLATE)
  end

  system("#{ENV['EDITOR'] || 'vi'} #{fname}")
  contents = File.read(fname)
  sum, desc = contents.split('##### Description is below here #####')

  ticket = geera.create_ticket :project     => project,
                               :summary     => sum.sub(/^Summary:/, '').strip,
                               :description => desc && desc.strip

  puts "Created ticket: #{ticket.number}"
when 'comment'
  # Do nothing, let the -m flag pick it up
else
  raise "unknown command: #{command}"
end

ticket.comment options[:message] if options[:message]
