import datetime as dt
from Stephanie.Modules.base_module import BaseModule


class SystemModule(BaseModule):
    def __init__(self, *args):
        super(SystemModule, self).__init__(*args)
        self.name = self.get_configuration(section="USER", key="name")
        self.gender = self.get_configuration(section="USER", key="gender")

    def default(self):
        return "Repeat back your command!."

    def meaning_of_life(self):
        return "42 is the meaning of life."

    def time_right_now(self):
        t = dt.datetime.now()
        return self.time_teller(t)

    def date_today(self):
        t = dt.datetime.now()
        return self.date_teller(t)

    def wake_up(self):
        t = dt.datetime.now()
        if self.gender:
            gender = self.gender.lower()
            if gender == "male":
                return "%s, sir!" % self.phase_of_the_day(t)
            elif gender == "female":
                return "%s, sir!" % self.phase_of_the_day(t)
            else:
                return "%s, sir!" % self.phase_of_the_day(t)
        elif self.name:
            return "%s, %s!" % (self.phase_of_the_day(t), self.name)
        else:
            return "%s!" % self.phase_of_the_day(t)
    # Example to access assistant instance
    # def wake_up(self):
    #     self.assistant.say("What time is it again?")
    #     text = self.assistant.listen().decipher()
    #     return "Good %s, sir!" % text

    def go_to_sleep(self):
        self.assistant.events.add("sleep").trigger("sleep")
        return "Sleep for the weak!"

    def quit(self):
        self.assistant.events.add("quit").trigger("quit")
        return "I will come back stronger!"

    def tell_system_status(self):
        import psutil
        import platform
        import datetime

        os, name, version, _, _, _ = platform.uname()
        version = version.split('-')[0]
        cores = psutil.cpu_count()
        cpu_percent = psutil.cpu_percent()
        memory_percent = psutil.virtual_memory()[2]
        disk_percent = psutil.disk_usage('/')[3]
        boot_time = datetime.datetime.fromtimestamp(psutil.boot_time())
        running_since = boot_time.strftime("%A %d. %B %Y")
        response = "I am currently running on %s version %s.  " % (os, version)
        response += "This system is named %s and has %s CPU cores.  " % (name, cores)
        response += "Current disk_percent is %s percent.  " % disk_percent
        response += "Current CPU utilization is %s percent.  " % cpu_percent
        response += "Current memory utilization is %s percent. " % memory_percent
        response += "it's running since %s." % running_since
        return response

    @staticmethod
    def time_teller(time):
        # t = time.strftime('%I %M %H')
        # phase = time.strftime("%p")
        t = time.strftime("%I:%M:%p")

        d = {0: "oh",
             1: "one",
             2: "two",
             3: "three",
             4: "four",
             5: "five",
             6: "six",
             7: "seven",
             8: "eight",
             9: "nine",
             10: "ten",
             11: "eleven",
             12: "twelve",
             13: "thirteen",
             14: "fourteen",
             15: "fifteen",
             16: "sixteen",
             17: "seventeen",
             18: "eighteen",
             19: "nineteen",
             20: "twenty",
             30: "thirty",
             40: "forty",
             50: "fifty",
             60: "sixty"}

        time_array = t.split(":")
        hour, minute, phase = int(time_array[0]), int(time_array[1]), time_array[2]
        # hour = d[hour]
        # minute = d[minute]

        return "The time is %s %s %s" % (hour, minute, phase)
        #
        # hour = d[int(t[0:2])] if t[0:2] != "00" else d[12]
        # # suffix = 'a.m.' if d[int(t[7:9])] == hour else 'p.m.'
        # suffix = phase
        #
        # if t[3] == "0":
        #     if t[4] == "0":
        #         minute = ""
        #     else:
        #         minute = d[0] + " " + d[int(t[4])]
        # else:
        #     minute = d[int(t[3]) * 10] + '-' + d[int(t[4])]
        # return 'The time is %s %s %s.' % (hour, minute, suffix)

    @staticmethod
    def date_teller(date):
        return date.strftime("It's %A, %d %B %Y today!")

    @staticmethod
    def phase_of_the_day(time):
        hour = time.hour
        if hour < 12:
            return 'Good Morning'
        elif 12 <= hour < 18:
            return 'Good Afternoon'
        if hour > 6:
            return 'Good Evening'