#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
گلخانه هوشمند - اپلیکیشن دسکتاپ فارسی (RTL)
بدون خطای Tkinter
"""

import urllib.request
import urllib.error
import json
import tkinter as tk
from tkinter import messagebox, scrolledtext
from datetime import datetime

SERVER_URL = "https://arpourezzat.ir/greenhouse/api.php"
REFRESH_MS = 500

def http_get(endpoint):
    url = f"{SERVER_URL}?get={endpoint}"
    try:
        with urllib.request.urlopen(url, timeout=3) as resp:
            return json.loads(resp.read().decode('utf-8'))
    except Exception:
        return None

def http_post(action, payload):
    url = f"{SERVER_URL}?set={action}"
    data = json.dumps(payload).encode('utf-8')
    req = urllib.request.Request(url, data=data, method='POST')
    req.add_header('Content-Type', 'application/json')
    try:
        with urllib.request.urlopen(req, timeout=3) as resp:
            return json.loads(resp.read().decode('utf-8'))
    except Exception:
        return None

class GreenhouseApp:
    def __init__(self, root):
        self.root = root
        self.root.title("🌱 گلخانه هوشمند - پایشگر دستورات")
        self.root.geometry("600x720")
        self.root.minsize(520, 650)
        self.root.configure(bg='#f0f4f8')

        # حذف خطای tk_setPalette - دیگر خطایی رخ نمی‌دهد
        # self.root.tk.call('tk_setPalette', ...)  # حذف شد

        self.prev_state = {'window': None, 'fan': None, 'lamps': None}
        self.create_widgets_rtl()
        self.refresh_actuators_and_log()
        self.root.protocol("WM_DELETE_WINDOW", self.on_closing)

    def create_widgets_rtl(self):
        title_font = ('Segoe UI', 14, 'bold')
        label_font = ('Segoe UI', 10)
        btn_font = ('Segoe UI', 10)

        header = tk.Frame(self.root, bg='#e0f0ea', height=70)
        header.pack(fill='x', padx=0, pady=0)
        tk.Label(header, text="🌿 سامانه کنترل گلخانه", font=('Segoe UI', 16, 'bold'),
                 bg='#e0f0ea', fg='#1a4d3e').pack(pady=12)
        tk.Label(header, text="نمایش لحظه‌ای فرمان‌ها و وضعیت تجهیزات", 
                 font=('Segoe UI', 9), bg='#e0f0ea', fg='#2d6a55').pack()

        # وضعیت تجهیزات
        status_frame = tk.LabelFrame(self.root, text="📟 وضعیت فعلی تجهیزات", 
                                     font=('Segoe UI', 11, 'bold'),
                                     bg='white', fg='#1f5442', padx=12, pady=10, bd=1, relief='groove')
        status_frame.pack(fill='x', padx=15, pady=12)

        win_row = tk.Frame(status_frame, bg='white')
        win_row.pack(fill='x', pady=5)
        self.window_status_label = tk.Label(win_row, text="در حال دریافت...", font=('Segoe UI', 10, 'bold'),
                                            bg='#e9eef2', fg='black', width=18, relief='ridge', anchor='e')
        self.window_status_label.pack(side='left', padx=10)
        tk.Label(win_row, text="🪟 پنجره:", font=label_font, bg='white', width=10, anchor='e').pack(side='left', padx=5)

        fan_row = tk.Frame(status_frame, bg='white')
        fan_row.pack(fill='x', pady=5)
        self.fan_status_label = tk.Label(fan_row, text="در حال دریافت...", font=('Segoe UI', 10, 'bold'),
                                         bg='#e9eef2', fg='black', width=18, relief='ridge', anchor='e')
        self.fan_status_label.pack(side='left', padx=10)
        tk.Label(fan_row, text="🌀 فن:", font=label_font, bg='white', width=10, anchor='e').pack(side='left', padx=5)

        lamp_row = tk.Frame(status_frame, bg='white')
        lamp_row.pack(fill='x', pady=5)
        self.lamps_status_label = tk.Label(lamp_row, text="در حال دریافت...", font=('Segoe UI', 10, 'bold'),
                                           bg='#e9eef2', fg='black', width=18, relief='ridge', anchor='e')
        self.lamps_status_label.pack(side='left', padx=10)
        tk.Label(lamp_row, text="💡 لامپ رشد:", font=label_font, bg='white', width=10, anchor='e').pack(side='left', padx=5)

        # گزارش دستورات
        log_frame = tk.LabelFrame(self.root, text="📜 گزارش آخرین دستورات", 
                                  font=('Segoe UI', 11, 'bold'),
                                  bg='white', fg='#1f5442', padx=12, pady=10, bd=1, relief='groove')
        log_frame.pack(fill='both', expand=True, padx=15, pady=12)

        self.log_area = scrolledtext.ScrolledText(log_frame, height=12, wrap=tk.WORD,
                                                  font=('Consolas', 9), bg='#fefef7',
                                                  fg='#1e2f2a', state='normal')
        self.log_area.pack(fill='both', expand=True, padx=5, pady=5)
        self.log_area.tag_configure('rtl', justify='right')
        self.log_area.config(state='disabled')

        # ثبت مقادیر سنسورها
        sensor_frame = tk.LabelFrame(self.root, text="✏️ ثبت مقادیر جدید سنسورها", 
                                     font=('Segoe UI', 10, 'bold'),
                                     bg='white', fg='#1f5442', padx=12, pady=10, bd=1, relief='groove')
        sensor_frame.pack(fill='x', padx=15, pady=10)

        row1 = tk.Frame(sensor_frame, bg='white')
        row1.pack(fill='x', pady=4)
        self.temp_entry = tk.Entry(row1, width=12, justify='right')
        self.temp_entry.pack(side='left', padx=5)
        tk.Label(row1, text="دمای هوا (°C):", bg='white', width=14, anchor='e').pack(side='left', padx=5)
        self.hum_entry = tk.Entry(row1, width=12, justify='right')
        self.hum_entry.pack(side='left', padx=5)
        tk.Label(row1, text="رطوبت (%):", bg='white', width=14, anchor='e').pack(side='left', padx=5)

        row2 = tk.Frame(sensor_frame, bg='white')
        row2.pack(fill='x', pady=4)
        self.light_entry = tk.Entry(row2, width=12, justify='right')
        self.light_entry.pack(side='left', padx=5)
        tk.Label(row2, text="نور (lux):", bg='white', width=14, anchor='e').pack(side='left', padx=5)
        self.co2_entry = tk.Entry(row2, width=12, justify='right')
        self.co2_entry.pack(side='left', padx=5)
        tk.Label(row2, text="CO₂ (ppm):", bg='white', width=14, anchor='e').pack(side='left', padx=5)

        btn_send = tk.Button(sensor_frame, text="📤 ارسال مقادیر به سرور", command=self.send_sensors,
                             font=btn_font, bg='#2c7a4d', fg='white', pady=5, cursor='hand2')
        btn_send.pack(pady=(8, 5))

        self.status_var = tk.StringVar(value="✅ بروزرسانی خودکار هر ۱.۵ ثانیه | در حال کار...")
        status_bar = tk.Label(self.root, textvariable=self.status_var, font=('Segoe UI', 8),
                              bg='#f0f4f8', fg='#4a627a', anchor='e')
        status_bar.pack(side='bottom', fill='x', padx=15, pady=5)

    def update_status_colors(self, actuator, state):
        label_map = {
            'window': self.window_status_label,
            'fan': self.fan_status_label,
            'lamps': self.lamps_status_label
        }
        label = label_map.get(actuator)
        if not label:
            return
        if actuator == 'window':
            if state == 'open':
                label.config(text="باز 🌬️", bg='#c8e6d9', fg='#006442')
            else:
                label.config(text="بسته 🔒", bg='#ffe0cc', fg='#b13e3e')
        else:
            if state == 'on':
                label.config(text="روشن ✅", bg='#c8e6d9', fg='#006442')
            else:
                label.config(text="خاموش ⚪", bg='#ffe0cc', fg='#b13e3e')

    def add_log_entry(self, message):
        timestamp = datetime.now().strftime("%H:%M:%S")
        log_line = f"[{timestamp}] {message}\n"
        self.log_area.config(state='normal')
        self.log_area.insert(tk.END, log_line, 'rtl')
        self.log_area.see(tk.END)
        self.log_area.config(state='disabled')
        if int(self.log_area.index('end-1c').split('.')[0]) > 200:
            self.log_area.config(state='normal')
            self.log_area.delete('1.0', '50.0')
            self.log_area.config(state='disabled')

    def refresh_actuators_and_log(self):
        actuators = http_get("actuators")
        if not actuators:
            self.status_var.set("⚠️ خطا در ارتباط با سرور - بررسی کنید php -S فعال باشد")
            self.root.after(REFRESH_MS, self.refresh_actuators_and_log)
            return

        for act in ['window', 'fan', 'lamps']:
            current = actuators.get(act)
            if current is None:
                continue
            prev = self.prev_state.get(act)
            if prev != current:
                if act == 'window':
                    action_text = "پنجره " + ("باز شد" if current == 'open' else "بسته شد")
                elif act == 'fan':
                    action_text = "فن " + ("روشن شد" if current == 'on' else "خاموش شد")
                else:
                    action_text = "لامپ رشد " + ("روشن شد" if current == 'on' else "خاموش شد")
                self.add_log_entry(action_text)
                self.prev_state[act] = current
            self.update_status_colors(act, current)

        self.status_var.set("✅ بروزرسانی خودکار - آخرین دریافت: " + datetime.now().strftime("%H:%M:%S"))
        self.root.after(REFRESH_MS, self.refresh_actuators_and_log)

    def send_sensors(self):
        try:
            temp = float(self.temp_entry.get()) if self.temp_entry.get().strip() else None
            hum = float(self.hum_entry.get()) if self.hum_entry.get().strip() else None
            light = int(self.light_entry.get()) if self.light_entry.get().strip() else None
            co2 = int(self.co2_entry.get()) if self.co2_entry.get().strip() else None
        except ValueError:
            messagebox.showerror("خطا در ورودی", "لطفاً اعداد معتبر وارد کنید (مثال: 22.5)")
            return

        payload = {}
        if temp is not None: payload['temperature'] = temp
        if hum is not None: payload['humidity'] = hum
        if light is not None: payload['light'] = light
        if co2 is not None: payload['co2'] = co2

        if not payload:
            messagebox.showinfo("اطلاع", "هیچ مقداری وارد نشده است")
            return

        result = http_post("sensors", payload)
        if result and result.get("success"):
            self.status_var.set("✅ مقادیر سنسورها با موفقیت به سرور ارسال شد")
            self.temp_entry.delete(0, tk.END)
            self.hum_entry.delete(0, tk.END)
            self.light_entry.delete(0, tk.END)
            self.co2_entry.delete(0, tk.END)
        else:
            messagebox.showerror("خطا", "ارسال مقادیر انجام نشد. سرور در دسترس است؟")

    def on_closing(self):
        self.root.destroy()

if __name__ == "__main__":
    root = tk.Tk()
    app = GreenhouseApp(root)
    root.mainloop()