import tkinter as tk
from tkinter import ttk
from datetime import datetime
import threading
import time
import paho.mqtt.client as mqtt

class MotorControlApp:
    def __init__(self, root):
        self.root = root
        self.root.title("User Interface")
        
        # Current datetime display
        self.datetime_label = ttk.Label(root, text="", font=('Helvetica', 16))
        self.datetime_label.pack(pady=10)
        
        # Motor status
        self.motor_status_label = ttk.Label(root, text="Motor Status: Stopped", font=('Helvetica', 14))
        self.motor_status_label.pack(pady=10)
        
        # Motor speed
        self.motor_speed_label = ttk.Label(root, text="Motor Speed: 0", font=('Helvetica', 14))
        self.motor_speed_label.pack(pady=10)
        
        # Control buttons
        self.start_button = ttk.Button(root, text="Start Motor", command=self.start_motor)
        self.start_button.pack(pady=5)
        
        self.stop_button = ttk.Button(root, text="Stop Motor", command=self.stop_motor)
        self.stop_button.pack(pady=5)
        
        self.increase_speed_button = ttk.Button(root, text="Increase Speed", command=self.increase_speed)
        self.increase_speed_button.pack(pady=5)
        
        self.decrease_speed_button = ttk.Button(root, text="Decrease Speed", command=self.decrease_speed)
        self.decrease_speed_button.pack(pady=5)
        
        # Initialize motor control variables
        self.motor_running = False
        self.motor_speed = 0
        
        # Set up MQTT client
        self.mqtt_client = mqtt.Client()
        self.mqtt_client.username_pw_set("fabacademy", "fabacademy")
        self.mqtt_client.on_connect = self.on_connect
        self.mqtt_client.on_message = self.on_message
        self.mqtt_client.connect("mqtt.fabcloud.org", 1883, 60)
        self.mqtt_client.loop_start()
    
    def on_connect(self, client, userdata, flags, rc):
        print("Connected with result code " + str(rc))
        client.subscribe("fabacademy/datetime")
    
    def on_message(self, client, userdata, msg):
        message = msg.payload.decode()
        print("" + str(message))
        self.update_datetime(str(message))
        
    
    def update_datetime(self, current_datetime):
        # current_datetime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        self.datetime_label.config(text=current_datetime)
        self.root.after(4000, self.mqtt_client.publish("fabacademy/update", "datetime") )  # update every second

    
    def start_motor(self):
        if not self.motor_running:
            self.motor_running = True
            self.motor_status_label.config(text="Motor Status: Running")
            threading.Thread(target=self.run_motor).start()
            self.mqtt_client.publish("fabacademy/status", "Running")
    
    def stop_motor(self):
        self.motor_running = False
        self.motor_status_label.config(text="Motor Status: Stopped")
        self.motor_speed = 0
        self.motor_speed_label.config(text="Motor Speed: 0")
        self.mqtt_client.publish("fabacademy/status", "Stopped")
    
    def increase_speed(self):
        if self.motor_running:
            self.motor_speed += 50
            self.motor_speed_label.config(text=f"Motor Speed: {self.motor_speed}")
            self.mqtt_client.publish("fabacademy/input", self.motor_speed)
    
    def decrease_speed(self):
        if self.motor_running and self.motor_speed > 0:
            self.motor_speed -= 50
            self.motor_speed_label.config(text=f"Motor Speed: {self.motor_speed}")
            self.mqtt_client.publish("fabacademy/input", self.motor_speed)
    
    def run_motor(self):
        while self.motor_running:
            print(f"Motor running at speed: {self.motor_speed}")
            time.sleep(1)

if __name__ == "__main__":
    root = tk.Tk()
    app = MotorControlApp(root)
    root.mainloop()
