#!/usr/bin/env ruby

require 'qcmd'
require 'trollop'

# require 'profile'

VERSION_STRING =  "qcmd #{ Qcmd::VERSION } (c) 2012 Figure 53, Baltimore, MD."

opts = Trollop::options do
  version VERSION_STRING
  opt :verbose, 'Use verbose mode', :default => false
  opt :debug, "Show full debug output, don't make changes to workspaces", :default => false
  opt :machine, 'Automatically try to connect to the machine with the given name', :type => :string
  opt :workspace, 'Automatically try to connect to the workspace with the given name', :type => :string
  opt :workspace_passcode, 'Use the given workspace passcode', :type => :integer
  opt :command, 'Execute a single command and exit', :type => :string
  opt :version_check, 'Check if a new version of qcmd is available and quit', :default => false
end

Qcmd.log_level = :info

if opts[:version_check]
  if Qcmd.available_version
    if Qcmd.installed_version.to_s != Qcmd.available_version.to_s
      puts "You have version #{ Qcmd.installed_version }, but #{ Qcmd.available_version.to_s } is available."
      puts "Run `sudo gem update qcmd` to get the most recent version."
    else
      puts "You have the current version of qcmd installed."
      puts VERSION_STRING
    end
  else
    puts "We were unable to reach #{ Qcmd.rubygems_uri } to check the available qcmd version."
  end

  exit
else
  # version check on every command line open
  Qcmd.while_quiet do
    if !Qcmd::Configuration.config['skip_version_warning'] && Qcmd.available_version
      known_available_version = Qcmd::Configuration.config['available_version']

      if Qcmd.installed_version.to_s != Qcmd.available_version.to_s &&
          (!Qcmd::Configuration.config['version_warning'] || Qcmd.available_version != known_available_version)
        # use 'puts' to make sure the message is available
        puts "A new version of qcmd is available! You have #{ Qcmd.installed_version }, but #{ Qcmd.available_version.to_s } is the most recent."
        puts

        Qcmd::Configuration.update('available_version', Qcmd.available_version)
        Qcmd::Configuration.update('version_warning', true)
      end
    else
      Qcmd::Configuration.update('skip_version_warning', true)
    end
  end
end

if opts[:verbose]
  Qcmd.log_level = :debug
end

if opts[:debug]
  Qcmd.log_level = :debug
  Qcmd.debug_mode = true
end

# browse local network and check for qlab + qlab workspaces

Qcmd::History.load
Qcmd::Network.init

if !opts[:machine_given]
  Qcmd.ascii_qlab
  Qcmd.print
  Qcmd.print Qcmd.centered_text(VERSION_STRING)
  Qcmd::Network.browse_and_display opts
else
  if Qcmd::Network::IPV4_MATCHER =~ opts[:machine]
    Qcmd.debug "[bin/qcmd] given machine name matches IP address pattern"
  elsif opts[:machine] == 'localhost'
    opts[:machine] = '127.0.0.1'
  else
    Qcmd.debug "[bin/qcmd] browsing network #{ opts[:machine] }"
    Qcmd::Network.browse
  end
end

if opts[:command_given] && !(opts[:machine_given] && opts[:workspace_given])
  Qcmd.print_wrapped("if you give a command, you must also give a
                      machine name and a workspace name to connect to")
elsif opts[:command_given] && opts[:machine_given] && opts[:workspace_given]
  opts[:command_mode] = true
end

# Profiler__::start_profile
Qcmd::CLI.launch opts
# Profiler__::stop_profile
# Profiler__::print_profile($stderr)