import os
import sys
import yaml
import re

# disallow python2 as the output will not be correct
if sys.version_info.major != 3:
    sys.stderr.write('python2 no longer supported\n')
    sys.exit(1)


def _all_hosts():
    return list(filter(lambda fn: '.' in fn and not fn.startswith('.') and os.path.isdir(fn), os.listdir(".")))


def _load_db():
    rules_file = "cosmos-rules.yaml"
    if not os.path.exists(rules_file):
        sys.stderr.write('%s not found'.format(rules_file))
        sys.exit(1)

    with open(rules_file) as fd:
        rules = yaml.load(fd, Loader=yaml.SafeLoader)

    all_hosts = _all_hosts()

    members = dict()
    for node_name in all_hosts:
        for reg, cls in rules.items():
            if re.match(reg, node_name):
                for cls_name in cls.keys():
                    h = members.get(cls_name, [])
                    h.append(node_name)
                    members[cls_name] = h
    members['all'] = all_hosts

    classes = dict()
    for node_name in all_hosts:
        node_classes = dict()
        for reg, cls in rules.items():
            if re.match(reg, node_name):
                node_classes.update(cls)
        classes[node_name] = node_classes

    # Sort member lists for a more easy to read diff
    for cls in members.keys():
        members[cls].sort()

    return dict(classes=classes, members=members)


_db = None


def cosmos_db():
    global _db
    if _db is None:
        _db = _load_db()
    return _db


if __name__ == '__main__':
    print(yaml.dump(cosmos_db(), default_flow_style=None))