#!/usr/bin/python
# -*- coding:utf-8 -*-
import sys
import os
picdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'pic')
libdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')
if os.path.exists(libdir):
    sys.path.append(libdir)

import logging
from waveshare_epd import epd2in13d
import time
from PIL import Image,ImageDraw,ImageFont
import traceback
from paho.mqtt import client as mqtt_client
import paho.mqtt.client as paho

logging.basicConfig(level=logging.DEBUG)

Connected = False

try:
    logging.info("epd2in13bc Demo")
    
    epd = epd2in13d.EPD()
    logging.info("init and Clear")
    epd.init()
    epd.Clear()
    time.sleep(0.5)
    
    # Drawing on the image
    logging.info("Drawing")
    font10 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 12)
    
    # Drawing on the Horizontal image
    logging.info("1.Drawing on the Horizontal image...") 
    HBlackimage = Image.new('1', (epd.height, epd.width), 255)  # 298*126
    #HRedimage = Image.new('1', (epd.height, epd.width), 255)  # 298*126  ryimage: red or yellow image  
    drawblack = ImageDraw.Draw(HBlackimage)
    #drawred = ImageDraw.Draw(HRedimage)
    #drawblack.text((5, 0), 'PV Produktion', font = font10, fill = 0)
    #drawblack.text((5, 15), 'Hausverbrauch', font = font10, fill = 0)
    #drawblack.text((5, 30), 'Strom Import/Export', font = font10, fill = 0)
    #drawblack.text((5, 45), 'Batterie %', font = font10, fill = 0)
    #drawblack.text((5, 60), 'Batterie Laden/Entladen', font = font10, fill = 0)
    #epd.display(epd.getbuffer(HBlackimage), epd.getbuffer(HRedimage))
    #epd.DisplayPartial(epd.getbuffer(HBlackimage))

    values_image = Image.new('1', (epd.height, epd.width), 255)
    values_draw = ImageDraw.Draw(values_image)

    time.sleep(2)

except IOError as e:
    logging.info(e)
    
except KeyboardInterrupt:    
    logging.info("ctrl + c:")
    epd2in13d.epdconfig.module_exit()
    exit()


def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected to MQTT Broker!")

        global Connected                #Use global variable
        Connected = True                #Signal connection 
    else:
        print("Failed to connect, return code %d\n", rc)

def on_message(client, userdata, msg):
    if msg.topic == "openWB/pv/W":
        line = 0
    elif msg.topic == "openWB/global/WHouseConsumption":
        line = 15
    elif msg.topic == "openWB/evu/W":
        line = 30
    elif msg.topic == "openWB/housebattery/%Soc":
        line = 45
    elif msg.topic == "openWB/housebattery/W":    
        line = 60

    print(line)
    values_draw.rectangle((150, line, 120, 50), fill = 255)
    values_draw.text((150, line), msg.payload.decode(), font = font10, fill = 0)
    epd.DisplayPartial(epd.getbuffer(values_image))
    #print(f"`{msg.topic}`: `{msg.payload.decode()}`")

Connected = False   #global variable for the state of the connection

broker = "192.168.99.224"
port = 1883
topic_wHouseConsumption = "openWB/global/WHouseConsumption"
topic_pvProduction = "openWB/pv/W"
topic_energyImportExport = "openWB/evu/W"
topic_houseBatterySoC = "openWB/housebattery/%Soc"
topic_houseBatteryLoadUnload = "openWB/housebattery/W"

username = "mqtt-user"
pw = "phio6yiR9ohs1veeghu4WaeGhaiRi8he4EiWasheev4faeku8tohdiuthah7zahP"
client_id = "solarmonitor"

client = mqtt_client.Client(client_id, protocol=paho.MQTTv31)
client.username_pw_set(username, password=pw)
client.on_connect = on_connect
client.on_message = on_message

client.connect(broker, port=port)

client.loop_start()        #start the loop
  
while Connected != True:    #Wait for connection
    time.sleep(1)

client.subscribe(topic_wHouseConsumption)
client.subscribe(topic_pvProduction)
client.subscribe(topic_energyImportExport)
client.subscribe(topic_houseBatterySoC)
client.subscribe(topic_houseBatteryLoadUnload)


try:
    while True:
        time.sleep(1)
        print("-----")
  
except KeyboardInterrupt:
    print("exiting")
    client.disconnect()
    client.loop_stop()
