from PIL import Image, ImageDraw, ImageFont
import numpy as np
import datetime

"""Two colors: 1 main color and 1 accent color. These are labeled in the matrix as 1 and 2"""

def text_converter(text, height):
    """Converts a text to a pixel-matrix
    returns: np.array((16, x))"""

    font = ImageFont.truetype("verdanab.ttf", height)
    size = font.getsize(text)
    img = Image.new("1",size,"black")
    draw = ImageDraw.Draw(img)
    draw.text((0, 0), text, "white", font=font)
    pixels = np.array(img, dtype=np.uint8)
    return pixels


digits = {
    1 : [[0,0,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1]],
    2 : [[1,1,1],[0,0,1],[1,1,1],[1,0,0],[1,1,1]],
    3 : [[1,1,1],[0,0,1],[1,1,1],[0,0,1],[1,1,1]],
    4 : [[1,0,1],[1,0,1],[1,1,1],[0,0,1],[0,0,1]],
    5 : [[1,1,1],[1,0,0],[1,1,1],[0,0,1],[1,1,1]],
    6 : [[1,1,1],[1,0,0],[1,1,1],[1,0,1],[1,1,1]],
    7 : [[1,1,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1]],
    8 : [[1,1,1],[1,0,1],[1,1,1],[1,0,1],[1,1,1]],
    9 : [[1,1,1],[1,0,1],[1,1,1],[0,0,1],[1,1,1]],
    0 : [[1,1,1],[1,0,1],[1,0,1],[1,0,1],[1,1,1]]
}

##place of numbers, invariable
digit_position = [[2,4], [2,10], [9,4], [9,10]]

def time_converter():
    """Converts 4-digit time to a pixel-matrix
    returns: np.array((16, 16))"""
    time = datetime.datetime.now().strftime("%H%M")
    pixels = np.zeros((16,16),dtype=np.uint8)
    time = "0" * (4 - len(str(time))) + str(time)
    time_split = [int(i) for i in time]

    for i in range(4):
        x = digit_position[i][0]
        y = digit_position[i][1]
        number = digits[time_split[i]]
        pixels[x: x + 5, y: y + 3] = np.array(number)

    return pixels


days = np.append(np.zeros((15,16)), np.array([0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,1])).reshape((16,16))
def date_converter():
    today = datetime.datetime.today()
    weekday = datetime.datetime.weekday(today)
    # size of the reduced array according to weekday
    size = [2,4,6,8,10,13,16]

    pixels = days.copy() #base color background
    lrow = np.append(pixels[15,:size[weekday]], [0 for i in range(16 - size[weekday])])
    lrow = np.append(np.zeros((15,16)), lrow).reshape((16,16))
    pixels += lrow
    return pixels

def weather_converter(name):
    equiv = {
        "clouds" : "dashboard_api/clouds.pbm",
        "sun" : "sun.pbm",
        "mix" : "mix.pbm",
        "rain" : "rain.pbm",
        "snow" : "snow.pbm",
    }
    if name in equiv:
        fname = equiv[name]
    else:
        return np.zeros((8,16))

    f = open(fname,"r")
    f.readline()
    f.readline()
    f.readline()

    result = np.zeros((16,16))#should be 8x16
    for i in range(8):
        l = f.readline()[:-1]
        for ind,bit in enumerate(l):
            result[i][ind] = bit

    return result

weather_converter("clouds")