import sv_ttk
import socket
import tkinter as tk
from tkinter import ttk
import threading
import time
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import requests

API_KEY = '2aece83b3adbe88f6c83c36fb780bfea'
BASE_URL = 'http://api.openweathermap.org/data/2.5/forecast'

win = tk.Tk()
label1 = ttk.Label(text="Welcome User!")
label1.grid(row=1, column=0, padx=10, pady=10, sticky="nw")
label56 = ttk.Label(win, text="DarkFLAME Industries")
label56.grid(row=1, column=2, padx=10, pady=10, sticky="nw")
sv_ttk.set_theme("dark")
win.title("DarkFLAME Industries")
win.geometry("1920x1080")

def receive_data():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("raspberrypi", 5000))
    
    while True: 
        with open("data.txt", "w") as file:
            x = s.recv(1024).decode("utf-8")
            file.write(x + "\n")

def use_data():
    while True:
        with open("data.txt", "r") as file:
            data = file.read()
            file_data = data.split()
            last_data = file_data[-1]
            sensor_number = last_data[:1]
            pseudo_sensor_value = last_data[1:]
            global sensor_value
            sensor_value = pseudo_sensor_value[1:]
            global sensor4
            if sensor_number == "1":
                sensor4.append(sensor_value)
                sensor4 = sensor4[1:]
            global sensor3 
            if sensor_number == "2":
                sensor3.append(sensor_value)
                sensor3 = sensor3[1:]
        
notebook = ttk.Notebook(win)
notebook.grid(row=2, column=0, padx=10, pady=10, sticky = "ew")

tab1 = ttk.Frame(notebook, width=1920, height=1080)
tab2 = ttk.Frame(notebook, width=1920, height=1080)
tab3 = ttk.Frame(notebook, width=1920, height=1080)

tab1.pack(fill='both', expand=True)
tab2.pack(fill='both', expand=True)
tab3.pack(fill='both', expand=True)
                 
notebook.add(tab1, text="Graphs")
notebook.add(tab2, text="Weather ☔ ")
notebook.add(tab3, text="Control Panel")
cf1 = ttk.LabelFrame(tab1, text="Sensor 1:", padding=(50, 10))
cf1.grid(row=3, column=0, padx=(20, 10), pady=(20, 10), sticky="nsew")
cf2 = ttk.LabelFrame(tab1, text="Sensor 2:", padding=(50, 10))
cf2.grid(row=3, column=1, padx=(20, 10), pady=(20, 10), sticky="nsew")
cf3 = ttk.LabelFrame(tab3, text="Soil Moisture Graph:", padding=(50, 10))
cf3.grid(row=1, column=0, padx=(20, 10), pady=(20, 10), sticky="nsew")
label2 = ttk.Label(tab1, text="Graph, Sensor Value")
label2.grid(row=1, column=0, padx=10, pady=10, sticky="nw")
sensor4 = ["0", "0", "0", "0"]
sensor4int = [0, 0, 0, 0]
time_x = [0, 0, 0, 0]
sensor3 = ["0", "0", "0", "0"]
sensor3int = [0, 0, 0, 0]
i = 0

def plotgraph4():
    for widget in cf1.winfo_children():
        widget.destroy()
    fig, ax = plt.subplots()
    ax.plot(time_x, sensor4int)
    ax.set_xlabel('Time')
    ax.set_ylabel('Sensor Value')
    ax.set_title('Soil Moisture Level, Sensor 1')
    canvas = FigureCanvasTkAgg(fig, master=cf1)
    canvas.draw()
    canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)
    plt.close(fig)
    win.after(2000, plotgraph4)

def plotgraph3():
    for widget in cf2.winfo_children():
        widget.destroy()
    fig, ax = plt.subplots()
    ax.plot(time_x, sensor3int)
    ax.set_xlabel('Time')
    ax.set_ylabel('Temperature')
    ax.set_title('Temperature Levels')
    canvas = FigureCanvasTkAgg(fig, master=cf2)
    canvas.draw()
    canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)
    plt.close(fig)
    win.after(2000, plotgraph3)

def plotgraph_control_panel():
    for widget in cf3.winfo_children():
        widget.destroy()
    fig, ax = plt.subplots()
    ax.plot(time_x, sensor4int, label="Soil Moisture")
    ax.set_xlabel('Time')
    ax.set_ylabel('Moisture Value')
    ax.set_title('Soil Moisture Level Over Time')
    ax.legend()
    canvas = FigureCanvasTkAgg(fig, master=cf3)
    canvas.draw()
    canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)
    plt.close(fig)
    
def stopwatch():
    global time_x
    global i
    while True:
        time.sleep(1)
        i += 1
        time_x.append(i)
        time_x = time_x[1:]

def convert():
    global sensor4int, sensor4, sensor3, sensor3int
    while True:
        sensor4int = [int(val) for val in sensor4]
        sensor3int = [int(val) for val in sensor3]
        time.sleep(2)

def api():
    city_name=entry1.get()
    url = f"https://api.openweathermap.org/data/2.5/weather?q={city_name}&appid={API_KEY}"
    response = requests.get(url)
    x = response.json()
    if x["cod"] != "404":
        temperature = str(round(x["main"]["temp"] - 273.15))
        humidity = str(x["main"]["humidity"])
        weather = x["weather"][0]["main"]
        wind_speed = str(round(x["wind"]["speed"] * 18 / 5)) 
        location = x["name"] + ", " + x["sys"]["country"]
        label6 = ttk.Label(tab2, text="Temperature: "+temperature+"°C"+"\n"+"Humdidity: "+humidity+"%"+"\n"+"Windspeed: "+wind_speed+"km/h"+"\n"+"Weather: "+weather)
        label6.grid(row=3, column=0, padx=10, pady=10, sticky="nw")

label5 = ttk.Label(tab2, text="Get Weather Data...")
label5.grid(row=1, column=0, padx=10, pady=10, sticky="nw")

entry1 = ttk.Entry(tab2)
entry1.grid(row=1, column=2, padx=10, pady=10, sticky="nw")

button2 = ttk.Button(tab3, text="Show Soil Moisture Graph", command=plotgraph_control_panel)
button2.grid(row=2, column=0, padx=10, pady=10, sticky="n")

button1 = ttk.Button(tab2, text = "Get current weather data:", command=api)
button1.grid(row=2, column=0, padx=10, pady=10, sticky="nw")



threads = [
    threading.Thread(target=receive_data),
    threading.Thread(target=use_data),
    threading.Thread(target=convert),
    threading.Thread(target=stopwatch)
]

for thread in threads:
    thread.start()

plotgraph4()
plotgraph3()        
win.mainloop()
