import tkinter as tk
from tkinter import ttk, messagebox, simpledialog
from datetime import datetime, timedelta
import json
import os
from PIL import Image, ImageTk
import calendar
from tkinter import font as tkfont
import re

class CalendarApp:
    def __init__(self, root):
        self.root = root
        self.root.title("智能日历提醒与计划表")
        self.root.geometry("1200x700")
        self.root.configure(bg='#f0f0f0')
        
        # 加载图标
        self.load_icons()
        
        # 当前日期
        self.current_date = datetime.now()
        self.selected_date = self.current_date
        
        # 存储事件
        self.events = {}
        self.load_events()
        
        # 创建UI
        self.setup_ui()
        
        # 更新显示
        self.update_calendar()
        self.update_event_list()
        
    def load_icons(self):
        """创建简单的图标"""
        self.icon_cache = {}
        
        # 颜色方案
        self.colors = {
            'primary': '#2c3e50',
            'secondary': '#3498db',
            'accent': '#e74c3c',
            'success': '#2ecc71',
            'warning': '#f39c12',
            'light': '#ecf0f1',
            'dark': '#34495e',
            'sidebar': '#2c3e50',
            'main_bg': '#f5f7fa'
        }
        
    def setup_ui(self):
        """设置用户界面"""
        # 主容器
        main_container = tk.Frame(self.root, bg=self.colors['main_bg'])
        main_container.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        # 侧边栏
        self.setup_sidebar(main_container)
        
        # 分割线
        separator = ttk.Separator(main_container, orient='vertical')
        separator.pack(side=tk.LEFT, fill=tk.Y, padx=5)
        
        # 主要内容区域
        content_frame = tk.Frame(main_container, bg=self.colors['main_bg'])
        content_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=(10, 0))
        
        # 顶部工具栏
        self.setup_toolbar(content_frame)
        
        # 日历区域
        self.setup_calendar_area(content_frame)
        
        # 事件列表
        self.setup_event_list(content_frame)
        
    def setup_sidebar(self, parent):
        """设置侧边栏"""
        sidebar = tk.Frame(parent, bg=self.colors['sidebar'], width=250)
        sidebar.pack(side=tk.LEFT, fill=tk.Y)
        sidebar.pack_propagate(False)
        
        # Logo/标题
        title_frame = tk.Frame(sidebar, bg=self.colors['sidebar'])
        title_frame.pack(fill=tk.X, pady=(20, 30))
        
        title_label = tk.Label(title_frame, text="📅 智能日历", 
                              font=('Microsoft YaHei', 20, 'bold'),
                              fg='white', bg=self.colors['sidebar'])
        title_label.pack(pady=5)
        
        subtitle_label = tk.Label(title_frame, text="日程管理与提醒", 
                                 font=('Microsoft YaHei', 10),
                                 fg='#bdc3c7', bg=self.colors['sidebar'])
        subtitle_label.pack()
        
        # 功能按钮
        buttons = [
            ("📅 今天", self.go_to_today),
            ("➕ 添加事件", self.add_event),
            ("📋 所有事件", self.show_all_events),
            ("🔍 搜索事件", self.search_events),
            ("📊 月视图", lambda: self.change_view('month')),
            ("📅 周视图", lambda: self.change_view('week')),
            ("💾 保存", self.save_events),
            ("⚙️ 设置", self.show_settings)
        ]
        
        for text, command in buttons:
            btn = tk.Button(sidebar, text=text, font=('Microsoft YaHei', 11),
                           bg=self.colors['secondary'], fg='white',
                           relief=tk.FLAT, padx=20, pady=10,
                           command=command, anchor='w')
            btn.pack(fill=tk.X, padx=10, pady=5)
            btn.bind("<Enter>", lambda e, b=btn: b.config(bg='#2980b9'))
            btn.bind("<Leave>", lambda e, b=btn: b.config(bg=self.colors['secondary']))
        
        # 今日概览
        self.setup_today_overview(sidebar)
        
    def setup_today_overview(self, parent):
        """设置今日概览"""
        overview_frame = tk.Frame(parent, bg=self.colors['dark'])
        overview_frame.pack(fill=tk.X, padx=10, pady=20)
        
        overview_title = tk.Label(overview_frame, text="📊 今日概览", 
                                 font=('Microsoft YaHei', 12, 'bold'),
                                 fg='white', bg=self.colors['dark'])
        overview_title.pack(pady=(10, 5))
        
        # 今日事件数量
        today_str = self.current_date.strftime("%Y-%m-%d")
        today_events = self.events.get(today_str, [])
        
        total_label = tk.Label(overview_frame, 
                              text=f"📅 总事件: {len(today_events)}",
                              font=('Microsoft YaHei', 10),
                              fg='white', bg=self.colors['dark'])
        total_label.pack(pady=2)
        
        # 已完成事件
        completed = sum(1 for event in today_events if event.get('completed', False))
        completed_label = tk.Label(overview_frame, 
                                  text=f"✅ 已完成: {completed}",
                                  font=('Microsoft YaHei', 10),
                                  fg='white', bg=self.colors['dark'])
        completed_label.pack(pady=2)
        
        # 待办事件
        pending = sum(1 for event in today_events if not event.get('completed', False))
        pending_label = tk.Label(overview_frame, 
                                text=f"⏰ 待办: {pending}",
                                font=('Microsoft YaHei', 10),
                                fg='white', bg=self.colors['dark'])
        pending_label.pack(pady=(2, 10))
        
    def setup_toolbar(self, parent):
        """设置工具栏"""
        toolbar = tk.Frame(parent, bg=self.colors['light'], height=50)
        toolbar.pack(fill=tk.X, pady=(0, 10))
        toolbar.pack_propagate(False)
        
        # 日期显示
        self.date_label = tk.Label(toolbar, 
                                  font=('Microsoft YaHei', 16, 'bold'),
                                  bg=self.colors['light'])
        self.date_label.pack(side=tk.LEFT, padx=20)
        
        # 导航按钮
        nav_frame = tk.Frame(toolbar, bg=self.colors['light'])
        nav_frame.pack(side=tk.RIGHT, padx=20)
        
        buttons = [
            ("◀◀", lambda: self.change_month(-12), "上一年"),
            ("◀", lambda: self.change_month(-1), "上一月"),
            ("今天", self.go_to_today, "回到今天"),
            ("▶", lambda: self.change_month(1), "下一月"),
            ("▶▶", lambda: self.change_month(12), "下一年")
        ]
        
        for text, command, tooltip in buttons:
            btn = tk.Button(nav_frame, text=text, font=('Microsoft YaHei', 10),
                           bg=self.colors['secondary'], fg='white',
                           relief=tk.RAISED, padx=10, pady=5,
                           command=command)
            btn.pack(side=tk.LEFT, padx=2)
            self.create_tooltip(btn, tooltip)
            
    def setup_calendar_area(self, parent):
        """设置日历区域"""
        calendar_frame = tk.Frame(parent, bg=self.colors['main_bg'])
        calendar_frame.pack(fill=tk.BOTH, expand=True, pady=(0, 10))
        
        # 星期标题
        weekdays_frame = tk.Frame(calendar_frame, bg=self.colors['light'])
        weekdays_frame.pack(fill=tk.X)
        
        weekdays = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
        for i, day in enumerate(weekdays):
            label = tk.Label(weekdays_frame, text=day, 
                           font=('Microsoft YaHei', 11, 'bold'),
                           bg=self.colors['primary'], fg='white',
                           width=12, height=2)
            label.grid(row=0, column=i, sticky='nsew', padx=1, pady=1)
            weekdays_frame.grid_columnconfigure(i, weight=1)
        
        # 日历网格容器
        self.calendar_grid = tk.Frame(calendar_frame, bg=self.colors['main_bg'])
        self.calendar_grid.pack(fill=tk.BOTH, expand=True)
        
    def setup_event_list(self, parent):
        """设置事件列表区域"""
        event_frame = tk.Frame(parent, bg=self.colors['main_bg'])
        event_frame.pack(fill=tk.BOTH, expand=True)
        
        # 标题
        title_frame = tk.Frame(event_frame, bg=self.colors['main_bg'])
        title_frame.pack(fill=tk.X, pady=(0, 5))
        
        tk.Label(title_frame, text="📋 事件列表", 
                font=('Microsoft YaHei', 14, 'bold'),
                bg=self.colors['main_bg']).pack(side=tk.LEFT)
        
        # 过滤器
        filter_frame = tk.Frame(title_frame, bg=self.colors['main_bg'])
        filter_frame.pack(side=tk.RIGHT)
        
        tk.Button(filter_frame, text="全部", font=('Microsoft YaHei', 9),
                 command=lambda: self.filter_events('all'),
                 bg=self.colors['secondary'], fg='white').pack(side=tk.LEFT, padx=2)
        tk.Button(filter_frame, text="待办", font=('Microsoft YaHei', 9),
                 command=lambda: self.filter_events('pending'),
                 bg=self.colors['warning'], fg='white').pack(side=tk.LEFT, padx=2)
        tk.Button(filter_frame, text="已完成", font=('Microsoft YaHei', 9),
                 command=lambda: self.filter_events('completed'),
                 bg=self.colors['success'], fg='white').pack(side=tk.LEFT, padx=2)
        
        # 事件列表容器
        list_container = tk.Frame(event_frame, bg=self.colors['light'])
        list_container.pack(fill=tk.BOTH, expand=True)
        
        # 滚动条
        scrollbar = tk.Scrollbar(list_container)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        
        # 事件列表
        self.event_listbox = tk.Listbox(list_container, 
                                       font=('Microsoft YaHei', 10),
                                       bg='white', 
                                       yscrollcommand=scrollbar.set,
                                       selectmode=tk.SINGLE,
                                       height=8)
        self.event_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        
        # 绑定事件
        self.event_listbox.bind('<<ListboxSelect>>', self.on_event_select)
        self.event_listbox.bind('<Double-Button-1>', self.edit_selected_event)
        
        scrollbar.config(command=self.event_listbox.yview)
        
        # 事件操作按钮
        button_frame = tk.Frame(event_frame, bg=self.colors['main_bg'])
        button_frame.pack(fill=tk.X, pady=(5, 0))
        
        buttons = [
            ("📝 编辑", self.edit_selected_event),
            ("✅ 完成", self.toggle_complete),
            ("❌ 删除", self.delete_selected_event),
            ("🔔 提醒", self.set_reminder)
        ]
        
        for text, command in buttons:
            tk.Button(button_frame, text=text, font=('Microsoft YaHei', 10),
                     bg=self.colors['secondary'], fg='white',
                     command=command).pack(side=tk.LEFT, padx=5, pady=5)
            
    def update_calendar(self):
        """更新日历显示"""
        # 清空日历网格
        for widget in self.calendar_grid.winfo_children():
            widget.destroy()
            
        # 更新日期标签
        self.date_label.config(text=self.current_date.strftime("%Y年 %B"))
        
        # 获取当前月份的第一天
        year = self.current_date.year
        month = self.current_date.month
        first_day = datetime(year, month, 1)
        
        # 获取该月天数
        _, days_in_month = calendar.monthrange(year, month)
        
        # 计算第一天是星期几 (0=周一, 6=周日)
        first_weekday = first_day.weekday()  # 0=周一, 6=周日
        
        # 填充日历
        day_num = 1
        for row in range(6):  # 最多6行
            for col in range(7):  # 7列
                if (row == 0 and col < first_weekday) or day_num > days_in_month:
                    # 空白单元格
                    frame = tk.Frame(self.calendar_grid, bg=self.colors['light'], 
                                    width=100, height=80)
                    frame.grid(row=row, column=col, padx=1, pady=1, sticky='nsew')
                else:
                    # 日期单元格
                    date_str = f"{year}-{month:02d}-{day_num:02d}"
                    date_obj = datetime(year, month, day_num)
                    
                    # 检查是否有事件
                    has_events = date_str in self.events and len(self.events[date_str]) > 0
                    
                    # 创建日期单元格
                    cell = self.create_date_cell(date_obj, day_num, has_events)
                    cell.grid(row=row, column=col, padx=1, pady=1, sticky='nsew')
                    
                    day_num += 1
                    
        # 设置网格权重
        for i in range(6):
            self.calendar_grid.grid_rowconfigure(i, weight=1)
        for i in range(7):
            self.calendar_grid.grid_columnconfigure(i, weight=1)
            
    def create_date_cell(self, date_obj, day_num, has_events):
        """创建日期单元格"""
        cell = tk.Frame(self.calendar_grid, bg='white', relief=tk.RAISED, borderwidth=1)
        
        # 判断是否是今天
        is_today = (date_obj.date() == self.current_date.date())
        is_selected = (date_obj.date() == self.selected_date.date())
        
        # 设置背景色
        if is_today:
            bg_color = self.colors['warning']
            fg_color = 'white'
        elif is_selected:
            bg_color = self.colors['secondary']
            fg_color = 'white'
        else:
            bg_color = 'white'
            fg_color = 'black'
            
        # 日期标签
        date_label = tk.Label(cell, text=str(day_num), 
                             font=('Microsoft YaHei', 12, 'bold'),
                             bg=bg_color, fg=fg_color)
        date_label.pack(anchor='nw', padx=5, pady=5)
        
        # 事件指示器
        if has_events:
            event_indicator = tk.Label(cell, text="•", 
                                      font=('Microsoft YaHei', 20),
                                      bg='white', fg=self.colors['accent'])
            event_indicator.pack(side=tk.BOTTOM, anchor='se', padx=5, pady=5)
            
        # 绑定点击事件
        cell.bind('<Button-1>', lambda e, d=date_obj: self.select_date(d))
        date_label.bind('<Button-1>', lambda e, d=date_obj: self.select_date(d))
        
        return cell
        
    def create_event_item(self, event, index):
        """创建事件列表项"""
        date_str = self.selected_date.strftime("%Y-%m-%d")
        event_data = self.events[date_str][index]
        
        # 根据事件状态设置颜色
        if event_data.get('completed', False):
            bg_color = '#d4edda'
            fg_color = '#155724'
            status = "✅ "
        else:
            bg_color = '#fff3cd' if event_data.get('priority') == 'high' else 'white'
            fg_color = '#856404' if event_data.get('priority') == 'high' else 'black'
            status = "⏰ "
            
        # 创建标签
        time_str = event_data.get('time', '全天')
        text = f"{status}{time_str} - {event_data['title']}"
        
        label = tk.Label(self.event_listbox, text=text, 
                        font=('Microsoft YaHei', 10),
                        bg=bg_color, fg=fg_color,
                        anchor='w', padx=10, pady=5)
        
        # 绑定事件
        label.bind('<Button-1>', lambda e, i=index: self.select_event(i))
        label.bind('<Double-Button-1>', lambda e: self.edit_selected_event())
        
        return label
        
    def select_date(self, date):
        """选择日期"""
        self.selected_date = date
        self.update_calendar()
        self.update_event_list()
        
    def select_event(self, index):
        """选择事件"""
        self.event_listbox.selection_clear(0, tk.END)
        self.event_listbox.selection_set(index)
        
    def on_event_select(self, event):
        """事件选择回调"""
        pass
        
    def update_event_list(self):
        """更新事件列表"""
        # 清空列表
        self.event_listbox.delete(0, tk.END)
        
        # 获取选中日期的事件
        date_str = self.selected_date.strftime("%Y-%m-%d")
        events = self.events.get(date_str, [])
        
        # 按时间排序
        events.sort(key=lambda x: x.get('time', ''))
        
        # 添加事件到列表
        for i, event in enumerate(events):
            time_str = event.get('time', '全天')
            status = "✅ " if event.get('completed', False) else "⏰ "
            
            # 添加优先级标记
            priority_mark = ""
            if event.get('priority') == 'high':
                priority_mark = " 🔥"
            elif event.get('priority') == 'medium':
                priority_mark = " ⚡"
                
            text = f"{status}{time_str} - {event['title']}{priority_mark}"
            self.event_listbox.insert(tk.END, text)
            
    def go_to_today(self):
        """回到今天"""
        self.current_date = datetime.now()
        self.selected_date = self.current_date
        self.update_calendar()
        self.update_event_list()
        
    def change_month(self, delta):
        """切换月份"""
        year = self.current_date.year
        month = self.current_date.month + delta
        
        if month > 12:
            year += 1
            month = 1
        elif month < 1:
            year -= 1
            month = 12
            
        self.current_date = datetime(year, month, 1)
        self.update_calendar()
        
    def change_view(self, view_type):
        """切换视图"""
        messagebox.showinfo("切换视图", f"切换到{view_type}视图")
        
    def add_event(self):
        """添加事件"""
        dialog = AddEventDialog(self.root, self.selected_date)
        self.root.wait_window(dialog.dialog)
        
        if dialog.result:
            self.save_event(dialog.result)
            
    def save_event(self, event_data):
        """保存事件"""
        date_str = event_data['date']
        
        if date_str not in self.events:
            self.events[date_str] = []
            
        # 检查是否有重复事件
        existing_titles = [e['title'] for e in self.events[date_str]]
        if event_data['title'] in existing_titles:
            if not messagebox.askyesno("重复事件", "已存在相同标题的事件，是否覆盖？"):
                return
            # 删除旧事件
            self.events[date_str] = [e for e in self.events[date_str] 
                                    if e['title'] != event_data['title']]
            
        self.events[date_str].append(event_data)
        self.update_event_list()
        self.update_calendar()
        self.save_events_to_file()
        
    def edit_selected_event(self, event=None):
        """编辑选中事件"""
        selection = self.event_listbox.curselection()
        if not selection:
            messagebox.showwarning("提示", "请先选择一个事件")
            return
            
        index = selection[0]
        date_str = self.selected_date.strftime("%Y-%m-%d")
        event_data = self.events[date_str][index]
        
        dialog = AddEventDialog(self.root, self.selected_date, event_data)
        self.root.wait_window(dialog.dialog)
        
        if dialog.result:
            # 更新事件
            self.events[date_str][index] = dialog.result
            self.update_event_list()
            self.save_events_to_file()
            
    def delete_selected_event(self):
        """删除选中事件"""
        selection = self.event_listbox.curselection()
        if not selection:
            messagebox.showwarning("提示", "请先选择一个事件")
            return
            
        index = selection[0]
        date_str = self.selected_date.strftime("%Y-%m-%d")
        
        if messagebox.askyesno("确认删除", "确定要删除这个事件吗？"):
            del self.events[date_str][index]
            
            # 如果当天没有事件了，删除日期键
            if not self.events[date_str]:
                del self.events[date_str]
                
            self.update_event_list()
            self.update_calendar()
            self.save_events_to_file()
            
    def toggle_complete(self):
        """切换完成状态"""
        selection = self.event_listbox.curselection()
        if not selection:
            messagebox.showwarning("提示", "请先选择一个事件")
            return
            
        index = selection[0]
        date_str = self.selected_date.strftime("%Y-%m-%d")
        
        # 切换完成状态
        self.events[date_str][index]['completed'] = not self.events[date_str][index].get('completed', False)
        self.update_event_list()
        self.save_events_to_file()
        
    def set_reminder(self):
        """设置提醒"""
        selection = self.event_listbox.curselection()
        if not selection:
            messagebox.showwarning("提示", "请先选择一个事件")
            return
            
        index = selection[0]
        date_str = self.selected_date.strftime("%Y-%m-%d")
        event_data = self.events[date_str][index]
        
        # 创建提醒设置对话框
        dialog = tk.Toplevel(self.root)
        dialog.title("设置提醒")
        dialog.geometry("300x200")
        dialog.configure(bg=self.colors['main_bg'])
        dialog.transient(self.root)
        dialog.grab_set()
        
        # 居中显示
        dialog.update_idletasks()
        width = dialog.winfo_width()
        height = dialog.winfo_height()
        x = (dialog.winfo_screenwidth() // 2) - (width // 2)
        y = (dialog.winfo_screenheight() // 2) - (height // 2)
        dialog.geometry(f'{width}x{height}+{x}+{y}')
        
        tk.Label(dialog, text=f"为事件设置提醒\n'{event_data['title']}'", 
                font=('Microsoft YaHei', 12), bg=self.colors['main_bg']).pack(pady=10)
        
        # 提醒时间选项
        time_frame = tk.Frame(dialog, bg=self.colors['main_bg'])
        time_frame.pack(pady=10)
        
        tk.Label(time_frame, text="提前提醒：", bg=self.colors['main_bg']).pack(side=tk.LEFT)
        
        time_var = tk.StringVar(value="5")
        time_options = ["1", "5", "10", "15", "30", "60"]
        time_menu = ttk.Combobox(time_frame, textvariable=time_var, 
                                values=time_options, width=8, state='readonly')
        time_menu.pack(side=tk.LEFT, padx=5)
        
        tk.Label(time_frame, text="分钟", bg=self.colors['main_bg']).pack(side=tk.LEFT)
        
        def save_reminder():
            minutes = int(time_var.get())
            event_data['reminder'] = minutes
            messagebox.showinfo("提醒设置", f"已设置提前{minutes}分钟提醒")
            dialog.destroy()
            
        # 按钮
        button_frame = tk.Frame(dialog, bg=self.colors['main_bg'])
        button_frame.pack(pady=20)
        
        tk.Button(button_frame, text="确定", command=save_reminder,
                 bg=self.colors['success'], fg='white').pack(side=tk.LEFT, padx=10)
        tk.Button(button_frame, text="取消", command=dialog.destroy,
                 bg=self.colors['secondary'], fg='white').pack(side=tk.LEFT, padx=10)
                 
    def filter_events(self, filter_type):
        """过滤事件"""
        date_str = self.selected_date.strftime("%Y-%m-%d")
        events = self.events.get(date_str, [])
        
        if filter_type == 'all':
            filtered_events = events
        elif filter_type == 'completed':
            filtered_events = [e for e in events if e.get('completed', False)]
        elif filter_type == 'pending':
            filtered_events = [e for e in events if not e.get('completed', False)]
        else:
            filtered_events = events
            
        # 更新列表显示
        self.event_listbox.delete(0, tk.END)
        for event in filtered_events:
            time_str = event.get('time', '全天')
            status = "✅ " if event.get('completed', False) else "⏰ "
            text = f"{status}{time_str} - {event['title']}"
            self.event_listbox.insert(tk.END, text)
            
    def show_all_events(self):
        """显示所有事件"""
        all_events = []
        for date_str, events in self.events.items():
            for event in events:
                all_events.append((date_str, event))
                
        # 按日期排序
        all_events.sort(key=lambda x: x[0])
        
        # 创建显示窗口
        dialog = tk.Toplevel(self.root)
        dialog.title("所有事件")
        dialog.geometry("600x400")
        dialog.configure(bg=self.colors['main_bg'])
        
        # 创建文本区域
        text_area = tk.Text(dialog, font=('Microsoft YaHei', 10), 
                           bg='white', wrap=tk.WORD)
        text_area.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        # 添加滚动条
        scrollbar = tk.Scrollbar(text_area)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        text_area.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=text_area.yview)
        
        # 插入事件
        current_date = ""
        for date_str, event in all_events:
            if date_str != current_date:
                current_date = date_str
                date_obj = datetime.strptime(date_str, "%Y-%m-%d")
                text_area.insert(tk.END, f"\n{date_obj.strftime('%Y年%m月%d日 %A')}\n")
                text_area.insert(tk.END, "="*40 + "\n")
                
            time_str = event.get('time', '全天')
            status = "✅ " if event.get('completed', False) else "⏰ "
            priority = ""
            if event.get('priority') == 'high':
                priority = " [🔥高优先级]"
            elif event.get('priority') == 'medium':
                priority = " [⚡中优先级]"
                
            text_area.insert(tk.END, f"  {status}{time_str} - {event['title']}{priority}\n")
            
    def search_events(self):
        """搜索事件"""
        search_text = simpledialog.askstring("搜索事件", "请输入搜索关键词:")
        if not search_text:
            return
            
        results = []
        for date_str, events in self.events.items():
            for event in events:
                if (search_text.lower() in event['title'].lower() or 
                    search_text.lower() in event.get('description', '').lower()):
                    results.append((date_str, event))
                    
        if not results:
            messagebox.showinfo("搜索结果", "未找到相关事件")
            return
            
        # 显示结果
        dialog = tk.Toplevel(self.root)
        dialog.title(f"搜索结果: {search_text}")
        dialog.geometry("600x400")
        dialog.configure(bg=self.colors['main_bg'])
        
        # 创建列表
        listbox = tk.Listbox(dialog, font=('Microsoft YaHei', 10), bg='white')
        listbox.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        scrollbar = tk.Scrollbar(listbox)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        listbox.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=listbox.yview)
        
        for date_str, event in results:
            date_obj = datetime.strptime(date_str, "%Y-%m-%d")
            time_str = event.get('time', '全天')
            status = "✅ " if event.get('completed', False) else "⏰ "
            text = f"{date_obj.strftime('%Y-%m-%d')} {time_str} - {event['title']}"
            listbox.insert(tk.END, text)
            
    def show_settings(self):
        """显示设置"""
        messagebox.showinfo("设置", "设置功能开发中...")
        
    def save_events(self):
        """保存事件"""
        self.save_events_to_file()
        messagebox.showinfo("保存成功", "事件已保存到文件")
        
    def save_events_to_file(self):
        """保存事件到文件"""
        try:
            with open('calendar_events.json', 'w', encoding='utf-8') as f:
                json.dump(self.events, f, ensure_ascii=False, indent=2)
        except Exception as e:
            messagebox.showerror("保存错误", f"保存失败: {str(e)}")
            
    def load_events(self):
        """从文件加载事件"""
        try:
            if os.path.exists('calendar_events.json'):
                with open('calendar_events.json', 'r', encoding='utf-8') as f:
                    self.events = json.load(f)
        except Exception as e:
            messagebox.showerror("加载错误", f"加载事件失败: {str(e)}")
            self.events = {}
            
    def create_tooltip(self, widget, text):
        """创建工具提示"""
        def enter(event):
            x, y, _, _ = widget.bbox("insert")
            x += widget.winfo_rootx() + 25
            y += widget.winfo_rooty() + 20
            
            # 创建工具提示窗口
            self.tooltip = tk.Toplevel(widget)
            self.tooltip.wm_overrideredirect(True)
            self.tooltip.wm_geometry(f"+{x}+{y}")
            
            label = tk.Label(self.tooltip, text=text, 
                            background="#ffffe0", relief='solid', borderwidth=1,
                            font=("Microsoft YaHei", "10", "normal"))
            label.pack()
            
        def leave(event):
            if hasattr(self, 'tooltip'):
                self.tooltip.destroy()
                
        widget.bind("<Enter>", enter)
        widget.bind("<Leave>", leave)


class AddEventDialog:
    def __init__(self, parent, date, event_data=None):
        self.parent = parent
        self.date = date
        self.event_data = event_data
        self.result = None
        
        # 创建对话框
        self.dialog = tk.Toplevel(parent)
        self.dialog.title("添加事件" if not event_data else "编辑事件")
        self.dialog.geometry("400x500")
        self.dialog.configure(bg='#f0f0f0')
        self.dialog.transient(parent)
        self.dialog.grab_set()
        
        # 居中显示
        self.dialog.update_idletasks()
        width = self.dialog.winfo_width()
        height = self.dialog.winfo_height()
        x = (self.dialog.winfo_screenwidth() // 2) - (width // 2)
        y = (self.dialog.winfo_screenheight() // 2) - (height // 2)
        self.dialog.geometry(f'{width}x{height}+{x}+{y}')
        
        # 创建UI
        self.setup_ui()
        
    def setup_ui(self):
        """设置对话框UI"""
        # 标题
        title = "添加新事件" if not self.event_data else "编辑事件"
        tk.Label(self.dialog, text=title, font=('Microsoft YaHei', 16, 'bold'),
                bg='#f0f0f0').pack(pady=10)
        
        # 日期显示
        date_str = self.date.strftime("%Y年%m月%d日 %A")
        tk.Label(self.dialog, text=date_str, font=('Microsoft YaHei', 12),
                bg='#f0f0f0', fg='#666666').pack(pady=5)
        
        # 表单容器
        form_frame = tk.Frame(self.dialog, bg='#f0f0f0')
        form_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)
        
        # 事件标题
        tk.Label(form_frame, text="事件标题:", font=('Microsoft YaHei', 10),
                bg='#f0f0f0').pack(anchor='w', pady=(5, 0))
        self.title_var = tk.StringVar(value=self.event_data.get('title', '') if self.event_data else '')
        title_entry = tk.Entry(form_frame, textvariable=self.title_var, 
                              font=('Microsoft YaHei', 10), width=40)
        title_entry.pack(fill=tk.X, pady=5)
        
        # 时间
        tk.Label(form_frame, text="时间:", font=('Microsoft YaHei', 10),
                bg='#f0f0f0').pack(anchor='w', pady=(10, 0))
        
        time_frame = tk.Frame(form_frame, bg='#f0f0f0')
        time_frame.pack(fill=tk.X, pady=5)
        
        self.time_var = tk.StringVar(value=self.event_data.get('time', '') if self.event_data else '')
        time_entry = tk.Entry(time_frame, textvariable=self.time_var, 
                             font=('Microsoft YaHei', 10), width=15)
        time_entry.pack(side=tk.LEFT)
        tk.Label(time_frame, text="(格式: HH:MM 或 '全天')", 
                font=('Microsoft YaHei', 9), bg='#f0f0f0', fg='#666666').pack(side=tk.LEFT, padx=5)
        
        # 优先级
        tk.Label(form_frame, text="优先级:", font=('Microsoft YaHei', 10),
                bg='#f0f0f0').pack(anchor='w', pady=(10, 0))
        
        self.priority_var = tk.StringVar(value=self.event_data.get('priority', 'low') if self.event_data else 'low')
        priority_frame = tk.Frame(form_frame, bg='#f0f0f0')
        priority_frame.pack(fill=tk.X, pady=5)
        
        priorities = [('低', 'low'), ('中', 'medium'), ('高', 'high')]
        for text, value in priorities:
            rb = tk.Radiobutton(priority_frame, text=text, value=value, 
                               variable=self.priority_var, bg='#f0f0f0')
            rb.pack(side=tk.LEFT, padx=10)
            
        # 描述
        tk.Label(form_frame, text="描述:", font=('Microsoft YaHei', 10),
                bg='#f0f0f0').pack(anchor='w', pady=(10, 0))
        
        self.desc_text = tk.Text(form_frame, height=8, width=40, 
                                font=('Microsoft YaHei', 10))
        self.desc_text.pack(fill=tk.BOTH, expand=True, pady=5)
        
        if self.event_data and 'description' in self.event_data:
            self.desc_text.insert('1.0', self.event_data['description'])
            
        # 完成状态
        self.completed_var = tk.BooleanVar(value=self.event_data.get('completed', False) if self.event_data else False)
        completed_check = tk.Checkbutton(form_frame, text="已完成", 
                                        variable=self.completed_var, bg='#f0f0f0')
        completed_check.pack(anchor='w', pady=10)
        
        # 按钮
        button_frame = tk.Frame(self.dialog, bg='#f0f0f0')
        button_frame.pack(fill=tk.X, padx=20, pady=10)
        
        tk.Button(button_frame, text="保存", command=self.save,
                 bg='#4CAF50', fg='white', font=('Microsoft YaHei', 10),
                 width=10).pack(side=tk.RIGHT, padx=5)
        tk.Button(button_frame, text="取消", command=self.dialog.destroy,
                 bg='#f44336', fg='white', font=('Microsoft YaHei', 10),
                 width=10).pack(side=tk.RIGHT, padx=5)
                 
    def save(self):
        """保存事件"""
        # 验证输入
        title = self.title_var.get().strip()
        if not title:
            messagebox.showerror("错误", "请输入事件标题")
            return
            
        time_str = self.time_var.get().strip()
        if time_str and time_str != '全天':
            # 验证时间格式
            if not re.match(r'^\d{1,2}:\d{2}$', time_str):
                messagebox.showerror("错误", "时间格式错误，请使用 HH:MM 格式")
                return
                
        # 创建事件数据
        self.result = {
            'title': title,
            'time': time_str if time_str else '全天',
            'priority': self.priority_var.get(),
            'description': self.desc_text.get('1.0', tk.END).strip(),
            'completed': self.completed_var.get(),
            'date': self.date.strftime("%Y-%m-%d"),
            'created': datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        }
        
        self.dialog.destroy()


def main():
    root = tk.Tk()
    app = CalendarApp(root)
    
    # 设置窗口图标
    try:
        root.iconbitmap('calendar.ico')
    except:
        pass
        
    # 绑定关闭事件
    def on_closing():
        if messagebox.askokcancel("退出", "确定要退出吗？"):
            app.save_events_to_file()
            root.destroy()
            
    root.protocol("WM_DELETE_WINDOW", on_closing)
    
    root.mainloop()


if __name__ == "__main__":
    main()