# encoding: utf-8

module BeerDb

class BeerReader

  include LogUtils::Logging

## make models available by default with namespace
#  e.g. lets you use Usage instead of Model::Usage
  include Models

  def self.from_zip( zip_file, entry_path, more_attribs={} )
    ## get text content from zip
    entry = zip_file.find_entry( entry_path )

    text = entry.get_input_stream().read()
    text = text.force_encoding( Encoding::UTF_8 )

    self.from_string( text, more_attribs )
  end

  def self.from_file( path, more_attribs={} )
    ## note: assume/enfore utf-8 encoding (with or without BOM - byte order mark)
    ## - see textutils/utils.rb
    text = File.read_utf8( path )
    self.from_string( text, more_attribs )
  end

  def self.from_string( text, more_attribs={} )
    BeerReader.new( text, more_attribs )
  end

  def initialize( text, more_attribs={} )
    ## todo/fix: how to add opts={} ???
    @text = text
    @more_attribs = more_attribs
  end


  def read()

    reader = ValuesReader.from_string( @text, @more_attribs )

    ### todo: cleanup - check if [] works for build_title...
    #     better cleaner way ???
    if @more_attribs[:state_id].present?
      known_breweries_source = Brewery.where( state_id:  @more_attribs[:state_id] )
    elsif @more_attribs[:country_id].present?
      known_breweries_source = Brewery.where( country_id: @more_attribs[:country_id] )
    else
      logger.warn "no state or country specified; use empty brewery ary for header mapper"
      known_breweries_source = []
    end

    known_breweries  = TextUtils.build_title_table_for( known_breweries_source )


    reader.each_line do |new_attributes, values|

      ## note: check for header attrib; if present remove
      ### todo: cleanup code later
      ## fix: add to new_attributes hash instead of values ary
      ##   - fix: match_brewery()   move state,city code out of values loop for reuse at the end
      if new_attributes[:header].present?
        brewery_line = new_attributes[:header].dup   # note: make sure we make a copy; will use in-place string ops
        new_attributes.delete(:header)   ## note: do NOT forget to remove from hash!

        logger.debug "  trying to find brewery in line >#{brewery_line}<"
        ## todo: check what map_titles_for! returns (nothing ???)
        TextUtils.map_titles_for!( 'brewery', brewery_line, known_breweries )
        brewery_key = TextUtils.find_key_for!( 'brewery', brewery_line )
        logger.debug "  brewery_key = >#{brewery_key}<"
        unless brewery_key.nil?
          ## bingo! add brewery_id upfront, that is, as first value in ary
          values = values.unshift "by:#{brewery_key}"
        end
      end

      Beer.create_or_update_from_attribs( new_attributes, values )
    end # each_line
  end


end # class BeerReader
end # module BeerDb
