# Creates JSON output with the following format:
#
# {
#   "lastTimestamp": "20160119171152Z", // most recent modifyTimestamp
#   "projects": {
#     "airflow": {
#       "createTimestamp": "20170118154251Z",
#       "modifyTimestamp": "20170118154251Z",
#       "members": [
#         "abcd",
#       ],
#       "owners": [
#         "abcd",
#       ],
#        "pmc": true|false, (may be absent)
#        "officer": "abcd", (may be absent)
#        "podling": "current|graduated|retired" (may be absent)
#     },
#     ...
#   },
# }
#

# ##################################################################################################
# TODO this is a preliminary version. Subject to change/removal. 
# The output format may change or may be dropped entirely - e.g. if it is merged into existing files
# ##################################################################################################

require_relative 'public_json_common'

# gather project group info
entries = {}

projects = ASF::Project.preload # for performance

if projects.empty?
  Wunderbar.error "No results retrieved, output not created"
  exit 0
end

# committee status
committees = Hash[ASF::Committee.load_committee_info.map {|committee|
  [ committee.name.gsub(/[^-\w]/,'') , committee ]
}]

# podling status
pods = Hash[ASF::Podling.list.map {|podling| [podling.name, podling.status]}]

lastStamp = ''
projects.keys.sort_by {|a| a.name}.each do |entry|
    next if entry.name == 'apldap' # infra team would prefer this not be publicized

    m = []
    entry.members.sort_by {|a| a.name}.each do |e|
        m << e.name
    end
    o = []
    entry.owners.sort_by {|a| a.name}.each do |e|
        o << e.name
    end
    lastStamp = entry.modifyTimestamp if entry.modifyTimestamp > lastStamp
    entries[entry.name] = {
        createTimestamp: entry.createTimestamp,
        modifyTimestamp: entry.modifyTimestamp,
        members: m,
        owners: o 
    }
    committee = committees[entry.name]
    if committee
        if committee.pmc?
            entries[entry.name][:pmc]=true
        elsif ASF::Project.find(committee.name).dn
            entries[entry.name][:officer]=committee.chair.id
        end
    end
    pod = pods[entry.name]
    if pod
        entries[entry.name][:podling]=pod
    end
end

info = {
  # Is there a use case for the last createTimestamp ?
  lastTimestamp: lastStamp,
  projects: entries,
}

public_json_output(info)

if changed? and @old_file
  # for validating UIDs
  uids = ASF::Person.list().map(&:id)
  entries.each do |name, entry|
    entry[:members].each do |id|
      Wunderbar.warn "#{name}: unknown member uid '#{id}'" unless uids.include?(id)
    end
    entry[:owners].each do |id|
      Wunderbar.warn "#{name}: unknown owner uid '#{id}'" unless uids.include?(id)
    end
  end
end
