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

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

module SshfsMapper
	class Config
		attr_reader :options

		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

			@options = OpenStruct.new( {
				:config_dir => xdg_dir + '/sshfs-mapper',
				:map_list => [],
				:initialize_enable => false,
				:umount_enable => false,
				:target => nil,
				:verbose_enable => false
			} )
		end

		def parseFile(&blk)
			puts "Parsing config #{@options.config_dir}/config"

			maps = []
			Find.find( @options.config_dir ) do |path|
				if File.file?( path )
					if File.basename( path ) =~ /.map$/
						puts "* #{File.basename( path )}"
						map = Map.new( path )
						map.parse()
						if blk then 
							yield map 
						else 
							maps.push( map )
						end
					else
						Find.prune       # Don't look any further into this way
					end
					#total_size += FileTest.size(path)
				end
			end
			return maps
		end

		def parseCmd( args )
			opts = OptionParser.new do |opts|

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

				opts.separator ""
				opts.separator "Specific options:"

				opts.on('-t', '--target TARGET', 'Mount only specified target') do |target|
					@options.resize_enable = true
					@options.resize_width = resizeX.to_i
					@options.resize_height = resizeY.to_i
				end

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

				opts.on('-i', '--initialize',
						'Populate default configuration and example map' )  do |init|
					@options.initialize_enable = init
						end

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

			begin
				opts.parse!( args )
			rescue OptionParser::ParseError => e
				puts e.message
				exit 1
			end
			@options
		end

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