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

class TravelPlanner:
    def __init__(self, root):
        self.root = root
        self.root.title("旅游规划系统")
        self.root.geometry("1200x750")
        self.root.configure(bg="#f0f4f8")
        
        # 数据存储
        self.plans_file = "travel_plans.json"
        self.load_plans()
        
        # 创建UI
        self.create_widgets()
    
    def load_plans(self):
        if os.path.exists(self.plans_file):
            try:
                with open(self.plans_file, 'r', encoding='utf-8') as f:
                    self.plans = json.load(f)
            except:
                self.plans = []
        else:
            self.plans = []
    
    def save_plans(self):
        with open(self.plans_file, 'w', encoding='utf-8') as f:
            json.dump(self.plans, f, ensure_ascii=False, indent=2)
    
    def create_widgets(self):
        # 顶部标题
        title_frame = tk.Frame(self.root, bg="#2196F3", height=80)
        title_frame.pack(fill="x")
        title_frame.pack_propagate(False)
        
        tk.Label(title_frame, text="🌍 智能旅游规划系统", 
                font=("微软雅黑", 26, "bold"), fg="white", bg="#2196F3").pack(pady=15)
        
        # 主内容区
        content = tk.Frame(self.root, bg="#f0f4f8")
        content.pack(fill="both", expand=True, padx=20, pady=20)
        
        # 左侧菜单
        menu_frame = tk.Frame(content, bg="white", width=220, relief="solid", borderwidth=1)
        menu_frame.pack(side="left", fill="y")
        menu_frame.pack_propagate(False)
        
        tk.Label(menu_frame, text="功能菜单", font=("微软雅黑", 14, "bold"),
                fg="#333", bg="white").pack(pady=15)
        
        menus = [
            ("🏠 首页", self.show_home),
            ("✈️ 新建行程", self.show_new_trip),
            ("📋 我的计划", self.show_plans),
            ("💰 预算管理", self.show_budget),
            ("🗺️ 景点推荐", self.show_recommend)
        ]
        
        for text, cmd in menus:
            btn = tk.Button(menu_frame, text=text, font=("微软雅黑", 11),
                          bg="white", fg="#555", anchor="w", padx=20, pady=10,
                          bd=0, cursor="hand2", command=cmd)
            btn.pack(fill="x")
            btn.bind("<Enter>", lambda e, b=btn: b.configure(bg="#f0f4f8"))
            btn.bind("<Leave>", lambda e, b=btn: b.configure(bg="white"))
        
        # 右侧内容区
        self.right_frame = tk.Frame(content, bg="#f0f4f8")
        self.right_frame.pack(side="left", fill="both", expand=True, padx=(20, 0))
        
        # 默认显示首页
        self.show_home()
    
    def clear_right(self):
        for w in self.right_frame.winfo_children():
            w.destroy()
    
    def show_home(self):
        self.clear_right()
        
        # 欢迎卡片
        card = tk.Frame(self.right_frame, bg="white", relief="solid", borderwidth=1)
        card.pack(fill="both", expand=True, padx=10, pady=10)
        
        tk.Label(card, text="🌟 欢迎使用旅游规划系统", 
                font=("微软雅黑", 20, "bold"), fg="#2196F3", bg="white").pack(pady=30)
        
        tk.Label(card, text="规划完美旅程，探索世界精彩", 
                font=("微软雅黑", 12), fg="#888", bg="white").pack()
        
        # 快捷入口
        quick_frame = tk.Frame(card, bg="white")
        quick_frame.pack(pady=30)
        
        items = [
            ("✈️", "新建行程", "#2196F3", self.show_new_trip),
            ("📋", "我的计划", "#4CAF50", self.show_plans),
            ("💰", "预算管理", "#FF9800", self.show_budget),
            ("🗺️", "景点推荐", "#00BCD4", self.show_recommend)
        ]
        
        for emoji, text, color, cmd in items:
            btn = tk.Button(quick_frame, text=f"{emoji}\n{text}", font=("微软雅黑", 12),
                          bg=color, fg="white", width=12, height=3, cursor="hand2",
                          command=cmd)
            btn.pack(side="left", padx=10)
        
        # 统计信息
        if self.plans:
            stats_frame = tk.Frame(card, bg="white")
            stats_frame.pack(pady=20)
            
            total = len(self.plans)
            dests = len(set(p["destination"] for p in self.plans))
            
            tk.Label(stats_frame, text=f"已有 {total} 个计划，涵盖 {dests} 个目的地",
                    font=("微软雅黑", 11), fg="#666", bg="white").pack()
    
    def show_new_trip(self):
        self.clear_right()
        
        card = tk.Frame(self.right_frame, bg="white", relief="solid", borderwidth=1)
        card.pack(fill="both", expand=True, padx=10, pady=10)
        
        tk.Label(card, text="✈️ 创建新行程", font=("微软雅黑", 18, "bold"),
                fg="#333", bg="white").pack(pady=20)
        
        # 表单
        form = tk.Frame(card, bg="white")
        form.pack(padx=40, pady=10)
        
        fields = [
            ("目的地：", 0),
            ("出发地：", 1),
            ("开始日期：", 2),
            ("结束日期：", 3),
            ("人数：", 4),
            ("预算(元)：", 5)
        ]
        
        self.entries = {}
        
        for label, row in fields:
            tk.Label(form, text=label, font=("微软雅黑", 11),
                    fg="#555", bg="white").grid(row=row, column=0, sticky="w", pady=8)
            
            entry = tk.Entry(form, font=("微软雅黑", 11), width=35)
            entry.grid(row=row, column=1, pady=8, padx=(10, 0))
            self.entries[label] = entry
        
        # 默认值
        self.entries["开始日期："].insert(0, datetime.date.today().strftime("%Y-%m-%d"))
        end_date = datetime.date.today() + datetime.timedelta(days=7)
        self.entries["结束日期："].insert(0, end_date.strftime("%Y-%m-%d"))
        self.entries["人数："].insert(0, "2")
        self.entries["预算(元)："].insert(0, "10000")
        
        # 备注
        tk.Label(form, text="备注：", font=("微软雅黑", 11),
                fg="#555", bg="white").grid(row=6, column=0, sticky="w", pady=8)
        
        self.notes = tk.Text(form, font=("微软雅黑", 10), height=4, width=38)
        self.notes.grid(row=6, column=1, pady=8, padx=(10, 0))
        
        # 按钮
        btn_frame = tk.Frame(card, bg="white")
        btn_frame.pack(pady=20)
        
        tk.Button(btn_frame, text="💾 保存计划", font=("微软雅黑", 11, "bold"),
                 bg="#2196F3", fg="white", padx=30, pady=8, cursor="hand2",
                 command=self.save_plan).pack(side="left", padx=10)
        
        tk.Button(btn_frame, text="🔄 重置", font=("微软雅黑", 11),
                 bg="#e0e0e0", fg="#333", padx=20, pady=8, cursor="hand2",
                 command=self.reset_form).pack(side="left", padx=10)
    
    def save_plan(self):
        dest = self.entries["目的地："].get().strip()
        if not dest:
            messagebox.showwarning("提示", "请输入目的地！")
            return
        
        plan = {
            "destination": dest,
            "from_location": self.entries["出发地："].get().strip(),
            "start_date": self.entries["开始日期："].get().strip(),
            "end_date": self.entries["结束日期："].get().strip(),
            "people": self.entries["人数："].get().strip(),
            "budget": self.entries["预算(元)："].get().strip(),
            "notes": self.notes.get("1.0", "end-1c"),
            "created_at": datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
        }
        
        self.plans.append(plan)
        self.save_plans()
        messagebox.showinfo("成功", f"✅ {dest} 旅行计划已保存！")
        self.show_plans()
    
    def reset_form(self):
        for entry in self.entries.values():
            entry.delete(0, "end")
        self.notes.delete("1.0", "end")
        self.entries["开始日期："].insert(0, datetime.date.today().strftime("%Y-%m-%d"))
        end_date = datetime.date.today() + datetime.timedelta(days=7)
        self.entries["结束日期："].insert(0, end_date.strftime("%Y-%m-%d"))
        self.entries["人数："].insert(0, "2")
        self.entries["预算(元)："].insert(0, "10000")
    
    def show_plans(self):
        self.clear_right()
        
        card = tk.Frame(self.right_frame, bg="white", relief="solid", borderwidth=1)
        card.pack(fill="both", expand=True, padx=10, pady=10)
        
        tk.Label(card, text="📋 我的旅行计划", font=("微软雅黑", 18, "bold"),
                fg="#333", bg="white").pack(pady=20)
        
        if not self.plans:
            tk.Label(card, text="还没有旅行计划，快去创建吧！",
                    font=("微软雅黑", 12), fg="#999", bg="white").pack(pady=50)
            return
        
        # 创建滚动列表
        canvas = tk.Canvas(card, bg="white", highlightthickness=0)
        scrollbar = tk.Scrollbar(card, orient="vertical", command=canvas.yview)
        scroll_frame = tk.Frame(canvas, bg="white")
        
        scroll_frame.bind("<Configure>", lambda e: canvas.configure(scrollregion=canvas.bbox("all")))
        canvas.create_window((0, 0), window=scroll_frame, anchor="nw")
        canvas.configure(yscrollcommand=scrollbar.set)
        
        canvas.pack(side="left", fill="both", expand=True, padx=10)
        scrollbar.pack(side="right", fill="y")
        
        for i, plan in enumerate(self.plans):
            item = tk.Frame(scroll_frame, bg="#f8f9fa", relief="solid", borderwidth=1)
            item.pack(fill="x", pady=5, padx=5)
            
            # 计划信息
            info = tk.Frame(item, bg="#f8f9fa")
            info.pack(fill="x", padx=15, pady=10)
            
            tk.Label(info, text=f"📍 {plan['destination']}", 
                    font=("微软雅黑", 13, "bold"), fg="#333", bg="#f8f9fa").pack(anchor="w")
            
            details = f"📅 {plan['start_date']} ~ {plan['end_date']} | 👥 {plan['people']}人 | 💰 ¥{plan['budget']}"
            tk.Label(info, text=details, font=("微软雅黑", 10),
                    fg="#666", bg="#f8f9fa").pack(anchor="w", pady=3)
            
            if plan.get("notes"):
                tk.Label(info, text=f"📝 {plan['notes'][:50]}...", font=("微软雅黑", 9),
                        fg="#888", bg="#f8f9fa").pack(anchor="w")
            
            # 操作按钮
            actions = tk.Frame(item, bg="#f8f9fa")
            actions.pack(fill="x", padx=15, pady=(0, 10))
            
            tk.Button(actions, text="🗑️ 删除", font=("微软雅黑", 9),
                     bg="#ff4444", fg="white", padx=10, cursor="hand2",
                     command=lambda p=plan: self.delete_plan(p)).pack(side="right", padx=2)
    
    def delete_plan(self, plan):
        if messagebox.askyesno("确认", f"删除 {plan['destination']} 的计划？"):
            self.plans.remove(plan)
            self.save_plans()
            self.show_plans()
    
    def show_budget(self):
        self.clear_right()
        
        card = tk.Frame(self.right_frame, bg="white", relief="solid", borderwidth=1)
        card.pack(fill="both", expand=True, padx=10, pady=10)
        
        tk.Label(card, text="💰 预算管理", font=("微软雅黑", 18, "bold"),
                fg="#333", bg="white").pack(pady=20)
        
        if not self.plans:
            tk.Label(card, text="暂无预算数据", font=("微软雅黑", 12),
                    fg="#999", bg="white").pack(pady=50)
            return
        
        # 预算概览
        total = sum(float(p["budget"]) for p in self.plans if p["budget"].replace(".","").isdigit())
        avg = total / len(self.plans) if self.plans else 0
        
        stats = tk.Frame(card, bg="white")
        stats.pack(pady=20)
        
        tk.Label(stats, text=f"总预算：¥{total:,.0f}", font=("微软雅黑", 16, "bold"),
                fg="#2196F3", bg="white").pack()
        tk.Label(stats, text=f"平均预算：¥{avg:,.0f}", font=("微软雅黑", 12),
                fg="#666", bg="white").pack()
        tk.Label(stats, text=f"计划数量：{len(self.plans)} 个", font=("微软雅黑", 12),
                fg="#666", bg="white").pack()
        
        # 预算分配建议
        tips = tk.Frame(card, bg="#f8f9fa", relief="solid", borderwidth=1)
        tips.pack(fill="x", padx=20, pady=20)
        
        tk.Label(tips, text="💡 预算分配建议", font=("微软雅黑", 13, "bold"),
                fg="#333", bg="#f8f9fa").pack(pady=10)
        
        categories = [
            ("✈️ 交通", "30%"),
            ("🏨 住宿", "25%"),
            ("🍽️ 餐饮", "20%"),
            ("🎫 门票", "15%"),
            ("🛍️ 购物", "10%")
        ]
        
        for item, percent in categories:
            frame = tk.Frame(tips, bg="#f8f9fa")
            frame.pack(fill="x", padx=20, pady=2)
            tk.Label(frame, text=item, font=("微软雅黑", 10),
                    fg="#555", bg="#f8f9fa").pack(side="left")
            tk.Label(frame, text=percent, font=("微软雅黑", 10, "bold"),
                    fg="#2196F3", bg="#f8f9fa").pack(side="right")
    
    def show_recommend(self):
        self.clear_right()
        
        card = tk.Frame(self.right_frame, bg="white", relief="solid", borderwidth=1)
        card.pack(fill="both", expand=True, padx=10, pady=10)
        
        tk.Label(card, text="🗺️ 热门景点推荐", font=("微软雅黑", 18, "bold"),
                fg="#333", bg="white").pack(pady=20)
        
        spots = [
            ("🏔️ 张家界", "湖南", "奇峰异石，云雾仙境"),
            ("🏖️ 三亚", "海南", "碧海蓝天，度假天堂"),
            ("🏛️ 故宫", "北京", "六百年皇家气派"),
            ("🌸 西湖", "杭州", "人间天堂，诗意江南"),
            ("🏘️ 丽江古城", "云南", "小桥流水，纳西风情"),
            ("🌊 桂林漓江", "广西", "山水甲天下，百里画廊")
        ]
        
        for name, loc, desc in spots:
            spot = tk.Frame(card, bg="#f8f9fa", relief="solid", borderwidth=1)
            spot.pack(fill="x", padx=20, pady=5)
            
            tk.Label(spot, text=name, font=("微软雅黑", 12, "bold"),
                    fg="#333", bg="#f8f9fa").pack(anchor="w", padx=15, pady=(10, 0))
            
            tk.Label(spot, text=f"📍 {loc} | {desc}", font=("微软雅黑", 10),
                    fg="#666", bg="#f8f9fa").pack(anchor="w", padx=15, pady=(0, 10))

def main():
    root = tk.Tk()
    app = TravelPlanner(root)
    root.mainloop()

if __name__ == "__main__":
    main()