# -*- coding: utf-8 -*-

"""

Usage : 

from lib.logmanager import LogManager,LOG_ARGVAL,LOG_INFO,LOG_INFOSETTING,LOG_WARNING,LOG_ERROR,LOG_DEBUG,LOG_FATAL
       
log = LogManager("main.log.txt")
log.logMessage( LOG_INFO , 'app start ...')  

"""

import sys
import datetime 
import locale
import os
import os.path
import inspect
               
Log = None

LOG_ARGVAL = 0
LOG_INFO = 1
LOG_INFOSETTING = 2
LOG_WARNING = 3
LOG_ERROR = 4
LOG_DEBUG = 5

LOG_FATAL = 9

      
class LogManager() :

    def __init__(self, filelog, eraseContent = False, logConsole="1", maxLevelStr="LOG_DEBUG" ) :

        pathlog = filelog
        pathlog = pathlog.replace("\\", os.sep)
   
        self.filelog = pathlog
        self.filelogCopyName = None      
        originalStdout = sys.stdout
        if logConsole == "1" :
            self.outToconsole = True
        else :
            self.outToconsole = False
        
        self.maxLevel = self.getLevelValue(maxLevelStr)

        try:                    
            callerframerecord = inspect.stack()[1]    # 0 represents this line, # 1 represents line at caller
            frame = callerframerecord[0]
            context = inspect.getframeinfo(frame)  
                        
            if eraseContent is True :
                sys.stdout = open(self.filelog, 'w')
                self.outLineMessage( LOG_INFO, 'init log file (erase): ' + self.filelog , context )                 
            else :
                sys.stdout = open(self.filelog, 'a')
                #self.outLineMessage( LOG_INFO, 'init log file (append) : ' + self.filelog , context )                 
                            
            sys.stdout = originalStdout
            
        except IOError:
            sys.exit( 'Unable to write to file ' + filelog )
        
        #self.logMessage( LOG_INFO, "self.filelog = " + self.filelog  ) 
          
    def getLevelValue( self, strLevel) :

        if  strLevel == "LOG_ARGVAL" :
            return 0
        elif strLevel == "LOG_INFO" :
            return 1
        elif  strLevel == "INFOSETTING" :
            return 2
        elif  strLevel == "LOG_WARNING" :
            return 3
        elif  strLevel == "LOG_ERROR" :
            return 4
        elif  strLevel == "LOG_DEBUG" :
            return 5
        elif  strLevel == "LOG_FATAL" :
            return 9

        return 0

    def logMessage(self, level, message) :

        if level > self.maxLevel and level != LOG_FATAL :
            #print(message)
            return
        
        originalStdout = sys.stdout
        
        sys.stdout = open(self.filelog, 'a+')
    
        callerframerecord = inspect.stack()[1]    # 0 represents this line, # 1 represents line at caller
        frame = callerframerecord[0]
        context = inspect.getframeinfo(frame)    
    
        self.outLineMessage( level, message, context ) 

        sys.stdout = originalStdout
        
        if self.outToconsole is True :
            self.outLineMessage( level, message, context ) 

        if  level == LOG_FATAL :
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Critical)
            msg.setText(message)
            msg.setInformativeText( os.path.basename(context.filename) + ':' + context.function + ':' + str(context.lineno) )
            msg.setWindowTitle("Erreur")
            msg.exec_()
            sys.exit(-1)

    def outLineMessage( self, level, message , context) :

        now = datetime.datetime.now()
        
        levelStr = ""
        if level == LOG_INFO :
            levelStr = "INFO"
        elif  level == LOG_ARGVAL :
            levelStr = "ARG"
        elif  level == LOG_DEBUG :
            levelStr = "DEBUG"
        elif  level == LOG_FATAL :
            levelStr = "FATAL"
        elif  level == LOG_WARNING :
            levelStr = "WARNING"
        elif  level == LOG_ERROR :
            levelStr = "ERREUR"
        elif  level == INFOSETTING :
            levelStr = "LOG_SETTING"
        
        print(now.strftime("%d-%m-%Y %H:%M:%S.%f") + ';' + levelStr + ';' + os.path.basename(context.filename) + ':' + context.function + ':' + str(context.lineno) + ';' + message)


    def copy( self) :
        
        import time
        import os
        import shutil

        datetime_var = time.strftime("%Y_%m_%d_%H_%M_%S")
        
        src_dir = os.path.dirname(self.filelog) 
        base=os.path.basename(self.filelog)
        src_base = os.path.splitext(base)[0]        

        """
        print ("self.filelog=" + self.filelog)
        print ("src_dir=" + src_dir)
        print ("base=" + base)
        print ("src_base=" + src_base)
        """

        dst_file = src_dir + os.sep + src_base + "_" + str(datetime_var) + ".txt"

        file_path = dst_file.split(os.path.basename(dst_file))[0]
        if not os.path.exists(file_path):
            os.makedirs(file_path)

        dst_file = dst_file.replace('\\', os.sep)
        shutil.copy2(self.filelog, dst_file)        
        
        self.filelogCopyName = dst_file
        
  
    def getFilelogCopyName( self) :
        return self.filelogCopyName

