#!/usr/bin/env python3

import shelve
from email.mime.text import MIMEText
from getpass import getuser
from os.path import abspath, dirname, expanduser, join
from smtplib import SMTP

from ldap3 import Connection

SHELF = expanduser('~/.cache/gepetto_newcomers')


def get_gepetto():
    """
    Get the old list of Gepetto members
    """
    with shelve.open(SHELF) as shelf:
        gepetto = shelf['gepetto'] if 'gepetto' in shelf else []
    return gepetto


def whoami(gepetto):
    """
    Returns the LAAS username of the current user.
    The mail will be sent from this account
    """
    with shelve.open(SHELF) as shelf:
        me = shelf['me'] if 'me' in shelf else getuser()

    while me not in gepetto:
        print("You (%s) dont's seem to be in the Gepetto group… What's your LAAS username ?" % me)
        me = input('--> ')

    # remember this in the cache
    with shelve.open(SHELF) as shelf:
        shelf['me'] = me

    return me


def greet(to, sender):
    """
    Send a greeting email to `to`
    """
    if '@' not in sender:
        sender = '%s@laas.fr' % sender

    if '@' not in to:
        to = '%s@laas.fr' % to

    with open(join(dirname(abspath(__file__)), 'template.txt')) as f:
        msg = MIMEText(f.read())

    msg['Subject'] = 'Welcome in Gepetto !'
    msg['From'] = sender
    msg['To'] = to
    msg['Bcc'] = sender
    s = SMTP('localhost')
    s.send_message(msg)
    s.quit()


def get_gepetto_ldap():
    """
    Get a new list of Gepetto members in the LDAP of the LAAS
    """
    conn = Connection('ldap.laas.fr', auto_bind=True)
    conn.search('dc=laas,dc=fr', '(o=gepetto)', attributes=['uid'])
    return [str(entry.uid) for entry in conn.entries]


if __name__ == '__main__':
    # Get old and new list of members
    gepetto = get_gepetto()
    gepetto_ldap = get_gepetto_ldap()

    # On the first run, old list is empty, so we just set it to the new one
    if not gepetto:
        gepetto = gepetto_ldap

    # Retrieve the login of the current user, who must already be a member
    me = whoami(gepetto)

    for guy in gepetto_ldap:
        if guy not in gepetto:
            greet(guy, me)

    # Save the new list
    with shelve.open(SHELF) as shelf:
        shelf['gepetto'] = gepetto_ldap