import os
import time
import threading
from PIL import Image, ImageSequence
from PIL import ImageFont, ImageDraw
from luma.core.interface.serial import i2c
from luma.core.render import canvas
from luma.oled.device import ssd1306

serial_64 = i2c(port=1, address=0x3D)
device_64 = ssd1306(serial_64, width=128, height=64)
serial_32 = i2c(port=1, address=0x3C)
device_32 = ssd1306(serial_32, width=128, height=32)

# Return CPU temperature as a character string
def getCPUtemperature():
    res = os.popen('vcgencmd measure_temp').readline()
    return(res.replace("temp=","").replace("'C\n",""))

# Return RAM information (unit=kb) in a list
# Index 0: total RAM
# Index 1: used RAM
# Index 2: free RAM
def getRAMinfo():
    p = os.popen('free')
    i = 0
    while 1:
        i = i + 1
        line = p.readline()
        if i==2:
            return(line.split()[1:4])

# Return % of CPU used by user as a character string
def getCPUuse():
    return(str(os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip()))

# Return information about disk space as a list (unit included)
# Index 0: total disk space
# Index 1: used disk space
# Index 2: remaining disk space
# Index 3: percentage of disk used
def getDiskSpace():
    p = os.popen("df -h /")
    i = 0
    while 1:
        i = i +1
        line = p.readline()
        if i==2:
            return(line.split()[1:5])

def draw_text(text, width, height, fontsize):
    font = ImageFont.truetype("arial.ttf", fontsize)
    with canvas(device_32) as draw:
        draw.rectangle(device_32.bounding_box, outline="white", fill="black")
        # Calculate the width of the text using textlength() instead of textsize()
        w = font.getlength(text)
        # Calculate the height of the text by subtracting the font descent from the font ascent
        ascent, descent = font.getmetrics()
        h = ascent - descent
        # Calculate the position of the text
        x = (width - w) // 2
        y = (height - h) // 2
        # Draw the text using the new width and height values
        draw.text((10, 1), text, font=font, fill="white")



def image_gif():
        # Open a GIF file and create an Image object for each frame
    frames = []
    with Image.open("./bad_apple_128x64.gif") as img:
        for frame in ImageSequence.Iterator(img):
            frames.append(frame.convert("1").resize((128,64)))

    while True:
    # Display each image with an idea
        for frame in frames:
            device_64.display(frame)
            time.sleep(0.01)

# def computer_resources(flag):
#     while not flag.is_set():
#         # CPU informatiom
#         CPU_use = getCPUuse()
#         CPU_tmp = getCPUtemperature()
#         # RAM information
#         # Output is in kb, here I convert it in Mb for readability
#         RAM_stats = getRAMinfo()
#         RAM_total = round(int(RAM_stats[0]) / 1000,1)
#         RAM_used = round(int(RAM_stats[1]) / 1000,1)
#         RAM_free = round(int(RAM_stats[2]) / 1000,1)

#         # Disk information
#         DISK_stats = getDiskSpace()
#         DISK_total = DISK_stats[0]
#         DISK_used = DISK_stats[1]
#         DISK_perc = DISK_stats[3]
#         #
#         status_text = "CPU_use:  "+CPU_use+"\nCPU_tmp:  "+CPU_tmp

#         draw_text(status_text, device_32.width, device_32.height, 12)

def computer_resources():
    # Show some text and wait for 2 seconds
    draw_text("www.spotpear.cn\nwww.spotpear.com\n", device_32.width, device_32.height, 12)
    time.sleep(2)
    while True:
        CPU_use = getCPUuse()
        CPU_tmp = getCPUtemperature()
        # RAM information
        # Output is in kb, here I convert it in Mb for readability
        RAM_stats = getRAMinfo()
        RAM_total = round(int(RAM_stats[0]) / 1000,1)
        RAM_used = round(int(RAM_stats[1]) / 1000,1)
        RAM_free = round(int(RAM_stats[2]) / 1000,1)

        # Disk information
        DISK_stats = getDiskSpace()
        DISK_total = DISK_stats[0]
        DISK_used = DISK_stats[1]
        DISK_perc = DISK_stats[3]
        #
        status_text = "CPU_use:  "+CPU_use+"\nCPU_tmp:  "+CPU_tmp
        draw_text(status_text, device_32.width, device_32.height, 12)




if __name__ == '__main__':

    # Create a thread
    t1 = threading.Thread(target=computer_resources)
    t2 = threading.Thread(target=image_gif)
    t1.start()
    t2.start()
    t1.join()
    t2.join()
