#!/usr/bin/ruby
# vim: set ts=4 sw=4:

require 'optparse'
require 'ostruct'
require 'pp'
require 'find'

require 'rubygems'
require 'rdebug/base'

module SshfsMapper
	class Config

		attr_reader :maps_active
		attr_reader :maps
		attr_reader :action

		ACTION_UMOUNT = :umount
		ACTION_MOUNT = :mount
		ACTION_INIT = :init

		def initialize

			user = if ENV['USER'] then
					   ENV['USER']
				   else
					   raise "Environment variable 'USER' is missing!"
				   end

			home_dir = if ENV['HOME'] then 
						   ENV['HOME']
					   else
						   "/home/" + user
					   end

			xdg_dir = if ENV['XDG_CONFIG_HOME'] then
						  ENV['XDG_CONFIG_HOME']
					  else
						  home_dir + '/.config'
					  end

			@action = ACTION_MOUNT
			@config_dir = xdg_dir + '/sshfs-mapper'
			@config_file = nil
			@maps = []
			@initialize_enable = false
			@umount_enable = false
			@target = nil
			@verbose_enable = false
			@debug = false
		end

		def parse_file &blk
			rdebug "Config: #{@config_dir}/config"

			@maps = []
			Find.find( @config_dir ) do |path|
				if File.file? path
					if File.basename( path ) =~ /.map$/
						begin
							map = Map.new path
							yield map if block_given?
							maps.push map
						rescue
							# error while parsing map
						end
					end
					#total_size += FileTest.size(path)
				end
			end
		end

		def parse_cmd_line args
			opts = OptionParser.new do |opts|

				opts.banner = "Usage: #{$0} [action] [options]"

				opts.separator ""
				opts.separator "Action (mount by default):"

				opts.on('-u', '--umount', 'Umount') do |umount|
					@action = ACTION_UMOUNT
				end

				opts.on('-i', '--initialize', 'Populate with default configuration' ) do |init|
					@action = ACTION_INIT
				end

				opts.separator "Specific options:"

				opts.on('-a', '--all', 'Targets all enabled maps (disables -s)') do |all|
					@targets_all = all
				end

				#FIXME: use target list there
				opts.on('-s', '--select TARGET', 'Target selected map (even disabled)') do |target|
					@targets << target
				end

				opts.on('-v', '--[no-]verbose', 'Run verbosely' )  do |verbose|
					@verbose_enable = verbose
				end
			end

			begin
				opts.parse! args
			rescue OptionParser::ParseError => e
				puts opts.to_s
				puts ""
				puts e.message
				exit 1
			end
		end

		def to_s
			s = []
			s << "config_file = #{@config_file}"
			s << "verbose_enable = #{@verbose_enable}"
			s.join "\n"
		end
	end
end