#!/bin/bash /usr/scripts/python.sh
# -*- coding: utf-8 -*-
"""Envoi de mail automatique pour signaler la fin d'impression à un
adhérent. Le script se connecte à l'interface d'impression pour récupérer
la liste des dernières tâches imprimées.
Ce script est lancé par un cron toutes les dix minutes sur zamok. Pour éviter
de notifier plusieurs fois de la même fin d'impression, on ne balaie dans
la liste que le dernier intervalle (bornes entières) de dix minutes

detraz@crans.org
"""

import BeautifulSoup
import sys
import requests
import re
import datetime
import time

from gestion import mail
from utils.sendmail import actually_sendmail
from lc_ldap import shortcuts
import impression.digicode as digicode

URL_JOBLIST = 'https://imprimante.adm.crans.org/hp/device/JobLogReport/Index'
CA = '/etc/ssl/certs/cacert.org.pem'

RE_JOB_NAME = re.compile('JobLogName_')
RE_JOB_STATUS = re.compile('JobLogStatus_')
RE_JOB_DATE = re.compile('JobLogDate_')

try:
    req = requests.get(URL_JOBLIST, verify=CA)
except requests.exceptions.ConnectionError:
    print '''L'imprimante est injoignable. Une intervention manuelle peut être nécessaire
--
Le script de notification d'impressions'''
    exit(1)

if req.status_code!=200:
    print '''L'imprimante est injoignable. Une intervention manuelle peut être nécessaire
--
Le script de notification d'impressions'''
    exit(1)

doc = BeautifulSoup.BeautifulSoup(req.text)
con = shortcuts.lc_ldap_readonly()

jobs = doc.findAll(attrs={'class': 'PrintJobTicket'})

VERB=False

# Dernier intervalle de dix minutes, en bornes entières, qui vient de se
# terminer
now = datetime.datetime.now()
if sys.argv[1:]:
    now = datetime.datetime.strptime(sys.argv[1], '%d/%m/%Y %H:%M:%S')
    VERB=True
    print "Overridden date: %s" % str(now)
fin = now.replace(second=0, minute=(now.minute/10)*10, microsecond=0)
debut = fin - datetime.timedelta(minutes=10)

success=dict()
echecs=dict()
for job in jobs:
    # Fin de parsing
    uid = job.find(attrs={'id': RE_JOB_NAME}).text
    status = job.find(attrs={'id': RE_JOB_STATUS}).text
    date = job.find(attrs={'id': RE_JOB_DATE}).text
    date = datetime.datetime.strptime(date, '%Y/%m/%d %H:%M:%S')

    # Hors intervalle: on drope
    if date < debut or date >= fin:
        continue
    split = uid.split(u':')
    if status != "Success":
        # Préviens les imprimeurs si une impression a échoué,
    # pas de fioritures ici, boucle assez basique
        if len(split) < 3:
            name = u'Impression à la main'
            task = uid
            if name not in echecs:
                echecs[name] = {'task': []}
            echecs[name]['task'].append(task)
        else:
            nb = split[0]
            name = split[1]
            task = u':'.join(split[2:])
            if name not in echecs:
                echecs[name] = {'task': []}
            echecs[name]['task'].append(task)

    if status != "Success":
        continue
    # Dans le cas d'un success,
    if len(split) < 3:
        continue
    # Boucle qui s'exécute normalement si la typographie dans
    # les logs d'impression est repectée (:) (sinon c'est un
    # impression manuel donc drop)
    nb = split[0]
    name = split[1]
    task = u':'.join(split[2:])
    if name not in success:
        success[name] = {'task': []}
    success[name]['task'].append(task)

From = 'impression@crans.org'
e = 0
a = 0

for name in success:
    ad = con.search(u'(uid=%s)' % name)
    if ad <> []:
        a = a + 1
        adh = ad[0]
        To = name + u'@crans.org'
        try:
            tname = unicode(adh['prenom'][0]) + " " + unicode(adh['nom'][0])
        # Pour les clubs
        except KeyError:
            tname = unicode(name)
        codes = [x[0] + u'#' for x in digicode.list_code(name)]
        if not codes:
            codes = [digicode.gen_code(name) + u'#']
        if VERB:
            print (u"Envoi du mail à %s" % To)
        mailtxt=mail.generate('mail_impression_ok', {
            'To': To,
            'From': From,
            'tname': tname,
            'taches': u', '.join(success[name]['task']),
            'codes': u', '.join(codes)
        })
        if VERB:
            print mailtxt.as_string()
        actually_sendmail(From, (To,), mailtxt)
    else:
        e = e+1

for name in echecs:
    ad = con.search(u'(uid=%s)' % name)
    To = 'impression@lists.crans.org'
    if ad <> []:
        adh = ad[0]
        try:
            tname = unicode(adh['prenom'][0]) + " " + unicode(adh['nom'][0])
        except KeyError:
            tname = unicode(name)
    else:
        tname = name
    mailtxt=mail.generate('mail_impression_ratee', {
        'To': To,
        'From': From,
        'tname': tname,
        'taches': u', '.join(echecs[name]['task']),
    })
    if VERB:
        print mailtxt.as_string()
    actually_sendmail(From, (To,), mailtxt)



if e>0:
    print "Des problèmes sont survenus entre %s et %s" % (debut, fin)
    print "Nombre total de mails envoyés :"
    print a
    print "Nombre de mails non envoyés faute de résultats LDAP :"
    print e
