from Database.FileDatabase import FileDatabase
from ConfigParser import ConfigParser
import Report
import os, datetime, syslog
import email, smtplib
from email.MIMEText import MIMEText

class ReportMonitor:
    """
    Monitor for a report
    """

    def __init__(self, id):
        self.id = id
        config = ConfigParser()
        try:
            config.read(['/etc/praksys/reportmonitor/reportmonitor.conf'])
        except:
            syslog.syslog("Failed to load config")
            raise

        try:
            report_type = config.get(id, 'reporttype')
        except:
            syslog.syslog("Error parsing config file for id %s" % id)
            raise

        try:
            self.alert_email = config.get(id, 'alertemail')
        except:
            syslog.syslog("Error getting alert email for id %s" % id)
            raise

        try:
            report_module = getattr(Report, report_type)
        except:
            syslog.syslog("Unknown module %s" % report_type)
            raise
            
        try:
            report_class =  getattr(report_module, '%s' % report_type)
            self.report = report_class
        except:
            syslog.syslog("Unknown report type %s" % report_type)
            raise

        try:
            frequency = config.get(id, 'frequency').lower()
        except:
            syslog.syslog("Report frequency is not specified in config file")
            raise
        if frequency == 'daily':
            self.frequency = datetime.timedelta(1)
        elif frequency == 'weekly':
            self.frequency = datetime.timedelta(7)
        elif frequency == 'hourly':
            self.frequency = datetime.timedelta(0,3600)
        elif frequency == 'monthly':
            self.frequency = datetime.timedelta(30)
        else:
            syslog.syslog("Unkown frequency : %s" % frequency)
            raise ValueError

        self.database = FileDatabase()

    def addReport(self, date, subject, content):
        # instantiate a new report object
        report = self.report(self.id, date, subject, content)
        # check report
        report.check()
        # add report to database
        self.database.addReport(report)
        
    def getReports(self):
        return self.database.getReports(self.id)
    
    def check(self):
        """
        Check that :
        1- an email was received from id according to its frequency
        2- last email level is not above LEVEL_OK
        """
        result = ""
        # get last message
        report = self.database.getLastReport(self.id)

        if report is None:
            result += "Database not found for %s\n" % self.id
            return result

        # check message was received
        if report.date + self.frequency < datetime.datetime.now() :
            result += "No report since %s\n" % report.date

        if report.level > report.LEVEL_OK :
            result += "Last report level is %s\n" % report.level
            
        return result
    
    def sendAlert(self, content):
        """
        Send alert email
        """
        msg = MIMEText(content)
        msg['Subject'] = '[%s] Mail-Monitor Alert' % self.id
        msg['From'] = 'monitor@praksys.org'
        msg['To'] = self.alert_email
        smtp = smtplib.SMTP('praksys.org')
        smtp.sendmail(msg['From'], msg['To'], msg.as_string())
        smtp.close()

