### INITIAL RELEASE - SUBJECT TO CHANGE ###

require_relative 'config'
require_relative 'svn'

module ASF
  #
  # Common access to membership application files
  #
  class MemApps
    @@files = nil
    @@tag = nil

    STEM = 'member_apps'

    def self.update_cache(env)
      ASF::DocumentUtils.update_cache(STEM, env)
    end

    # list the stems of the files
    def self.stems
      refresh
      @@files.map do |file|
        file.sub(/\.\w+$/, '')
      end
    end

    # list the names of the files (excluding any ones which record emeritus)
    def self.names
      refresh
      @@files
    end

    def self.sanitize(name)
      # Don't transform punctuation into '-'
      ASF::Person.asciize(name.strip.downcase.gsub(/[.,()"]/, ''))
    end

    # search for file name
    # @return filename if it exists, or
    # return full name if filename matches the stem of a file
    def self.search(filename)
      names = self.names()
      if names.include?(filename)
        return filename
      end
      names.each { |name|
        if name.start_with?("#{filename}.")
          return name
        end
      }
      nil
    end

    # find the name of the memapp for a person or nil
    def self.find1st(person)
      self.find(person)[0].first
    end

    # find the memapp for a person; return an array:
    # - [array of files that matched (possibly empty), array of stems that were tried]
    def self.find(person)
      found = [] # matches we found
      names = [] # names we tried
      [
        (person.icla.legal_name rescue nil),
        (person.icla.name rescue nil),
        person.id, # allow match on avalid
        person.member_name # this is slow
      ].uniq.each do |name|
        next unless name
        memapp = self.sanitize(name) # this may generate dupes, so we use uniq below
        names << memapp
        file = self.search(memapp)
        if file
          found << file
        end
      end
      return [found, names.uniq]
    end

    # All files
    def self.files
      refresh
      @@files
    end

    private

    def self.refresh
      cache_dir = ASF::DocumentUtils.check_cache(STEM).first
      #                                         trimSlash, getEpoch
      @@tag, list = ASF::SVN.getlisting(STEM, @@tag, true, false, cache_dir)
      if list
        @@files = list
      end
    end
  end
end

# for test purposes
if __FILE__ == $0
  require_relative 'documents'
  puts ASF::MemApps.files.length
  puts ASF::MemApps.names.length
  puts ASF::MemApps.stems.length
end
