#!/usr/bin/env ruby
require 'rcodetools/xmpfilter'
require 'rcodetools/options'

options = DEFAULT_OPTIONS
rails_settings = false
klass = XMPFilter

opts = OptionParser.new do |opts|
  opts.extend OptionHandler
  opts.set_banner

  opts.separator ""
  opts.separator "Modes:"
  opts.on("-a", "--annotations", "Annotate code (default)") do
    klass = XMPFilter
  end
  opts.on("-u", "--unittest", "Complete Test::Unit assertions.") do 
    require 'rcodetools/xmptestunitfilter'
    klass = XMPTestUnitFilter
  end
  opts.on("-s", "--spec", "Complete RSpec expectations.") do
    require 'rcodetools/xmptestunitfilter'
    klass = XMPRSpecFilter
    options[:interpreter] = "spec"
  end
  opts.on("-m", "--markers", "Add # => markers.") do
    klass = XMPAddMarkers
  end

  opts.handle_interpreter options

  opts.separator ""
  opts.separator "Specific options:"
  opts.on("-l N", "--min-line-length N", Integer, "Align markers to N spaces.") do |min_codeline_size|
    options[:min_codeline_size] = min_codeline_size
  end
  opts.on("--rails", "Setting appropriate for Rails.",
          "(no warnings, find working directory,",
          " Test::Unit assertions)") do 
    require 'rcodetools/xmptestunitfilter'
    options[:warnings] = false
    klass = XMPTestUnitFilter
    rails_settings = true
  end
  opts.on("--[no-]poetry", "Whether to use extra parentheses.",
          "(default: use them)") do |poetry_p|
    options[:use_parentheses] = !poetry_p
  end
  opts.on("--[no-]warnings", "Whether to add warnings (# !>).", 
          "(default: enabled)") {|warnings_p| options[:warnings] = warnings_p }
  opts.on("-q", "--quiet", "Supress standard output.") do
    options[:output_stdout] = false
  end

  opts.handle_misc options
end

set_extra_opts options
opts.parse!(ARGV)

if rails_settings && !options[:wd]
  if File.exist? ARGF.path
    options[:wd] = File.dirname(ARGF.path)
  elsif File.exist? "test/unit"
    options[:wd] = "test/unit"
  elsif File.exist? "unit"
    options[:wd] = "unit"
  end
end
targetcode = ARGF.read
Dir.chdir options[:wd] if options[:wd]

# Do the job. dispatched by klass.
puts klass.run(targetcode, options)
