import tkinter as tk
from tkinter import ttk, messagebox
import urllib.request
import urllib.parse
import json
import threading
from datetime import datetime

class WeatherApp:
    def __init__(self, root):
        self.root = root
        self.root.title("035. 天气查询小工具（零依赖版）")
        self.root.geometry("520x420")
        self.root.resizable(False, False)

        self.build_ui()

    def build_ui(self):
        # 标题
        tk.Label(
            self.root, text="🌤️ 天气查询小工具",
            font=("微软雅黑", 18, "bold")
        ).pack(pady=10)

        # ===== 输入区 =====
        input_frame = tk.Frame(self.root)
        input_frame.pack(pady=5)

        tk.Label(input_frame, text="城市名：", font=("微软雅黑", 10)).pack(side=tk.LEFT)
        self.city_entry = tk.Entry(input_frame, width=18, font=("微软雅黑", 11))
        self.city_entry.pack(side=tk.LEFT, padx=5)
        self.city_entry.insert(0, "北京")

        self.search_btn = tk.Button(
            input_frame, text="查询", width=8,
            bg="#4CAF50", fg="white", font=("微软雅黑", 10, "bold"),
            command=self.start_search
        )
        self.search_btn.pack(side=tk.LEFT, padx=8)

        tk.Button(
            input_frame, text="清空", width=8,
            bg="#FF9800", fg="white",
            command=self.clear
        ).pack(side=tk.LEFT)

        # ===== 结果区 =====
        result_frame = tk.LabelFrame(self.root, text="天气信息", font=("微软雅黑", 10))
        result_frame.pack(padx=20, pady=10, fill=tk.BOTH, expand=True)

        self.result_text = tk.Text(
            result_frame, font=("微软雅黑", 11),
            wrap=tk.WORD, relief=tk.FLAT, height=12
        )
        self.result_text.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        self.result_text.insert("1.0", "请输入城市名，点击“查询”获取天气信息～")
        self.result_text.config(state=tk.DISABLED)

        # ===== 状态栏 =====
        self.status = tk.Label(
            self.root, text="就绪", anchor="w", relief=tk.SUNKEN
        )
        self.status.pack(side=tk.BOTTOM, fill=tk.X)

    def clear(self):
        self.city_entry.delete(0, tk.END)
        self.result_text.config(state=tk.NORMAL)
        self.result_text.delete("1.0", tk.END)
        self.result_text.insert("1.0", "请输入城市名，点击“查询”获取天气信息～")
        self.result_text.config(state=tk.DISABLED)
        self.status.config(text="就绪")

    # ========== 查询逻辑 ==========
    def start_search(self):
        city = self.city_entry.get().strip()
        if not city:
            messagebox.showwarning("提示", "请输入城市名！")
            return

        self.search_btn.config(state="disabled")
        self.status.config(text="查询中...")
        self.result_text.config(state=tk.NORMAL)
        self.result_text.delete("1.0", tk.END)
        self.result_text.insert("1.0", f"正在查询【{city}】的天气...\n")
        self.result_text.config(state=tk.DISABLED)

        threading.Thread(target=self.fetch_weather, args=(city,), daemon=True).start()

    def fetch_weather(self, city):
        try:
            # URL 编码城市名
            city_encoded = urllib.parse.quote(city)
            url = f"https://wttr.in/{city_encoded}?format=j1&lang=zh"

            req = urllib.request.Request(
                url,
                headers={"User-Agent": "Mozilla/5.0"}
            )

            with urllib.request.urlopen(req, timeout=10) as response:
                data = json.loads(response.read().decode("utf-8"))

            current = data["current_condition"][0]

            temp = current["temp_C"]
            feels_like = current["FeelsLikeC"]
            desc = current["lang_zh"][0]["value"]
            humidity = current["humidity"]
            wind = current["windspeedKmph"]

            # 未来三天
            forecast_lines = []
            for i, day in enumerate(data["weather"][:3]):
                date = day["date"]
                max_t = day["maxtempC"]
                min_t = day["mintempC"]
                d_desc = day["hourly"][4]["lang_zh"][0]["value"]
                forecast_lines.append(f"  {date}：{d_desc}，{min_t}℃ ~ {max_t}℃")

            result = (
                f"📍 城市：{city}\n"
                f"🌡️ 温度：{temp}℃（体感 {feels_like}℃）\n"
                f"☁️ 天气：{desc}\n"
                f"💧 湿度：{humidity}%\n"
                f"🌬️ 风速：{wind} km/h\n"
                f"🕒 更新时间：{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n"
                f"📅 未来几天预报：\n"
                + "\n".join(forecast_lines)
            )

            self.root.after(0, self.show_result, result, "查询成功")

        except urllib.error.URLError:
            self.root.after(0, self.show_result, "", "网络错误，请检查网络连接或城市名是否正确")
        except KeyError:
            self.root.after(0, self.show_result, "", "返回数据解析失败，可能是城市名不支持")
        except Exception as e:
            self.root.after(0, self.show_result, "", f"发生错误：{e}")

    def show_result(self, text, status):
        self.result_text.config(state=tk.NORMAL)
        self.result_text.delete("1.0", tk.END)
        if text:
            self.result_text.insert("1.0", text)
        else:
            self.result_text.insert("1.0", status)
        self.result_text.config(state=tk.DISABLED)

        self.status.config(text=status)
        self.search_btn.config(state="normal")


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