import os

import yaml
import sys
import argparse


def load_yaml(file_path):
    """
    load yaml
    :param file_path: yaml file path
    :return: content of yaml
    """
    with open(file_path, encoding="utf-8") as fp:
        try:
            content = yaml.load(fp.read(), Loader=yaml.Loader)
        except yaml.MarkedYAMLError as e:
            print(e)
            sys.exit(1)
    return content


def get_sig_owners_path(sig_name):
    cur_path = os.getcwd()
    sig_path = os.path.join(cur_path, sig_name)
    if not os.path.exists(sig_path):
        print("%s is not exist" % sig_path)
        sys.exit(1)
    owners_path = os.path.join(sig_path, "OWNERS")
    return sig_path, owners_path


def make_template_file_data_and_write(sig_name, sig_path, owners_path):
    content = {}
    content["name"] = sig_name
    content["description"] = "TO_BE_CLARIFIED"
    content["created_on"] = "2019-12-31"
    content["mailing_list"] = "TO_BE_CLARIFIED"
    content["meeting_url"] = "TO_BE_CLARIFIED"
    content["mature_level"] = "startup"
    content["mentors"] = [{"gitee_id": "--xxx--", "name": "TO_BE_CLARIFIED", "organization": "TO_BE_CLARIFIED", "email": "TO_BE_CLARIFIED"}]

    # if sig_info.yaml exists
    if os.path.exists(os.path.join(sig_path, "sig-info.yaml")):
        sig_info_content = load_yaml(os.path.join(sig_path, "sig-info.yaml"))
        content["description"] = sig_info_content.get("description") if sig_info_content.get("description") else "TO_BE_CLARIFIED"
        content["meeting_url"] = sig_info_content.get("meeting_url") if sig_info_content.get("meeting_url") else "TO_BE_CLARIFIED"
        content["mailing_list"] = sig_info_content.get("mailing_list") if sig_info_content.get("mailing_list") else "TO_BE_CLARIFIED"

        mts_in_sig_info = []
        for i in sig_info_content.get("maintainers"):
            mts_in_sig_info.append(i["gitee_id"])

        v = []
        for m in decode_owners(owners_path):
            if m in mts_in_sig_info:
                for mr in sig_info_content.get("maintainers"):
                    if m == mr["gitee_id"]:
                        v.append({
                            "gitee_id": m, "name": mr.get("name") if mr.get("name") else "TO_BE_CLARIFIED",
                            "organization": mr.get("organization") if mr.get("organization") else "TO_BE_CLARIFIED",
                            "email": mr.get("email") if mr.get("email") else "TO_BE_CLARIFIED",
                        })
            else:
                v.append({"gitee_id": m, "name": "TO_BE_CLARIFIED", "organization": "TO_BE_CLARIFIED",
                          "email": "TO_BE_CLARIFIED"})

        if len(v) == 0:
            content["maintainers"] = [
                {"gitee_id": "--xxx--", "name": "TO_BE_CLARIFIED", "organization": "TO_BE_CLARIFIED",
                 "email": "TO_BE_CLARIFIED"}]
        else:
            content["maintainers"] = v

    else:
        v = []
        for m in decode_owners(owners_path):
            v.append({"gitee_id": m, "name": "TO_BE_CLARIFIED", "organization": "TO_BE_CLARIFIED",
                      "email": "TO_BE_CLARIFIED"})

        if len(v) == 0:
            content["maintainers"] = [
                {"gitee_id": "--xxx--", "name": "TO_BE_CLARIFIED", "organization": "TO_BE_CLARIFIED",
                 "email": "TO_BE_CLARIFIED"}]
        else:
            content["maintainers"] = v

    repos = []
    for root, dirs, files in os.walk(sig_path):
        if len(dirs) == 0:
            if len(files) == 0:
                break
            for f in files:
                if root.count("/") > 2 and f.endswith(".yaml"):
                    repos.append(root.split("/")[-2] + '/' + f.split(".yaml")[0])
                else:
                    continue
    if len(repos) == 0:
        content["repositories"] = [{"repo": ["example/repos1", "example/repos2"], "committers": [{"gitee_id": "--xxx--", "name": "TO_BE_CLARIFIED", "organization": "TO_BE_CLARIFIED", "email": "TO_BE_CLARIFIED"}],
                                    "contributors": [{"gitee_id": "--xxx--", "name": "TO_BE_CLARIFIED", "organization": "TO_BE_CLARIFIED", "email": "TO_BE_CLARIFIED"}],}, {"repo": ["example/repos1", "example/repos2"],}, ]
    else:
        content["repositories"] = [{"repo": repos, "committers": [{"gitee_id": "--xxx--", "name": "TO_BE_CLARIFIED", "organization": "TO_BE_CLARIFIED", "email": "TO_BE_CLARIFIED"}],
                                    "contributors": [{"gitee_id": "--xxx--", "name": "TO_BE_CLARIFIED", "organization": "TO_BE_CLARIFIED", "email": "TO_BE_CLARIFIED"}], }]
    write_yaml_to_sig(sig_path, content)


def decode_owners(owners_path):
    if os.path.exists(owners_path):
        c = load_yaml(owners_path)
        return c["maintainers"]
    else:
        return []


def write_yaml_to_sig(dst_path, data):
    file_path = os.path.join(dst_path, "sig-info.yaml")
    with open(file_path, 'w', encoding="utf-8") as f:
        yaml.dump(data, f, Dumper=yaml.Dumper, sort_keys=False)


if __name__ == '__main__':
    """
    Tool to help creating and filling sig-info.yaml, by leveraging existing information. 
    """
    par = argparse.ArgumentParser()
    par.add_argument("community", type=str, help="Local path of community repository")
    par.add_argument("-s", "--sig", type=str, help="Name of SIG (for exampke, ai)")

    args = par.parse_args()

    sig_dir = os.path.join(args.community, "sig")
    os.chdir(sig_dir)
    s_path, o_path = get_sig_owners_path(args.sig)
    make_template_file_data_and_write(args.sig, s_path, o_path)