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

class TravelPlannerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("智能旅行计划器")
        self.root.geometry("1000x700")
        
        # 设置样式
        self.setup_styles()
        
        # 创建主框架
        self.create_main_layout()
        
        # 初始化数据
        self.trip_data = {
            "basic_info": {},
            "itinerary": [],
            "budget": {},
            "packing_list": []
        }
        
        # 加载示例数据
        self.load_sample_data()
    
    def setup_styles(self):
        """设置界面样式"""
        style = ttk.Style()
        style.theme_use('clam')
        
        # 配置颜色
        self.bg_color = "#f0f8ff"
        self.accent_color = "#1e90ff"
        self.secondary_color = "#f5f5f5"
        
        self.root.configure(bg=self.bg_color)
    
    def create_main_layout(self):
        """创建主界面布局"""
        # 创建笔记本（标签页）
        self.notebook = ttk.Notebook(self.root)
        self.notebook.pack(fill='both', expand=True, padx=10, pady=10)
        
        # 创建各个标签页
        self.create_basic_info_tab()
        self.create_itinerary_tab()
        self.create_budget_tab()
        self.create_packing_tab()
        self.create_summary_tab()
        
        # 创建底部按钮
        self.create_bottom_buttons()
    
    def create_basic_info_tab(self):
        """创建基本信息标签页"""
        self.basic_frame = ttk.Frame(self.notebook)
        self.notebook.add(self.basic_frame, text="基本信息")
        
        # 创建框架
        form_frame = ttk.LabelFrame(self.basic_frame, text="旅行基本信息", padding=20)
        form_frame.pack(fill='both', expand=True, padx=20, pady=20)
        
        # 表单字段
        fields = [
            ("目的地:", "destination"),
            ("出发日期:", "start_date"),
            ("返回日期:", "end_date"),
            ("旅行人数:", "travelers"),
            ("预算总额:", "total_budget"),
            ("旅行类型:", "trip_type")
        ]
        
        self.basic_entries = {}
        
        for i, (label, key) in enumerate(fields):
            # 标签
            lbl = ttk.Label(form_frame, text=label, font=('Arial', 10))
            lbl.grid(row=i, column=0, sticky='w', pady=10, padx=(0, 10))
            
            # 输入框
            if key in ['travelers', 'total_budget']:
                entry = ttk.Entry(form_frame, width=30)
            elif key == 'trip_type':
                entry = ttk.Combobox(form_frame, width=28, 
                                   values=["休闲度假", "商务旅行", "探险旅行", "家庭旅行", "背包客"])
            else:
                entry = ttk.Entry(form_frame, width=30)
            
            entry.grid(row=i, column=1, pady=10, sticky='w')
            self.basic_entries[key] = entry
        
        # 添加备注
        ttk.Label(form_frame, text="备注:", font=('Arial', 10)).grid(row=6, column=0, sticky='nw', pady=10)
        self.notes_text = scrolledtext.ScrolledText(form_frame, width=40, height=5)
        self.notes_text.grid(row=6, column=1, pady=10, sticky='w')
    
    def create_itinerary_tab(self):
        """创建行程安排标签页"""
        self.itinerary_frame = ttk.Frame(self.notebook)
        self.notebook.add(self.itinerary_frame, text="行程安排")
        
        # 顶部控制面板
        control_frame = ttk.Frame(self.itinerary_frame)
        control_frame.pack(fill='x', padx=20, pady=(20, 10))
        
        ttk.Button(control_frame, text="添加行程", 
                  command=self.add_itinerary_item).pack(side='left', padx=5)
        ttk.Button(control_frame, text="删除行程", 
                  command=self.delete_itinerary_item).pack(side='left', padx=5)
        
        # 创建Treeview显示行程
        columns = ('日期', '时间', '活动', '地点', '备注')
        self.itinerary_tree = ttk.Treeview(self.itinerary_frame, columns=columns, show='headings', height=15)
        
        # 设置列标题
        for col in columns:
            self.itinerary_tree.heading(col, text=col)
            self.itinerary_tree.column(col, width=150)
        
        # 添加滚动条
        scrollbar = ttk.Scrollbar(self.itinerary_frame, orient='vertical', 
                                 command=self.itinerary_tree.yview)
        self.itinerary_tree.configure(yscrollcommand=scrollbar.set)
        
        self.itinerary_tree.pack(side='left', fill='both', expand=True, padx=(20, 0), pady=10)
        scrollbar.pack(side='right', fill='y', padx=(0, 20), pady=10)
        
        # 详情编辑区域
        detail_frame = ttk.LabelFrame(self.itinerary_frame, text="行程详情", padding=10)
        detail_frame.pack(fill='x', padx=20, pady=10)
        
        ttk.Label(detail_frame, text="日期:").grid(row=0, column=0, sticky='w', pady=5)
        self.itinerary_date = ttk.Entry(detail_frame, width=20)
        self.itinerary_date.grid(row=0, column=1, pady=5, padx=5)
        
        ttk.Label(detail_frame, text="时间:").grid(row=0, column=2, sticky='w', pady=5, padx=(20,0))
        self.itinerary_time = ttk.Entry(detail_frame, width=20)
        self.itinerary_time.grid(row=0, column=3, pady=5, padx=5)
        
        ttk.Label(detail_frame, text="活动:").grid(row=1, column=0, sticky='w', pady=5)
        self.itinerary_activity = ttk.Entry(detail_frame, width=50)
        self.itinerary_activity.grid(row=1, column=1, columnspan=3, pady=5, padx=5, sticky='ew')
        
        ttk.Label(detail_frame, text="地点:").grid(row=2, column=0, sticky='w', pady=5)
        self.itinerary_location = ttk.Entry(detail_frame, width=50)
        self.itinerary_location.grid(row=2, column=1, columnspan=3, pady=5, padx=5, sticky='ew')
        
        ttk.Label(detail_frame, text="备注:").grid(row=3, column=0, sticky='nw', pady=5)
        self.itinerary_notes = scrolledtext.ScrolledText(detail_frame, width=50, height=4)
        self.itinerary_notes.grid(row=3, column=1, columnspan=3, pady=5, padx=5, sticky='ew')
        
        ttk.Button(detail_frame, text="保存修改", 
                  command=self.save_itinerary_item).grid(row=4, column=3, pady=10, sticky='e')
    
    def create_budget_tab(self):
        """创建预算管理标签页"""
        self.budget_frame = ttk.Frame(self.notebook)
        self.notebook.add(self.budget_frame, text="预算管理")
        
        # 创建左右两栏
        left_frame = ttk.Frame(self.budget_frame)
        left_frame.pack(side='left', fill='both', expand=True, padx=20, pady=20)
        
        right_frame = ttk.Frame(self.budget_frame)
        right_frame.pack(side='right', fill='both', expand=True, padx=20, pady=20)
        
        # 左侧：预算项目
        budget_list_frame = ttk.LabelFrame(left_frame, text="预算项目", padding=10)
        budget_list_frame.pack(fill='both', expand=True)
        
        columns = ('项目', '预算金额', '实际花费')
        self.budget_tree = ttk.Treeview(budget_list_frame, columns=columns, show='headings', height=10)
        
        for col in columns:
            self.budget_tree.heading(col, text=col)
            self.budget_tree.column(col, width=120)
        
        # 添加示例数据
        sample_items = [
            ('交通', '¥2,000', '¥0'),
            ('住宿', '¥3,000', '¥0'),
            ('餐饮', '¥1,500', '¥0'),
            ('门票', '¥800', '¥0'),
            ('购物', '¥1,000', '¥0'),
            ('其他', '¥700', '¥0')
        ]
        
        for item in sample_items:
            self.budget_tree.insert('', 'end', values=item)
        
        scrollbar = ttk.Scrollbar(budget_list_frame, orient='vertical', 
                                 command=self.budget_tree.yview)
        self.budget_tree.configure(yscrollcommand=scrollbar.set)
        
        self.budget_tree.pack(side='left', fill='both', expand=True)
        scrollbar.pack(side='right', fill='y')
        
        # 右侧：预算详情
        detail_frame = ttk.LabelFrame(right_frame, text="预算详情", padding=20)
        detail_frame.pack(fill='both', expand=True)
        
        ttk.Label(detail_frame, text="总预算:").grid(row=0, column=0, sticky='w', pady=5)
        self.total_budget_label = ttk.Label(detail_frame, text="¥0", font=('Arial', 12, 'bold'))
        self.total_budget_label.grid(row=0, column=1, sticky='w', pady=5, padx=10)
        
        ttk.Label(detail_frame, text="已分配:").grid(row=1, column=0, sticky='w', pady=5)
        self.allocated_label = ttk.Label(detail_frame, text="¥0", font=('Arial', 12))
        self.allocated_label.grid(row=1, column=1, sticky='w', pady=5, padx=10)
        
        ttk.Label(detail_frame, text="剩余预算:").grid(row=2, column=0, sticky='w', pady=5)
        self.remaining_label = ttk.Label(detail_frame, text="¥0", font=('Arial', 12, 'bold'), 
                                        foreground='green')
        self.remaining_label.grid(row=2, column=1, sticky='w', pady=5, padx=10)
        
        # 添加预算项
        add_frame = ttk.LabelFrame(right_frame, text="添加预算项", padding=20)
        add_frame.pack(fill='x', pady=(20, 0))
        
        ttk.Label(add_frame, text="项目名称:").grid(row=0, column=0, sticky='w', pady=5)
        self.new_budget_item = ttk.Entry(add_frame, width=20)
        self.new_budget_item.grid(row=0, column=1, pady=5, padx=5)
        
        ttk.Label(add_frame, text="预算金额:").grid(row=1, column=0, sticky='w', pady=5)
        self.new_budget_amount = ttk.Entry(add_frame, width=20)
        self.new_budget_amount.grid(row=1, column=1, pady=5, padx=5)
        
        ttk.Button(add_frame, text="添加", 
                  command=self.add_budget_item).grid(row=2, column=1, pady=10, sticky='e')
        
        # 更新预算显示
        self.update_budget_summary()
    
    def create_packing_tab(self):
        """创建打包清单标签页"""
        self.packing_frame = ttk.Frame(self.notebook)
        self.notebook.add(self.packing_frame, text="打包清单")
        
        # 创建两栏
        left_frame = ttk.Frame(self.packing_frame)
        left_frame.pack(side='left', fill='both', expand=True, padx=20, pady=20)
        
        right_frame = ttk.Frame(self.packing_frame)
        right_frame.pack(side='right', fill='both', expand=True, padx=20, pady=20)
        
        # 左侧：分类清单
        categories = ["衣物", "洗漱用品", "电子产品", "证件", "药品", "其他"]
        
        for i, category in enumerate(categories):
            cat_frame = ttk.LabelFrame(left_frame, text=category, padding=10)
            cat_frame.pack(fill='x', pady=5)
            
            # 添加示例物品
            sample_items = {
                "衣物": ["T恤 x3", "裤子 x2", "外套 x1", "内衣 x3", "袜子 x4"],
                "洗漱用品": ["牙刷", "牙膏", "毛巾", "洗发水", "沐浴露"],
                "电子产品": ["手机", "充电器", "充电宝", "耳机", "相机"],
                "证件": ["身份证", "护照", "银行卡", "现金", "机票"],
                "药品": ["感冒药", "创可贴", "肠胃药", "晕车药"],
                "其他": ["水杯", "雨伞", "纸巾", "零食"]
            }
            
            items = sample_items.get(category, [])
            for item in items:
                var = tk.BooleanVar(value=False)
                cb = ttk.Checkbutton(cat_frame, text=item, variable=var)
                cb.pack(anchor='w')
        
        # 右侧：添加物品
        add_frame = ttk.LabelFrame(right_frame, text="添加物品", padding=20)
        add_frame.pack(fill='both', expand=True)
        
        ttk.Label(add_frame, text="物品名称:").grid(row=0, column=0, sticky='w', pady=5)
        self.new_item_name = ttk.Entry(add_frame, width=25)
        self.new_item_name.grid(row=0, column=1, pady=5, padx=5)
        
        ttk.Label(add_frame, text="分类:").grid(row=1, column=0, sticky='w', pady=5)
        self.new_item_category = ttk.Combobox(add_frame, width=23, values=categories)
        self.new_item_category.grid(row=1, column=1, pady=5, padx=5)
        self.new_item_category.set("其他")
        
        ttk.Label(add_frame, text="数量:").grid(row=2, column=0, sticky='w', pady=5)
        self.new_item_quantity = ttk.Spinbox(add_frame, from_=1, to=20, width=23)
        self.new_item_quantity.grid(row=2, column=1, pady=5, padx=5)
        
        ttk.Label(add_frame, text="备注:").grid(row=3, column=0, sticky='w', pady=5)
        self.new_item_notes = ttk.Entry(add_frame, width=25)
        self.new_item_notes.grid(row=3, column=1, pady=5, padx=5)
        
        ttk.Button(add_frame, text="添加到清单", 
                  command=self.add_packing_item).grid(row=4, column=1, pady=20, sticky='e')
        
        # 打包进度
        progress_frame = ttk.LabelFrame(right_frame, text="打包进度", padding=20)
        progress_frame.pack(fill='x', pady=(20, 0))
        
        self.packing_progress = ttk.Progressbar(progress_frame, length=300, mode='determinate')
        self.packing_progress.pack(pady=10)
        self.packing_progress['value'] = 30
        
        self.progress_label = ttk.Label(progress_frame, text="30% 已完成")
        self.progress_label.pack()
    
    def create_summary_tab(self):
        """创建旅行摘要标签页"""
        self.summary_frame = ttk.Frame(self.notebook)
        self.notebook.add(self.summary_frame, text="旅行摘要")
        
        # 创建主框架
        main_frame = ttk.Frame(self.summary_frame)
        main_frame.pack(fill='both', expand=True, padx=20, pady=20)
        
        # 左侧：统计信息
        stats_frame = ttk.LabelFrame(main_frame, text="旅行统计", padding=20)
        stats_frame.pack(side='left', fill='both', expand=True, padx=(0, 10))
        
        stats_data = [
            ("目的地:", "北京"),
            ("旅行天数:", "5天"),
            ("旅行人数:", "2人"),
            ("总预算:", "¥9,000"),
            ("已规划行程:", "8项"),
            ("打包物品:", "24件")
        ]
        
        for i, (label, value) in enumerate(stats_data):
            ttk.Label(stats_frame, text=label, font=('Arial', 10)).grid(
                row=i, column=0, sticky='w', pady=8)
            ttk.Label(stats_frame, text=value, font=('Arial', 10, 'bold')).grid(
                row=i, column=1, sticky='w', pady=8, padx=10)
        
        # 右侧：旅行提示
        tips_frame = ttk.LabelFrame(main_frame, text="旅行提示", padding=20)
        tips_frame.pack(side='right', fill='both', expand=True, padx=(10, 0))
        
        tips = [
            "✓ 提前查看天气预报，准备合适的衣物",
            "✓ 确认所有证件都在有效期内",
            "✓ 预订住宿和交通，避免旺季无房",
            "✓ 准备常用药品和急救包",
            "✓ 备份重要文件电子版",
            "✓ 告知家人或朋友你的行程安排",
            "✓ 了解当地风俗和法律法规",
            "✓ 准备适量现金和信用卡"
        ]
        
        for i, tip in enumerate(tips):
            ttk.Label(tips_frame, text=tip, font=('Arial', 9)).pack(anchor='w', pady=5)
        
        # 底部：导出功能
        export_frame = ttk.LabelFrame(self.summary_frame, text="导出旅行计划", padding=20)
        export_frame.pack(fill='x', padx=20, pady=20)
        
        ttk.Button(export_frame, text="导出为JSON", 
                  command=self.export_to_json).pack(side='left', padx=10)
        ttk.Button(export_frame, text="导出为文本文件", 
                  command=self.export_to_text).pack(side='left', padx=10)
        ttk.Button(export_frame, text="打印计划", 
                  command=self.print_plan).pack(side='left', padx=10)
    
    def create_bottom_buttons(self):
        """创建底部按钮"""
        button_frame = ttk.Frame(self.root)
        button_frame.pack(fill='x', padx=20, pady=(0, 20))
        
        ttk.Button(button_frame, text="保存计划", 
                  command=self.save_plan).pack(side='left', padx=5)
        ttk.Button(button_frame, text="加载计划", 
                  command=self.load_plan).pack(side='left', padx=5)
        ttk.Button(button_frame, text="重置", 
                  command=self.reset_plan).pack(side='left', padx=5)
        ttk.Button(button_frame, text="退出", 
                  command=self.root.quit).pack(side='right', padx=5)
    
    def load_sample_data(self):
        """加载示例数据"""
        # 基本信息示例
        sample_data = {
            "destination": "北京",
            "start_date": "2024-10-01",
            "end_date": "2024-10-05",
            "travelers": "2",
            "total_budget": "9000",
            "trip_type": "休闲度假"
        }
        
        for key, value in sample_data.items():
            if key in self.basic_entries:
                self.basic_entries[key].delete(0, tk.END)
                self.basic_entries[key].insert(0, value)
        
        # 添加示例行程
        sample_itinerary = [
            ("2024-10-01", "09:00", "抵达北京", "北京首都机场", "航班号：CA1234"),
            ("2024-10-01", "14:00", "游览故宫", "故宫博物院", "提前预约门票"),
            ("2024-10-02", "08:00", "登长城", "八达岭长城", "穿舒适的鞋子"),
            ("2024-10-02", "19:00", "观看京剧", "梅兰芳大剧院", "已预订VIP座位"),
            ("2024-10-03", "10:00", "参观颐和园", "颐和园", "带上相机"),
            ("2024-10-04", "全天", "自由活动", "王府井大街", "购物和品尝小吃"),
            ("2024-10-05", "16:00", "返程", "北京首都机场", "提前2小时到达机场")
        ]
        
        for item in sample_itinerary:
            self.itinerary_tree.insert('', 'end', values=item)
    
    def add_itinerary_item(self):
        """添加行程项目"""
        date = self.itinerary_date.get() or "2024-10-01"
        time = self.itinerary_time.get() or "10:00"
        activity = self.itinerary_activity.get() or "新活动"
        location = self.itinerary_location.get() or "地点"
        notes = self.itinerary_notes.get("1.0", tk.END).strip() or "备注"
        
        if activity and location:
            self.itinerary_tree.insert('', 'end', values=(date, time, activity, location, notes))
            messagebox.showinfo("成功", "行程已添加！")
            
            # 清空输入框
            self.itinerary_date.delete(0, tk.END)
            self.itinerary_time.delete(0, tk.END)
            self.itinerary_activity.delete(0, tk.END)
            self.itinerary_location.delete(0, tk.END)
            self.itinerary_notes.delete("1.0", tk.END)
        else:
            messagebox.showwarning("警告", "请填写活动和地点！")
    
    def delete_itinerary_item(self):
        """删除行程项目"""
        selected = self.itinerary_tree.selection()
        if selected:
            self.itinerary_tree.delete(selected)
        else:
            messagebox.showwarning("警告", "请先选择要删除的行程！")
    
    def save_itinerary_item(self):
        """保存行程修改"""
        selected = self.itinerary_tree.selection()
        if selected:
            date = self.itinerary_date.get()
            time = self.itinerary_time.get()
            activity = self.itinerary_activity.get()
            location = self.itinerary_location.get()
            notes = self.itinerary_notes.get("1.0", tk.END).strip()
            
            if activity and location:
                self.itinerary_tree.item(selected, values=(date, time, activity, location, notes))
                messagebox.showinfo("成功", "行程已更新！")
            else:
                messagebox.showwarning("警告", "请填写活动和地点！")
        else:
            messagebox.showwarning("警告", "请先选择要修改的行程！")
    
    def add_budget_item(self):
        """添加预算项目"""
        item = self.new_budget_item.get()
        amount = self.new_budget_amount.get()
        
        if item and amount:
            self.budget_tree.insert('', 'end', values=(item, f"¥{amount}", "¥0"))
            self.new_budget_item.delete(0, tk.END)
            self.new_budget_amount.delete(0, tk.END)
            self.update_budget_summary()
        else:
            messagebox.showwarning("警告", "请填写项目名称和金额！")
    
    def update_budget_summary(self):
        """更新预算摘要"""
        total = 0
        for child in self.budget_tree.get_children():
            values = self.budget_tree.item(child)['values']
            if values and len(values) > 1:
                # 提取数字部分
                budget_str = values[1].replace('¥', '').replace(',', '')
                try:
                    total += float(budget_str)
                except ValueError:
                    pass
        
        self.total_budget_label.config(text=f"¥{total:,.2f}")
        self.allocated_label.config(text=f"¥{total:,.2f}")
        self.remaining_label.config(text=f"¥0.00")
    
    def add_packing_item(self):
        """添加打包物品"""
        messagebox.showinfo("提示", "物品已添加到清单！\n（此功能为演示，实际实现需要更复杂的逻辑）")
    
    def save_plan(self):
        """保存旅行计划"""
        messagebox.showinfo("保存", "旅行计划已保存！\n（此功能为演示，实际实现需要文件操作）")
    
    def load_plan(self):
        """加载旅行计划"""
        messagebox.showinfo("加载", "请选择要加载的旅行计划文件\n（此功能为演示，实际实现需要文件对话框）")
    
    def reset_plan(self):
        """重置旅行计划"""
        if messagebox.askyesno("确认", "确定要重置所有数据吗？"):
            # 清空所有数据
            for entry in self.basic_entries.values():
                entry.delete(0, tk.END)
            
            self.notes_text.delete("1.0", tk.END)
            
            for item in self.itinerary_tree.get_children():
                self.itinerary_tree.delete(item)
            
            messagebox.showinfo("重置", "所有数据已重置！")
    
    def export_to_json(self):
        """导出为JSON"""
        messagebox.showinfo("导出", "旅行计划已导出为JSON文件！\n（此功能为演示）")
    
    def export_to_text(self):
        """导出为文本文件"""
        messagebox.showinfo("导出", "旅行计划已导出为文本文件！\n（此功能为演示）")
    
    def print_plan(self):
        """打印计划"""
        messagebox.showinfo("打印", "准备打印旅行计划...\n（此功能为演示）")

def main():
    """主函数"""
    root = tk.Tk()
    app = TravelPlannerApp(root)
    root.mainloop()

if __name__ == "__main__":
    main()