require "auto_data/version"
require "yaml"
module AutoData


  class Parse
    #TODO: Change methods to private
    def initialize()
      @gvar=ENV['AUTO_DATA_PATH'].to_s
      if @gvar.length == 0
        raise Exception.new("Variable is not defined : ENV[\'AUTO_DATA_PATH\']")
      end
      @files = Hash.new
      @file_count=0
      Dir[@gvar + '/**/*.yml'].each { |file|
        begin
          @files['fullpath_' + @file_count.to_s]=file
          @files['filename_' + @file_count.to_s]=file.split('/').last
          @name_def_key =file.split('/').last.to_s.split('.').first
          @files['name_' + @file_count.to_s]=@name_def_key #file.split('/').last.to_s.split('.').first
          @info = begin
            YAML.load_file(file)
          rescue Exception => e
            puts "Could not parse auto objects files: #{e.message}"
            raise Exception.new('Could not parse auto objects files: #{e.message}')
          end
          @files["#{@name_def_key}_default_key"]= begin
            @info["default_key"].nil? ? 'NotFound' : @info["default_key"]
          rescue NoMethodError => e
            puts "Couldn't find key #{default_key} - #{e.message}"
          end

          @file_count +=1
        end }
      # puts @files
    end

    def change_scope(filename, new_value)
      if !@files.value?(filename)
        raise Exception.new("File name '#{filename}' is not found")
      else
        @files["#{filename}_default_key"] = new_value
      end
    end #End change_scope

    private
    def method_missing (filename, *args)
      use_default_key= false
      if args[0].count('.') == 0 #use custom key; >0 usedefault_key
        use_default_key=true
        subkey=args[0].to_s
      else
        fileinfo= args[0].to_s.split('.')
        if fileinfo.size !=2
          raise Exception.new('Malformed structure, must be <AutoData.filename(\'key.subkey\')> ')
        end
        key= fileinfo[0]
        subkey= fileinfo[1]
      end

      load(filename)
      if use_default_key
        if @files.key?(filename.to_s + '_default_key')
          default_key = @files["#{filename}_default_key"]
        else
          raise Exception.new("Couldn't find key default_key. ")
        end
        result= begin
          @file["#{default_key}"]["#{subkey}"].nil? ? 'No Value Found' : @file["#{default_key}"]["#{subkey}"]
        rescue NoMethodError => e
          puts "Couldn't find key #{subkey} using 'default_key' #{e.message}"
        end
      else
        result= begin
          @file["#{key}"]["#{subkey}"].nil? ? 'No Value Found' : @file["#{key}"]["#{subkey}"]
        rescue NoMethodError => e
          puts "Couldn't find key #{subkey}.#{subkey} #{e.message}"
        end
      end

      result
    end #End method_missing

    private
    def load(file)

      if @files.value?(file).nil?
        raise Exception.new("File name is not found #{file}")
      end
      key_value= @files.key(file.to_s).to_s
      key_2find = 'fullpath_' + key_value.split('_').last
      local_file_path= @files.values_at(key_2find)
      @file = begin
        YAML.load_file(local_file_path[0].to_s)
      rescue Exception => e
        puts "Could not parse auto objects files: #{e.message}"
        raise Exception.new('Could not parse auto objects files: #{e.message}')
      end
    end #end Load


  end #End Parse Class


end #End Module