require 'optparse'
require 'ostruct'

module Clickatell
  module Utility
    class Options #:nodoc:
      class << self
        
        def parse(args)          
          @options = self.default_options
          parser = OptionParser.new do |opts|
            opts.banner = "Usage: sms [options] recipient(s) message"
            opts.separator "  Recipients can be a comma-separated list, up to 100 max."
            opts.separator ""
            opts.separator "Specific options:"
          
            opts.on('-u', '--username USERNAME',
              "Specify the clickatell username (overrides ~/.clickatell setting)") do |username|
               @options.username = username 
            end
          
            opts.on('-p', '--password PASSWORD',
              "Specify the clickatell password (overrides ~/.clickatell setting)") do |password|
               @options.password = password
            end
          
            opts.on('-k', '--apikey API_KEY',
              "Specify the clickatell API key (overrides ~/.clickatell setting)") do |key|
               @options.api_key = key
            end
            
            opts.on('-f', '--from NAME_OR_NUMBER',
              "Specify the name or number that the SMS will appear from") do |from|
               @options.from = from 
            end
          
            opts.on('-b', '--show-balance',
               "Shows the total number of credits remaining on your account") do
               @options.show_balance = true
            end
          
            opts.on('-s', '--status MESSAGE_ID',
               "Displays the status of the specified message.") do |message_id|
               @options.message_id = message_id
               @options.show_status = true  
            end
            
            opts.on('-S', '--secure',
                "Sends request using HTTPS") do
                Clickatell::API.secure_mode = true
              end
            
            opts.on('-d', '--debug') do
               Clickatell::API.debug_mode = true
            end
          
            opts.on_tail('-h', '--help', "Show this message") do
              puts opts
              exit
            end
          
            opts.on_tail('-v', '--version') do
              puts "Ruby Clickatell SMS Utility #{Clickatell::VERSION}"
              exit
            end
          end
          
          @options.recipient = args[-2].split(',').map { |r| r.gsub(/^\+/, '') } rescue nil
          @options.message   = args[-1]
          
          parser.parse!(args)
        
          if (@options.message.nil? || @options.recipient.nil?) && send_message?
            puts "You must specify a recipient and message!"
            puts parser
            exit
          end

          return @options
        
        rescue OptionParser::MissingArgument => e
          switch_given = e.message.split(':').last.strip
          puts "The #{switch_given} option requires an argument."
          puts parser
          exit
        end
      
        def default_options
          options = OpenStruct.new
          config_file = File.open(File.join(ENV['HOME'], '.clickatell'))
          config = YAML.load(config_file)
          options.username = config['username']
          options.password = config['password']
          options.api_key  = config['api_key']
          options.from     = config['from']
          return options
        rescue Errno::ENOENT
          return options
        end
        
        def send_message?
          (@options.show_status.nil? &&
           @options.show_balance.nil?)
        end
        
      end
    end
  end
end
