#!/usr/bin/python3

import ldap
from os import scandir

HOME = '/home'
BASE  = 'ou=schueler,ou=Benutzer,ou=fvs,ou=SCHULEN,o=ml3'
#BASE  = 'ou=Benutzer,ou=fvs,ou=SCHULEN,o=ml3'
LDAP = 'ldap://ldap.steinbeisschule-reutlingen.de'

def fetch_ou(uid):
    l = ldap.initialize(LDAP)
    f = '(uid=' + uid + ')'
    try:
        return l.search_s(BASE,ldap.SCOPE_SUBTREE,f,['ou'])[0][1]['ou'][0].decode('utf-8')
    except:
        return None

def fetch_uids(crs):
    uids = []
    l = ldap.initialize(LDAP)
    #    if 'Abgang' in crs:
    #        b = 'ou=Abgang,' + BASE
    #    else:
    #        b = 'ou=' + crs + ',' + BASE
    b = BASE
    r = l.search_s(b,ldap.SCOPE_SUBTREE,'(ou=' + crs + ')',['uid'])
    for dn,entry in r:
        if entry != {}:
            uids.append(entry['uid'][0].decode('utf-8'))
    return uids

def assign_course(user, crs_uids, home):
    c = fetch_ou(user)
    print('Needed to fetch new course', c, 'for', user)
    if c:
        crs_uids[c] = fetch_uids(c)
        home[user] = c
    else:
        print('No course for', user , 'found!')


if __name__ == '__main__':
    home = {}
    with scandir(HOME) as it:
        for entry in it:
            if entry.is_dir() and entry.name != 'lost+found':
                home[entry.name] = ''

    crs_uids = {}
    for user in home:
        if crs_uids == {}:
            assign_course(user, crs_uids, home)
            continue
        for k in crs_uids.keys():
            if user in crs_uids[k]:
                home[user] = k
                break
        else:
            assign_course(user, crs_uids, home)

    for usr in home:
        print(usr, home[usr])


    for crs in crs_uids.keys():
        print(usr, home[usr])

    for k, v in sorted(crs_uids.items()):
        print(k, sorted(v))
        for item in sorted(v):
            try:
                print(item, home[item])
            except:
                print('No home for', item, 'found.')