"""Logger module: contains the logger class which creates and writes
   data to log files on disk"""

import sys
import time
import math

class Logger:
    def __init__(self, fileName="log"):
        """
        Logger constructor
        """
        self.__timeStamp = 1
        self.__startTime = 0.0
        self.__logFile = None
        self.__logFileName = fileName

    def setTimeStamp(self, bool):
        """
        Toggle time stamp printing with log entries on and off
        """
        self.__timeStamp = bool

    def getTimeStamp(self):
        """
        Return whether or not we are printing time stamps with log entries
        """
        return(self.__timeStamp)


    # logging control

    def resetStartTime(self):
        """
        Reset the start time of the log file for time stamps
        """
        self.__startTime = time.time()

    def log(self, entryString):
        """log(self, string)
        Print the given string to the log file"""
        if (self.__logFile == None):
            self.__openLogFile()
        if (self.__timeStamp):
            self.__logFile.write(self.__getTimeStamp())
        self.__logFile.write(entryString + '\n')


    # logging functions

    def __openLogFile(self):
        """
        Open a file for logging error/warning messages
        """
        self.resetStartTime()
        t = time.localtime(self.__startTime)
        st = time.strftime("%m-%d-%Y-%H-%M-%S", t)
        logFileName = self.__logFileName + "." + st
        self.__logFile = open(logFileName, "w")

    def __closeLogFile(self):
        """
        Close the error/warning output file
        """
        if (self.__logFile != None):
            self.__logFile.close()

    def __getTimeStamp(self):
        """
        Return the offset between current time and log file startTime
        """
        t = time.time()
        dt = t - self.__startTime
        if (dt >= 86400):
            days = int(math.floor(dt/86400))
            dt = dt%86400
        else:
            days = 0
        if (dt >= 3600):
            hours = int(math.floor(dt/3600))
            dt = dt%3600
        else:
            hours = 0
        if (dt >= 60):
            minutes = int(math.floor(dt/60))
            dt = dt%60
        else:
            minutes = 0
        seconds = int(math.ceil(dt))
        return("%02d:%02d:%02d:%02d: " % (days, hours, minutes, seconds))