#!/usr/bin/env python3

#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

#
# Utility for checking that the local committers list used to generate
# the Governance page is up-to-date with the authoritative ASF roster.
#

from collections import namedtuple
import json
import os
import sys

import requests
import yaml


git_root = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))

committers_yaml = os.path.join(git_root, "_data", "committers.yml")

# See https://home.apache.org/phonebook-about.html
# for available resources
committers_url = "https://whimsy.apache.org/public/public_ldap_projects.json"

Roster = namedtuple('Roster', ('committers', 'pmcs'))


def get_asf_roster():
    r = requests.get(committers_url)
    j = r.json()
    proj = j['projects']['arrow']
    pmcs = set(proj['owners'])
    committers = set(proj['members']) - pmcs
    return Roster(committers, pmcs)


def get_local_roster():
    with open(committers_yaml, "r") as f:
        d = yaml.safe_load(f)
    committers = set()
    pmcs = set()
    for member in d:
        uid = member['alias']
        role = member['role']
        if role in ('PMC', 'VP'):
            pmcs.add(uid)
        elif role == 'Committer':
            committers.add(uid)
        else:
            raise ValueError(f"Invalid role {role!r} for {uid}")
    return Roster(committers, pmcs)


if __name__ == "__main__":
    local_roster = get_local_roster()
    asf_roster = get_asf_roster()
    if local_roster == asf_roster:
        print("Committer list up-to-date")
        sys.exit(0)

    missing_pmcs = asf_roster.pmcs - local_roster.pmcs
    if missing_pmcs:
        print("Missing PMCs in local list:", sorted(missing_pmcs))
    missing_committers = asf_roster.committers - local_roster.committers
    if missing_committers:
        print("Missing committers in local list:", sorted(missing_committers))
    unexpected_members = ((local_roster.pmcs | local_roster.committers) -
                          (asf_roster.pmcs | asf_roster.committers))
    if unexpected_members:
        print("Unexpected members in local list:", sorted(unexpected_members))
    sys.exit(1)
