# -*- mode: python -*-
# -*- coding: utf-8 -*-

import os
import time
import traceback
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header

from flask import g, current_app

"""Simple & stupid file logguer, used only to debug
   (logging to SQL is done in scolog)
"""

LOG_FILENAME = "notes.log"  # empty to disable logging
DEFAULT_LOG_DIR = "/tmp"  # clients should call set_log_directory to change this

ALARM_DESTINATION = "emmanuel.viennet@gmail.com"  # XXX a mettre en preference


class _logguer(object):
    def __init__(self):
        self.file = None
        self.directory = None
        self.set_log_directory(DEFAULT_LOG_DIR)

    def set_log_directory(self, directory):
        if self.directory != directory and self.file:
            # changing directory when a log is already open: close it
            self.file.close()
            self.file = None
        self.directory = directory

    def _open(self):
        if LOG_FILENAME:
            path = os.path.join(self.directory, LOG_FILENAME)
            self.file = open(path, "a")
            self("new _logguer (%s)" % path)
        else:
            self.file = None  # logging disabled

    def __call__(self, msg):
        if not self.file:
            self._open()
        if self.file:
            try:
                dept = getattr(g, "scodoc_dept", "")
            except RuntimeError:
                # Flask Working outside of application context.
                dept = ""
            if dept:
                dept = " (%s)" % dept
            msg = dept + " " + msg
            self.file.write("[%s]%s\n" % (time.strftime("%a %b %d %H:%M:%S %Y"), msg))
            if current_app:
                current_app.logger.info(msg)

            self.file.flush()


log = _logguer()


# Alarms by email:
def sendAlarm(context, subj, txt):
    from . import sco_utils
    from . import sco_emails
    from . import sco_preferences

    msg = MIMEMultipart()
    subj = Header(subj, sco_utils.SCO_ENCODING)
    msg["Subject"] = subj
    msg["From"] = sco_preferences.get_preference("email_from_addr")
    msg["To"] = ALARM_DESTINATION
    msg.epilogue = ""
    txt = MIMEText(txt, "plain", sco_utils.SCO_ENCODING)
    msg.attach(txt)
    sco_emails.sendEmail(context, msg)


# Debug: log call stack
def logCallStack():
    log("Call stack:\n" + "\n".join(x.strip() for x in traceback.format_stack()[:-1]))