#!/usr/bin/env ruby
if __FILE__ == $0
	class Translation_Checker
		def initialize(languages)
			require '../Utilities/Recursive_Open_Struct'
			$cfg = Recursive_Open_Struct.new
			require 'en'
			
			@missing = [ ]
			@untranslated = [ ]
			@unrequired = [ ]
		
			if languages.empty?
				# load all languages
				Dir['*.rb'].each do |file|
					require file
				end
			else
				languages.each do |lang_file|
					require lang_file
				end
			end
			# english is the reference language
			@reference_language = $cfg.translations.en
		end
		
		def self.usage
			puts "usage: #{__FILE__} [language.rb...]"
		end
		
		def print_status(ary, str)
			if ary.empty?
				puts "#{str} none :-)"
			else
				puts "#{str} #{ary.size} items :-("
				ary.each do |item|
					puts "\t" + item
				end
			end
			puts "\n"
		end
		
		def check
			$cfg.translations.attrs.each do |lang_name|
				next if $cfg.translations[lang_name] == @reference_language
				@attr_stack = [ "$cfg.translations", lang_name]
				check_attrs(@reference_language, $cfg.translations[lang_name])
			end
			# print status
			print_status(@missing, "missing translation items:")
			print_status(@untranslated, "untranslated:")
			print_status(@unrequired, "translations that can be removed:")
		end
		
		# checks a language against a reference language
		def check_attrs(reference, lang)
			reference.attrs.each do |attr|
				@attr_stack.push attr
				if reference[attr].class == Recursive_Open_Struct && lang[attr].class == Recursive_Open_Struct
					check_attrs(reference[attr], lang[attr])
				else
					if lang.class != Recursive_Open_Struct || !lang.attrs.include?(attr)
						@missing.push(@attr_stack.join(".") + " (in English: \"#{reference[attr]}\")")
					elsif lang[attr] == reference[attr]
						@untranslated.push(@attr_stack.join(".") + " (in English: \"#{reference[attr]}\")")
					end
				end
				@attr_stack.pop
			end
			(lang.attrs - reference.attrs).each do |attr|
				@unrequired.push((@attr_stack+[attr]).join("."))
			end
		end
	end
	
	# execute it
	if ARGV.include?("-h") || ARGV.include?("-help") || ARGV.include?("--help") || ARGV.include?("/?")
		Translation_Checker.usage
	else
		t = Translation_Checker.new(ARGV)
		t.check
	end
end
