#!/usr/bin/env ruby

require 'optparse'
require 'arg_scanner/options'
require 'arg_scanner/version'

options = ArgScanner::OPTIONS
option_parser = OptionParser.new do |opts|
  opts.banner = "arg-scanner #{ArgScanner::VERSION}" + <<~EOB
  
    Usage: arg-scanner [OPTIONS] <ruby cmdline> 
    arg-scanner is a ruby script mediator supposed to be run from the command line or IDE.
        The data will be sent to a signature server so it must be running during arg-scanner execution.
  EOB

  opts.separator "Options:"
  opts.on("--type-tracker", "enable type tracker") do
    options.enable_type_tracker = true
  end
  opts.on("--state-tracker", "enable state tracker") do
    options.enable_state_tracker = true
  end

  opts.on("--no-type-tracker", "disable type tracker") do
    options.enable_type_tracker = false
  end
  opts.on("--no-state-tracker", "disable state tracker") do
    options.enable_state_tracker = false
  end

  opts.on("--output-dir=[Dir]", String, "specify output directory (ignored by type tracker)") do |dir|
    options.output_dir = dir
  end

  opts.on("--catch-only-every-N-call=[N]", Integer, "randomly catches only 1/N of all calls to speed up performance (by default N = 1)") do |n|
    options.catch_only_every_n_call = n
  end
  opts.on("--project-root=[PATH]", String, "Specify project's root directory to catch every call from this directory. "\
      "Calls from other directories aren't guaranteed to be caught") do |path|
    options.project_root = path
  end

  opts.on("--pipe-file-path=[PATH]", String, "Specify pipe file path to connect to server") do |path|
    options.pipe_file_path = path
  end

  opts.on("--buffering", "enable buffering between arg-scanner and server. It speeds up arg-scanner but doesn't allow "\
      "to use arg-scanner \"interactively\". Disabled by default") do |buffering|
    options.buffering = buffering
  end
end

begin
  option_parser.parse! ARGV
rescue StandardError => e
  puts option_parser
  puts
  puts e.message
  exit 1
end

if ARGV.size < 1
  puts option_parser
  puts
  puts "Ruby program to trace must be specified."
  exit 1
end

options.set_env

old_opts = ENV['RUBYOPT'] || ''
starter = "-r #{File.expand_path(File.dirname(__FILE__))}/../lib/arg_scanner/starter"
unless old_opts.include? starter
  ENV['RUBYOPT'] = starter
  ENV['RUBYOPT'] += " #{old_opts}" if old_opts != ''
end

$0 = ARGV[0]
Kernel.exec *ARGV
