import tkinter as tk
from tkinter import ttk, messagebox
import json
import os

FILE_NAME = "travel_plan.json"

class TravelPlanApp:
    def __init__(self, root):
        self.root = root
        self.root.title("旅游计划管理器")
        self.root.geometry("720x520")

        # 存储行程列表
        self.plan_list = []
        self.load_data()

        # 输入区域框架
        frame_input = ttk.LabelFrame(root, text="添加新行程")
        frame_input.pack(padx=10, pady=5, fill="x")

        ttk.Label(frame_input, text="目的地:").grid(row=0, column=0, padx=5, pady=5)
        self.entry_dest = ttk.Entry(frame_input, width=20)
        self.entry_dest.grid(row=0, column=1, padx=5, pady=5)

        ttk.Label(frame_input, text="出发日期:").grid(row=0, column=2, padx=5, pady=5)
        self.entry_date = ttk.Entry(frame_input, width=15)
        self.entry_date.grid(row=0, column=3, padx=5, pady=5)

        ttk.Label(frame_input, text="预算:").grid(row=1, column=0, padx=5, pady=5)
        self.entry_budget = ttk.Entry(frame_input, width=20)
        self.entry_budget.grid(row=1, column=1, padx=5, pady=5)

        ttk.Label(frame_input, text="备注:").grid(row=1, column=2, padx=5, pady=5)
        self.entry_note = ttk.Entry(frame_input, width=15)
        self.entry_note.grid(row=1, column=3, padx=5, pady=5)

        # 按钮区域
        frame_btn = ttk.Frame(root)
        frame_btn.pack(padx=10, pady=5)

        ttk.Button(frame_btn, text="添加行程", command=self.add_item).grid(row=0, column=0, padx=8)
        ttk.Button(frame_btn, text="删除选中", command=self.delete_item).grid(row=0, column=1, padx=8)
        ttk.Button(frame_btn, text="保存计划", command=self.save_data).grid(row=0, column=2, padx=8)
        ttk.Button(frame_btn, text="清空全部", command=self.clear_all).grid(row=0, column=3, padx=8)

        # 列表展示区
        frame_list = ttk.LabelFrame(root, text="我的旅游计划列表")
        frame_list.pack(padx=10, pady=5, fill="both", expand=True)

        columns = ("dest", "date", "budget", "note")
        self.tree = ttk.Treeview(frame_list, columns=columns, show="headings")
        self.tree.heading("dest", text="目的地")
        self.tree.heading("date", text="出发日期")
        self.tree.heading("budget", text="预算")
        self.tree.heading("note", text="备注")

        self.tree.column("dest", width=160)
        self.tree.column("date", width=130)
        self.tree.column("budget", width=130)
        self.tree.column("note", width=240)

        scrollbar = ttk.Scrollbar(frame_list, orient="vertical", command=self.tree.yview)
        self.tree.configure(yscrollcommand=scrollbar.set)

        self.tree.pack(side="left", fill="both", expand=True)
        scrollbar.pack(side="right", fill="y")

        self.refresh_tree()

    def add_item(self):
        dest = self.entry_dest.get().strip()
        date = self.entry_date.get().strip()
        budget = self.entry_budget.get().strip()
        note = self.entry_note.get().strip()
        if not dest or not date:
            messagebox.showwarning("提示", "目的地和出发日期不能为空！")
            return
        new_item = {
            "dest": dest,
            "date": date,
            "budget": budget,
            "note": note
        }
        self.plan_list.append(new_item)
        self.refresh_tree()
        # 清空输入框
        self.entry_dest.delete(0, tk.END)
        self.entry_date.delete(0, tk.END)
        self.entry_budget.delete(0, tk.END)
        self.entry_note.delete(0, tk.END)

    def delete_item(self):
        selected = self.tree.selection()
        if not selected:
            messagebox.showinfo("提示", "请先选中一条行程！")
            return
        for item in selected:
            index = self.tree.index(item)
            del self.plan_list[index]
        self.refresh_tree()

    def clear_all(self):
        if messagebox.askyesno("确认", "确定清空所有旅游计划吗？"):
            self.plan_list.clear()
            self.refresh_tree()

    def refresh_tree(self):
        # 清空表格
        for item in self.tree.get_children():
            self.tree.delete(item)
        # 重新加载
        for p in self.plan_list:
            self.tree.insert("", tk.END, values=(p["dest"], p["date"], p["budget"], p["note"]))

    def save_data(self):
        with open(FILE_NAME, "w", encoding="utf‑8") as f:
            json.dump(self.plan_list, f, ensure_ascii=False, indent=2)
        messagebox.showinfo("成功", "旅游计划已保存！")

    def load_data(self):
        if os.path.exists(FILE_NAME):
            try:
                with open(FILE_NAME, "r", encoding="utf‑8") as f:
                    self.plan_list = json.load(f)
            except:
                self.plan_list = []


if __name__ == "__main__":
    window = tk.Tk()
    app = TravelPlanApp(window)
    window.mainloop()
