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

# 数据文件
DATA_FILE = "travel_plan.json"

class TravelPlanGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("旅游行程规划助手")
        self.root.geometry("750x520")
        
        # 存储行程列表
        self.travel_list = self.load_data()
        
        # 构建界面
        self.create_widgets()
        self.refresh_table()

    # 加载本地保存的行程
    def load_data(self):
        if os.path.exists(DATA_FILE):
            with open(DATA_FILE, "r", encoding="utf-8") as f:
                return json.load(f)
        return []

    # 保存行程到本地文件
    def save_data(self):
        with open(DATA_FILE, "w", encoding="utf-8") as f:
            json.dump(self.travel_list, f, ensure_ascii=False, indent=2)
        messagebox.showinfo("提示", "行程已保存！")

    # 创建界面组件
    def create_widgets(self):
        # 输入区域框架
        input_frame = tk.LabelFrame(self.root, text="新增旅游行程", padx=10, pady=10)
        input_frame.pack(fill="x", padx=10, pady=5)

        # 目的地
        tk.Label(input_frame, text="目的地：").grid(row=0, column=0, sticky="w")
        self.dest_entry = tk.Entry(input_frame, width=18)
        self.dest_entry.grid(row=0, column=1, padx=5)

        # 出行日期
        tk.Label(input_frame, text="出行日期：").grid(row=0, column=2, sticky="w", padx=10)
        self.date_entry = tk.Entry(input_frame, width=15)
        self.date_entry.grid(row=0, column=3)

        # 游玩天数
        tk.Label(input_frame, text="游玩天数：").grid(row=1, column=0, sticky="w", pady=6)
        self.day_entry = tk.Entry(input_frame, width=18)
        self.day_entry.grid(row=1, column=1, padx=5)

        # 预算
        tk.Label(input_frame, text="总预算(元)：").grid(row=1, column=2, sticky="w", padx=10)
        self.money_entry = tk.Entry(input_frame, width=15)
        self.money_entry.grid(row=1, column=3)

        # 备注行程安排
        tk.Label(input_frame, text="行程备注：").grid(row=2, column=0, sticky="w", pady=6)
        self.note_entry = tk.Entry(input_frame, width=55)
        self.note_entry.grid(row=2, column=1, columnspan=3, padx=5)

        # 按钮区域
        btn_frame = tk.Frame(self.root)
        btn_frame.pack(pady=5)
        ttk.Button(btn_frame, text="添加行程", command=self.add_plan).grid(row=0, column=0, padx=8)
        ttk.Button(btn_frame, text="删除选中", command=self.delete_plan).grid(row=0, column=1, padx=8)
        ttk.Button(btn_frame, text="保存全部", command=self.save_data).grid(row=0, column=2, padx=8)
        ttk.Button(btn_frame, text="清空输入框", command=self.clear_input).grid(row=0, column=3, padx=8)

        # 表格展示区域
        table_frame = tk.LabelFrame(self.root, text="全部旅游行程列表", padx=5, pady=5)
        table_frame.pack(fill="both", expand=True, padx=10, pady=5)

        # 表格表头
        columns = ("dest", "date", "days", "budget", "note")
        self.table = ttk.Treeview(table_frame, columns=columns, show="headings")
        self.table.heading("dest", text="目的地")
        self.table.heading("date", text="出行日期")
        self.table.heading("days", text="游玩天数")
        self.table.heading("budget", text="预算(元)")
        self.table.heading("note", text="行程备注")

        # 列宽设置
        self.table.column("dest", width=120)
        self.table.column("date", width=100)
        self.table.column("days", width=80)
        self.table.column("budget", width=90)
        self.table.column("note", width=300)

        # 滚动条
        scroll = ttk.Scrollbar(table_frame, orient="vertical", command=self.table.yview)
        self.table.configure(yscrollcommand=scroll.set)
        scroll.pack(side="right", fill="y")
        self.table.pack(fill="both", expand=True)

    # 清空输入框
    def clear_input(self):
        self.dest_entry.delete(0, tk.END)
        self.date_entry.delete(0, tk.END)
        self.day_entry.delete(0, tk.END)
        self.money_entry.delete(0, tk.END)
        self.note_entry.delete(0, tk.END)

    # 添加行程
    def add_plan(self):
        dest = self.dest_entry.get().strip()
        date = self.date_entry.get().strip()
        days = self.day_entry.get().strip()
        budget = self.money_entry.get().strip()
        note = self.note_entry.get().strip()

        if not all([dest, date, days, budget]):
            messagebox.showerror("错误", "目的地、日期、天数、预算不能为空！")
            return
        try:
            int(days)
            float(budget)
        except:
            messagebox.showerror("错误", "天数、预算必须输入数字！")
            return

        new_plan = {
            "dest": dest,
            "date": date,
            "days": days,
            "budget": budget,
            "note": note
        }
        self.travel_list.append(new_plan)
        self.refresh_table()
        self.clear_input()
        messagebox.showinfo("成功", "行程添加完成！")

    # 刷新表格数据
    def refresh_table(self):
        # 清空原有数据
        for item in self.table.get_children():
            self.table.delete(item)
        # 插入所有行程
        for item in self.travel_list:
            self.table.insert("", "end", values=(
                item["dest"],
                item["date"],
                item["days"],
                item["budget"],
                item["note"]
            ))

    # 删除选中行程
    def delete_plan(self):
        select = self.table.selection()
        if not select:
            messagebox.showwarning("提示", "请先选中要删除的行程！")
            return
        index = self.table.index(select[0])
        del self.travel_list[index]
        self.refresh_table()
        messagebox.showinfo("提示", "已删除选中行程！")

# 程序入口
if __name__ == "__main__":
    window = tk.Tk()
    app = TravelPlanGUI(window)
    window.mainloop()