# pylint: disable=missing-module-docstring,invalid-name
#

import time
import traceback
from rhn.stringutils import ustr, sstr
from up2date_client import config


class Log:
    """
    attempt to log all interesting stuff, namely, anything that hits
    the network any error messages, package installs, etc
    """  # " emacs sucks

    def __init__(self):
        self.app = "up2date"
        self.cfg = config.initUp2dateConfig()
        self.log_info = ""

    def set_app_name(self, name):
        self.app = str(name)

    def log_debug(self, *args):
        if self.cfg["debug"] > 1:
            self.log_me("D: ", *args)

    def log_me(self, *args):
        """General logging function.
        Eg: log_me("I am a banana.")

        """
        # pylint: disable-next=consider-using-f-string
        self.log_info = "[%s] %s" % (time.ctime(time.time()), self.app)
        s = ""
        for i in args:
            # we really need unicode(str(i)) here, because i can be anything
            # from string or int to list, dict or even class
            i = ustr(str(i))
            s += i
        if self.cfg["debug"] > 1:
            print(s)
        self.write_log(s)

    def trace_me(self):
        # pylint: disable-next=consider-using-f-string
        self.log_info = "[%s] %s" % (time.ctime(time.time()), self.app)
        x = traceback.extract_stack()
        msg = "".join(traceback.format_list(x))
        self.write_log(msg)

    def log_exception(self, logtype, value, tb):
        # pylint: disable-next=consider-using-f-string
        self.log_info = "[%s] %s" % (time.ctime(time.time()), self.app)
        output = ["\n"]  # Accumulate the strings in a list
        output.append("Traceback (most recent call last):\n")
        output = output + traceback.format_list(traceback.extract_tb(tb))
        # pylint: disable-next=consider-using-f-string
        output.append("%s: %s\n" % (logtype, value))
        self.write_log("".join(output))

    def write_log(self, s):

        log_name = self.cfg["logFile"] or "/var/log/up2date"
        # pylint: disable-next=unspecified-encoding
        log_file = open(log_name, "a")
        # pylint: disable-next=consider-using-f-string
        msg = "%s %s\n" % (ustr(self.log_info), ustr(s))
        log_file.write(sstr(msg))
        log_file.flush()
        log_file.close()


# pylint: disable-next=invalid-name
def initLog():
    # pylint: disable-next=global-variable-undefined
    global log
    try:
        # pylint: disable-next=self-assigning-variable
        log = log
    except NameError:
        log = None

    # pylint: disable-next=singleton-comparison
    if log == None:
        log = Log()

    return log
