import simplejson
import logging


class ExceptionLogger:
    logger = None
    error_data = None
    job_result = None

    def __init__(self):
        self.logger = logging.getLogger("AuraEngine")

    # ------------------------------------------------------------------------------------------ #
    def __get_error__(self, job, errornumber, data):
        """
        Privat: Ermittelt Fehlermeldung, Job-Name (Klassenmethode) und Fehlercode für den Job aus error/controller_error.js
        @type errornumber:  string
        @param errornumber: Die interne Fehlernummer der aufrufenden Methode
        """

        if data is None:
            data = {}
        if type(data) == type(str()):
            data = simplejson.loads(data)

        has_data = isinstance(data, (dict)) and len(data) > 0

        if job in self.error_data:
            err_msg = self.error_data[job][errornumber]
            err_id = self.error_data[job]['id'] + str(errornumber)
            if has_data:
                for key in data.keys():
                    err_msg = err_msg.replace('::' + key + '::', str(data[key]))
            data['message'] = err_msg
            data['job'] = job
            data['code'] = err_id

        return data

    # ------------------------------------------------------------------------------------------ #
    def success(self, job, data=None, errnum='00', value=''):
        """
        Erfolgsmeldung loggen
        @type errnum:    string
        @param errnum:   Errornummer der aufrufenden Funktion
        @type value:     string
        @param value:    Optionaler Wert
        @type section:   string
        @param section:  Gültigkeitsbereich
        """
        error = self.__get_error__(job, errnum, data)
        self.job_result = {'message': error['message'],
                           'code': error['code'],
                           'success': 'success',
                           'job': error['job'],
                           'value': value}
        self.logger.debug(job + " successfully done " + str(self.job_result))

    # ------------------------------------------------------------------------------------------ #
    def info(self, job, data=None, errnum='01', value=''):
        """
        Info loggen
        @type errnum:    string
        @param errnum:   Errornummer der aufrufenden Funktion
        @type value:     string
        @param value:    Optionaler Wert
        @type section:   string
        @param section:  Gültigkeitsbereich
        """
        error = self.__get_error__(job, errnum, data)
        self.job_result = {'message': error['message'],
                           'code': error['code'],
                           'success': 'info',
                           'job': error['job'],
                           'value': value}
        self.logger.info(str(self.job_result))


    # ------------------------------------------------------------------------------------------ #
    def warning(self, job, data=None, errnum='01', value=''):
        """
        Warnung loggen
        @type errnum:    string
        @param errnum:   Errornummer der aufrufenden Funktion
        @type value:     string
        @param value:    Optionaler Wert
        """
        error = self.__get_error__(job, errnum, data)
        self.job_result = {'message': error['message'],
                           'code': error['code'],
                           'success': 'warning',
                           'job': error['job'],
                           'value': value}
        self.logger.warning(str(self.job_result))

    # ------------------------------------------------------------------------------------------ #
    def error(self, job, data=None, errnum='01', value=''):
        """
        Error loggen
        @type errnum:    string
        @param errnum:   Errornummer der aufrufenden Funktion
        @type value:     string
        @param value:    Optionaler Wert
        """
        error = self.__get_error__(job, errnum, data)
        self.job_result = {'message': error['message'],
                           'code': error['code'],
                           'success': 'error',
                           'job': error['job'],
                           'value': value}
        self.logger.error(str(self.job_result))

    # ------------------------------------------------------------------------------------------ #
    def fatal(self, job, data=None, errnum='01', value='', section='execjob'):
        """
        Fatal error loggen
        @type errnum:    string
        @param errnum:   Errornummer der aufrufenden Funktion
        @type value:     string
        @param value:    Optionaler Wert
        @type section:   string
        @param section:  Gültigkeitsbereich
        """
        error = self.__get_error__(job, errnum, data)
        self.job_result = {'message': error['message'],
                           'code': error['code'],
                           'success': 'fatal',
                           'job': error['job'],
                           'value': value,
                           'section': section}
        self.logger.critical(str(self.job_result))