import tkinter as tk
from tkinter import ttk, messagebox, simpledialog, colorchooser
import datetime
import json
import os
import threading
import time
from tkcalendar import Calendar
from plyer import notification
import winsound
import random
from collections import defaultdict

class CuteCalendarApp:
    def __init__(self, root):
        self.root = root
        self.root.title("🌈 卡通日历提醒计划表")
        self.root.geometry("1000x650")
        self.root.configure(bg='#FFE6E6')
        
        # 可爱配色方案
        self.colors = {
            'bg': '#FFE6E6',
            'card': '#FFFFFF',
            'primary': '#FF9AA2',
            'secondary': '#FFB7B2',
            'accent': '#FFDAC1',
            'success': '#B5EAD7',
            'warning': '#FFD700',
            'danger': '#FF9AA2',
            'text': '#5A5A5A',
            'light': '#FFF9F9',
            'border': '#FFCCCC',
            'today': '#C7CEEA',
            'selected': '#B5EAD7',
            'event1': '#FFB7B2',  # 粉红
            'event2': '#FFDAC1',  # 橙色
            'event3': '#E2F0CB',  # 绿色
            'event4': '#B5EAD7',  # 青色
            'event5': '#C7CEEA',  # 蓝色
            'event6': '#D8BFD8',  # 紫色
        }
        
        # 卡通图标
        self.icons = {
            'event': '📅',
            'meeting': '👥',
            'birthday': '🎂',
            'task': '✅',
            'plan': '📋',
            'reminder': '⏰',
            'important': '⭐',
            'fun': '🎈',
            'study': '📚',
            'work': '💼',
            'health': '💪',
            'shopping': '🛍️',
            'food': '🍔',
            'travel': '✈️',
            'love': '💕',
            'star': '✨',
            'heart': '❤️',
            'sun': '☀️',
            'cloud': '☁️',
            'rainbow': '🌈',
        }
        
        # 加载数据
        self.data_file = "cute_calendar.json"
        self.load_data()
        
        # 当前日期
        self.current_date = datetime.date.today()
        self.selected_date = self.current_date
        
        # 创建UI
        self.setup_ui()
        
        # 启动提醒检查
        self.start_reminder_check()
        
        # 窗口关闭处理
        self.root.protocol("WM_DELETE_WINDOW", self.on_closing)
        
    def setup_ui(self):
        """创建卡通界面"""
        # 顶部标题栏
        title_frame = tk.Frame(self.root, bg=self.colors['primary'], height=60)
        title_frame.pack(fill=tk.X)
        title_frame.pack_propagate(False)
        
        title = tk.Label(
            title_frame,
            text=f"{self.icons['sun']} 卡通日历提醒计划表 {self.icons['rainbow']}",
            font=('Comic Sans MS', 20, 'bold'),
            bg=self.colors['primary'],
            fg='white'
        )
        title.pack(pady=10)
        
        # 主容器
        main_container = tk.Frame(self.root, bg=self.colors['bg'])
        main_container.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)
        
        # 左侧日历区域
        left_frame = tk.Frame(main_container, bg=self.colors['card'], bd=2, 
                            relief=tk.RAISED, highlightbackground=self.colors['border'])
        left_frame.pack(side=tk.LEFT, fill=tk.BOTH, padx=(0, 10))
        
        # 日历
        self.cal = Calendar(
            left_frame,
            selectmode='day',
            year=self.current_date.year,
            month=self.current_date.month,
            day=self.current_date.day,
            background='white',
            foreground='black',
            bordercolor=self.colors['border'],
            headersbackground=self.colors['primary'],
            headersforeground='white',
            normalbackground='white',
            normalforeground='black',
            weekendbackground='#FFF0F0',
            weekendforeground=self.colors['danger'],
            othermonthbackground='#FFF5F5',
            othermonthforeground='#AAAAAA',
            font=('Comic Sans MS', 10)
        )
        self.cal.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        self.cal.bind("<<CalendarSelected>>", self.on_date_selected)
        
        # 快速按钮
        btn_frame = tk.Frame(left_frame, bg=self.colors['card'])
        btn_frame.pack(fill=tk.X, padx=10, pady=(0, 10))
        
        buttons = [
            ("今天", self.go_today, 'primary'),
            ("昨天", self.go_yesterday, 'secondary'),
            ("明天", self.go_tomorrow, 'accent'),
        ]
        
        for text, cmd, color in buttons:
            btn = tk.Button(
                btn_frame,
                text=f"{self.icons['star']} {text}",
                command=cmd,
                bg=self.colors[color],
                fg='white',
                font=('Comic Sans MS', 10, 'bold'),
                relief=tk.RAISED,
                bd=2,
                cursor='hand2'
            )
            btn.pack(side=tk.LEFT, expand=True, fill=tk.X, padx=2)
        
        # 右侧事件区域
        right_frame = tk.Frame(main_container, bg=self.colors['card'], bd=2,
                              relief=tk.RAISED, highlightbackground=self.colors['border'])
        right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
        
        # 工具栏
        toolbar = tk.Frame(right_frame, bg=self.colors['primary'], height=50)
        toolbar.pack(fill=tk.X)
        toolbar.pack_propagate(False)
        
        # 添加事件按钮
        add_btn = tk.Button(
            toolbar,
            text=f"{self.icons['heart']} 添加新事件",
            command=self.add_event,
            bg=self.colors['success'],
            fg='white',
            font=('Comic Sans MS', 11, 'bold'),
            relief=tk.RAISED,
            bd=2,
            cursor='hand2'
        )
        add_btn.pack(side=tk.LEFT, padx=10, pady=5)
        
        # 颜色选择
        color_btn = tk.Button(
            toolbar,
            text=f"{self.icons['rainbow']} 选颜色",
            command=self.choose_color,
            bg=self.colors['accent'],
            fg='white',
            font=('Comic Sans MS', 11, 'bold'),
            relief=tk.RAISED,
            bd=2,
            cursor='hand2'
        )
        color_btn.pack(side=tk.LEFT, padx=5, pady=5)
        
        # 搜索框
        search_frame = tk.Frame(toolbar, bg=self.colors['primary'])
        search_frame.pack(side=tk.RIGHT, padx=10)
        
        search_entry = tk.Entry(
            search_frame,
            width=20,
            font=('Comic Sans MS', 10),
            bg='white',
            fg=self.colors['text'],
            relief=tk.SUNKEN,
            bd=2
        )
        search_entry.pack(side=tk.LEFT, padx=(0, 5))
        search_entry.insert(0, "🔍 搜索...")
        
        def clear_search(event):
            if search_entry.get() == "🔍 搜索...":
                search_entry.delete(0, tk.END)
        search_entry.bind('<FocusIn>', clear_search)
        
        def on_search(event):
            self.search_text = search_entry.get()
            self.refresh_events()
        search_entry.bind('<KeyRelease>', on_search)
        
        # 事件列表容器
        list_container = tk.Frame(right_frame, bg=self.colors['card'])
        list_container.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        # 滚动条
        canvas = tk.Canvas(list_container, bg=self.colors['card'], highlightthickness=0)
        scrollbar = tk.Scrollbar(list_container, orient=tk.VERTICAL, command=canvas.yview)
        self.scrollable_frame = tk.Frame(canvas, bg=self.colors['card'])
        
        self.scrollable_frame.bind(
            "<Configure>",
            lambda e: canvas.configure(scrollregion=canvas.bbox("all"))
        )
        
        canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw")
        canvas.configure(yscrollcommand=scrollbar.set)
        
        canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        
        # 鼠标滚轮支持
        def _on_mousewheel(event):
            canvas.yview_scroll(int(-1*(event.delta/120)), "units")
        canvas.bind_all("<MouseWheel>", _on_mousewheel)
        
        # 底部信息栏
        info_frame = tk.Frame(right_frame, bg=self.colors['light'], height=30)
        info_frame.pack(fill=tk.X, side=tk.BOTTOM)
        info_frame.pack_propagate(False)
        
        self.info_label = tk.Label(
            info_frame,
            text=f"✨ 今天有 0 个事件 | 总共 0 个事件",
            bg=self.colors['light'],
            fg=self.colors['text'],
            font=('Comic Sans MS', 10)
        )
        self.info_label.pack(pady=5)
        
        # 初始化显示
        self.refresh_events()
        
    def load_data(self):
        """加载数据"""
        if os.path.exists(self.data_file):
            try:
                with open(self.data_file, 'r', encoding='utf-8') as f:
                    data = json.load(f)
                    self.events = defaultdict(list, data)
            except:
                self.events = defaultdict(list)
        else:
            self.events = defaultdict(list)
            
        # 转换日期
        for date_str in list(self.events.keys()):
            for event in self.events[date_str]:
                if 'date' in event:
                    try:
                        event['date'] = datetime.datetime.strptime(event['date'], '%Y-%m-%d').date()
                    except:
                        try:
                            event['date'] = datetime.date.fromisoformat(event['date'])
                        except:
                            pass
        
    def save_data(self):
        """保存数据"""
        save_data = {}
        for date_str, events in self.events.items():
            save_data[date_str] = []
            for event in events:
                event_copy = event.copy()
                if 'date' in event_copy and isinstance(event_copy['date'], datetime.date):
                    event_copy['date'] = event_copy['date'].isoformat()
                save_data[date_str].append(event_copy)
        
        with open(self.data_file, 'w', encoding='utf-8') as f:
            json.dump(save_data, f, ensure_ascii=False, indent=2)
    
    def on_date_selected(self, event):
        """日期选择"""
        selected = self.cal.selection_get()
        if selected:
            self.selected_date = selected
            self.refresh_events()
    
    def go_today(self):
        """回到今天"""
        self.cal.selection_set(self.current_date)
        self.selected_date = self.current_date
        self.refresh_events()
    
    def go_yesterday(self):
        """昨天"""
        yesterday = self.selected_date - datetime.timedelta(days=1)
        self.cal.selection_set(yesterday)
        self.selected_date = yesterday
        self.refresh_events()
    
    def go_tomorrow(self):
        """明天"""
        tomorrow = self.selected_date + datetime.timedelta(days=1)
        self.cal.selection_set(tomorrow)
        self.selected_date = tomorrow
        self.refresh_events()
    
    def add_event(self):
        """添加新事件"""
        dialog = CuteEventDialog(self.root, self.selected_date, self.colors, self.icons)
        if dialog.result:
            event = dialog.result
            event['id'] = int(time.time())
            event['date'] = self.selected_date
            
            date_key = self.selected_date.isoformat()
            if date_key not in self.events:
                self.events[date_key] = []
            
            self.events[date_key].append(event)
            self.save_data()
            self.refresh_events()
            
            # 显示成功消息
            self.show_message(f"{self.icons['star']} 事件添加成功！")
    
    def choose_color(self):
        """选择颜色"""
        color = colorchooser.askcolor(title="选择颜色", initialcolor=self.colors['primary'])[1]
        if color:
            # 更新主题色
            self.colors['primary'] = color
            self.show_message(f"{self.icons['rainbow']} 主题色已更新！")
    
    def refresh_events(self):
        """刷新事件显示"""
        # 清除旧事件
        for widget in self.scrollable_frame.winfo_children():
            widget.destroy()
        
        date_key = self.selected_date.isoformat()
        events = self.events.get(date_key, [])
        
        if not events:
            # 显示无事件消息
            empty_label = tk.Label(
                self.scrollable_frame,
                text=f"{self.icons['cloud']} 今天没有安排哦~ 好好休息！{self.icons['sun']}",
                font=('Comic Sans MS', 16),
                bg=self.colors['card'],
                fg=self.colors['text']
            )
            empty_label.pack(pady=50)
            return
        
        # 按时间排序
        events.sort(key=lambda x: datetime.datetime.strptime(x.get('time', '00:00'), '%H:%M').time())
        
        for i, event in enumerate(events):
            # 创建事件卡片
            color_key = f"event{(i % 6) + 1}"
            card_color = self.colors[color_key]
            
            card = tk.Frame(
                self.scrollable_frame,
                bg=card_color,
                bd=2,
                relief=tk.RAISED,
                highlightbackground=self.colors['border']
            )
            card.pack(fill=tk.X, pady=5, padx=5)
            
            # 事件内容
            icon = self.icons.get(event.get('icon', 'event'), '📅')
            title = event.get('title', '未命名事件')
            time_str = event.get('time', '全天')
            tag = event.get('tag', '未分类')
            priority = event.get('priority', '中')
            
            # 卡片顶部
            top_frame = tk.Frame(card, bg=card_color)
            top_frame.pack(fill=tk.X, padx=10, pady=5)
            
            # 图标和标题
            icon_label = tk.Label(
                top_frame,
                text=icon,
                font=('Arial', 20),
                bg=card_color
            )
            icon_label.pack(side=tk.LEFT)
            
            title_label = tk.Label(
                top_frame,
                text=title,
                font=('Comic Sans MS', 12, 'bold'),
                bg=card_color,
                fg=self.colors['text']
            )
            title_label.pack(side=tk.LEFT, padx=10)
            
            # 时间和标签
            time_frame = tk.Frame(top_frame, bg=card_color)
            time_frame.pack(side=tk.RIGHT)
            
            time_label = tk.Label(
                time_frame,
                text=f"⏰ {time_str}",
                font=('Comic Sans MS', 10),
                bg=card_color,
                fg=self.colors['text']
            )
            time_label.pack(anchor='e')
            
            tag_label = tk.Label(
                time_frame,
                text=f"🏷️ {tag}",
                font=('Comic Sans MS', 9),
                bg=card_color,
                fg=self.colors['text']
            )
            tag_label.pack(anchor='e')
            
            # 描述
            description = event.get('description', '')
            if description:
                desc_frame = tk.Frame(card, bg=card_color)
                desc_frame.pack(fill=tk.X, padx=20, pady=(0, 5))
                
                desc_label = tk.Label(
                    desc_frame,
                    text=description,
                    font=('Comic Sans MS', 10),
                    bg=card_color,
                    fg=self.colors['text'],
                    wraplength=400,
                    justify=tk.LEFT
                )
                desc_label.pack(anchor='w')
            
            # 底部按钮
            bottom_frame = tk.Frame(card, bg=card_color)
            bottom_frame.pack(fill=tk.X, padx=20, pady=(0, 5))
            
            # 编辑按钮
            edit_btn = tk.Button(
                bottom_frame,
                text=f"{self.icons['star']} 编辑",
                command=lambda e=event: self.edit_event(e),
                bg=self.colors['success'],
                fg='white',
                font=('Comic Sans MS', 9, 'bold'),
                relief=tk.RAISED,
                cursor='hand2',
                width=8
            )
            edit_btn.pack(side=tk.LEFT, padx=2)
            
            # 删除按钮
            delete_btn = tk.Button(
                bottom_frame,
                text=f"{self.icons['danger']} 删除",
                command=lambda e=event: self.delete_event(e),
                bg=self.colors['danger'],
                fg='white',
                font=('Comic Sans MS', 9, 'bold'),
                relief=tk.RAISED,
                cursor='hand2',
                width=8
            )
            delete_btn.pack(side=tk.LEFT, padx=2)
            
            # 完成按钮
            done_btn = tk.Button(
                bottom_frame,
                text=f"{self.icons['heart']} 完成",
                command=lambda e=event: self.mark_done(e),
                bg=self.colors['primary'],
                fg='white',
                font=('Comic Sans MS', 9, 'bold'),
                relief=tk.RAISED,
                cursor='hand2',
                width=8
            )
            done_btn.pack(side=tk.LEFT, padx=2)
            
            # 优先级标记
            if priority == '高':
                tk.Label(
                    bottom_frame,
                    text="🔥 高优先级",
                    font=('Comic Sans MS', 9, 'bold'),
                    bg=card_color,
                    fg=self.colors['danger']
                ).pack(side=tk.RIGHT)
        
        # 更新信息栏
        total_events = sum(len(events) for events in self.events.values())
        today_events = len(self.events.get(self.current_date.isoformat(), []))
        self.info_label.config(
            text=f"✨ 今天有 {today_events} 个事件 | 总共 {total_events} 个事件 | {self.selected_date.strftime('%Y年%m月%d日')}"
        )
    
    def edit_event(self, event):
        """编辑事件"""
        dialog = CuteEventDialog(self.root, self.selected_date, self.colors, self.icons, event)
        if dialog.result:
            # 找到并更新事件
            date_key = self.selected_date.isoformat()
            for i, e in enumerate(self.events[date_key]):
                if e.get('id') == event.get('id'):
                    self.events[date_key][i] = dialog.result
                    self.events[date_key][i]['id'] = event.get('id')
                    self.events[date_key][i]['date'] = self.selected_date
                    self.save_data()
                    self.refresh_events()
                    self.show_message(f"{self.icons['star']} 事件更新成功！")
                    break
    
    def delete_event(self, event):
        """删除事件"""
        if messagebox.askyesno("确认删除", f"确定要删除 '{event.get('title')}' 吗？"):
            date_key = self.selected_date.isoformat()
            self.events[date_key] = [e for e in self.events[date_key] if e.get('id') != event.get('id')]
            self.save_data()
            self.refresh_events()
            self.show_message(f"{self.icons['heart']} 事件已删除")
    
    def mark_done(self, event):
        """标记完成"""
        date_key = self.selected_date.isoformat()
        for i, e in enumerate(self.events[date_key]):
            if e.get('id') == event.get('id'):
                self.events[date_key][i]['completed'] = True
                self.save_data()
                self.refresh_events()
                self.show_message(f"{self.icons['success']} 已完成！")
                break
    
    def show_message(self, message):
        """显示消息"""
        msg_window = tk.Toplevel(self.root)
        msg_window.title("✨ 消息")
        msg_window.geometry("300x100")
        msg_window.configure(bg=self.colors['success'])
        msg_window.transient(self.root)
        msg_window.grab_set()
        
        # 居中
        x = self.root.winfo_x() + (self.root.winfo_width() // 2) - 150
        y = self.root.winfo_y() + (self.root.winfo_height() // 2) - 50
        msg_window.geometry(f"+{x}+{y}")
        
        label = tk.Label(
            msg_window,
            text=message,
            font=('Comic Sans MS', 12),
            bg=self.colors['success'],
            fg='white',
            pady=20
        )
        label.pack(expand=True)
        
        # 2秒后自动关闭
        msg_window.after(2000, msg_window.destroy)
    
    def start_reminder_check(self):
        """启动提醒检查"""
        def check_loop():
            while True:
                self.check_reminders()
                time.sleep(60)  # 每分钟检查一次
        
        thread = threading.Thread(target=check_loop, daemon=True)
        thread.start()
    
    def check_reminders(self):
        """检查提醒"""
        now = datetime.datetime.now()
        
        for date_str, events in self.events.items():
            try:
                event_date = datetime.date.fromisoformat(date_str)
            except:
                continue
            
            for event in events:
                if event.get('completed'):
                    continue
                
                if 'reminder' in event and event['reminder']:
                    try:
                        event_time = datetime.datetime.combine(
                            event_date,
                            datetime.datetime.strptime(event.get('time', '00:00'), '%H:%M').time()
                        )
                        
                        if abs((event_time - now).total_seconds()) <= 300:  # 5分钟内
                            if not event.get('notified'):
                                self.show_notification(event)
                                event['notified'] = True
                                self.save_data()
                    except:
                        continue
    
    def show_notification(self, event):
        """显示通知"""
        try:
            notification.notify(
                title=f"⏰ 提醒: {event.get('title')}",
                message=f"时间: {event.get('time')}\n{event.get('description', '')}",
                timeout=10
            )
            winsound.Beep(1000, 500)
        except:
            pass
    
    def on_closing(self):
        """关闭窗口"""
        self.save_data()
        self.root.destroy()

class CuteEventDialog:
    def __init__(self, parent, date, colors, icons, event=None):
        self.parent = parent
        self.date = date
        self.colors = colors
        self.icons = icons
        self.event = event or {}
        self.result = None
        
        self.dialog = tk.Toplevel(parent)
        self.dialog.title("🎨 添加/编辑事件")
        self.dialog.geometry("500x600")
        self.dialog.configure(bg=colors['bg'])
        self.dialog.transient(parent)
        self.dialog.grab_set()
        
        # 居中
        x = parent.winfo_x() + (parent.winfo_width() // 2) - 250
        y = parent.winfo_y() + (parent.winfo_height() // 2) - 300
        self.dialog.geometry(f"+{x}+{y}")
        
        self.create_widgets()
        
    def create_widgets(self):
        """创建对话框控件"""
        # 标题
        title = tk.Label(
            self.dialog,
            text=f"{self.icons['heart']} 添加可爱事件 {self.icons['star']}",
            font=('Comic Sans MS', 16, 'bold'),
            bg=self.colors['primary'],
            fg='white',
            pady=10
        )
        title.pack(fill=tk.X)
        
        # 表单容器
        form_frame = tk.Frame(self.dialog, bg=self.colors['bg'], padx=20, pady=20)
        form_frame.pack(fill=tk.BOTH, expand=True)
        
        # 标题
        tk.Label(
            form_frame,
            text="标题:",
            font=('Comic Sans MS', 11, 'bold'),
            bg=self.colors['bg'],
            fg=self.colors['text']
        ).pack(anchor='w', pady=(0, 5))
        
        self.title_var = tk.StringVar(value=self.event.get('title', ''))
        title_entry = tk.Entry(
            form_frame,
            textvariable=self.title_var,
            font=('Comic Sans MS', 11),
            bg='white',
            fg=self.colors['text'],
            bd=2,
            relief=tk.SUNKEN
        )
        title_entry.pack(fill=tk.X, pady=(0, 10))
        
        # 时间
        tk.Label(
            form_frame,
            text="时间:",
            font=('Comic Sans MS', 11, 'bold'),
            bg=self.colors['bg'],
            fg=self.colors['text']
        ).pack(anchor='w', pady=(0, 5))
        
        time_frame = tk.Frame(form_frame, bg=self.colors['bg'])
        time_frame.pack(fill=tk.X, pady=(0, 10))
        
        self.hour_var = tk.StringVar(value=self.event.get('time', '09:00').split(':')[0])
        self.minute_var = tk.StringVar(value=self.event.get('time', '09:00').split(':')[1])
        
        tk.Spinbox(
            time_frame,
            from_=0, to=23,
            textvariable=self.hour_var,
            width=3,
            font=('Comic Sans MS', 11),
            bg='white',
            fg=self.colors['text']
        ).pack(side=tk.LEFT)
        tk.Label(time_frame, text=":", bg=self.colors['bg']).pack(side=tk.LEFT, padx=2)
        tk.Spinbox(
            time_frame,
            from_=0, to=59,
            textvariable=self.minute_var,
            width=3,
            font=('Comic Sans MS', 11),
            bg='white',
            fg=self.colors['text']
        ).pack(side=tk.LEFT)
        
        # 图标选择
        tk.Label(
            form_frame,
            text="选择图标:",
            font=('Comic Sans MS', 11, 'bold'),
            bg=self.colors['bg'],
            fg=self.colors['text']
        ).pack(anchor='w', pady=(0, 5))
        
        icon_frame = tk.Frame(form_frame, bg=self.colors['bg'])
        icon_frame.pack(fill=tk.X, pady=(0, 10))
        
        self.icon_var = tk.StringVar(value=self.event.get('icon', 'event'))
        
        icon_names = ['event', 'meeting', 'birthday', 'task', 'plan', 'fun', 'study', 'work']
        for icon_name in icon_names:
            btn = tk.Radiobutton(
                icon_frame,
                text=self.icons[icon_name],
                variable=self.icon_var,
                value=icon_name,
                font=('Arial', 16),
                bg=self.colors['bg'],
                fg=self.colors['text'],
                selectcolor=self.colors['primary']
            )
            btn.pack(side=tk.LEFT, padx=5)
        
        # 标签
        tk.Label(
            form_frame,
            text="标签:",
            font=('Comic Sans MS', 11, 'bold'),
            bg=self.colors['bg'],
            fg=self.colors['text']
        ).pack(anchor='w', pady=(0, 5))
        
        self.tag_var = tk.StringVar(value=self.event.get('tag', '日常'))
        tag_options = ['日常', '工作', '学习', '娱乐', '健康', '购物', '重要', '紧急']
        tag_menu = tk.OptionMenu(
            form_frame,
            self.tag_var,
            *tag_options
        )
        tag_menu.config(
            font=('Comic Sans MS', 10),
            bg='white',
            fg=self.colors['text']
        )
        tag_menu.pack(anchor='w', pady=(0, 10))
        
        # 优先级
        tk.Label(
            form_frame,
            text="优先级:",
            font=('Comic Sans MS', 11, 'bold'),
            bg=self.colors['bg'],
            fg=self.colors['text']
        ).pack(anchor='w', pady=(0, 5))
        
        priority_frame = tk.Frame(form_frame, bg=self.colors['bg'])
        priority_frame.pack(fill=tk.X, pady=(0, 10))
        
        self.priority_var = tk.StringVar(value=self.event.get('priority', '中'))
        
        for text, value in [("🔴 高", "高"), ("🟡 中", "中"), ("🟢 低", "低")]:
            tk.Radiobutton(
                priority_frame,
                text=text,
                variable=self.priority_var,
                value=value,
                font=('Comic Sans MS', 10),
                bg=self.colors['bg'],
                fg=self.colors['text'],
                selectcolor=self.colors['primary']
            ).pack(side=tk.LEFT, padx=10)
        
        # 描述
        tk.Label(
            form_frame,
            text="描述:",
            font=('Comic Sans MS', 11, 'bold'),
            bg=self.colors['bg'],
            fg=self.colors['text']
        ).pack(anchor='w', pady=(0, 5))
        
        self.desc_text = tk.Text(
            form_frame,
            height=5,
            font=('Comic Sans MS', 10),
            bg='white',
            fg=self.colors['text'],
            bd=2,
            relief=tk.SUNKEN
        )
        self.desc_text.pack(fill=tk.X, pady=(0, 10))
        if 'description' in self.event:
            self.desc_text.insert(1.0, self.event['description'])
        
        # 提醒
        remind_frame = tk.Frame(form_frame, bg=self.colors['bg'])
        remind_frame.pack(fill=tk.X, pady=(0, 10))
        
        self.reminder_var = tk.BooleanVar(value=self.event.get('reminder', False))
        tk.Checkbutton(
            remind_frame,
            text="提前5分钟提醒",
            variable=self.reminder_var,
            font=('Comic Sans MS', 10),
            bg=self.colors['bg'],
            fg=self.colors['text'],
            selectcolor=self.colors['primary']
        ).pack(side=tk.LEFT)
        
        # 按钮
        button_frame = tk.Frame(self.dialog, bg=self.colors['bg'], pady=10)
        button_frame.pack(fill=tk.X)
        
        tk.Button(
            button_frame,
            text=f"{self.icons['heart']} 保存",
            command=self.save,
            bg=self.colors['success'],
            fg='white',
            font=('Comic Sans MS', 12, 'bold'),
            width=10,
            cursor='hand2'
        ).pack(side=tk.LEFT, padx=20)
        
        tk.Button(
            button_frame,
            text=f"{self.icons['cloud']} 取消",
            command=self.cancel,
            bg=self.colors['secondary'],
            fg='white',
            font=('Comic Sans MS', 12, 'bold'),
            width=10,
            cursor='hand2'
        ).pack(side=tk.RIGHT, padx=20)
    
    def save(self):
        """保存事件"""
        if not self.title_var.get().strip():
            messagebox.showerror("错误", "请填写标题！")
            return
        
        time_str = f"{int(self.hour_var.get()):02d}:{int(self.minute_var.get()):02d}"
        
        self.result = {
            'title': self.title_var.get(),
            'time': time_str,
            'icon': self.icon_var.get(),
            'tag': self.tag_var.get(),
            'priority': self.priority_var.get(),
            'description': self.desc_text.get(1.0, tk.END).strip(),
            'reminder': self.reminder_var.get(),
            'completed': self.event.get('completed', False)
        }
        
        self.dialog.destroy()
    
    def cancel(self):
        """取消"""
        self.dialog.destroy()

def main():
    """主函数"""
    root = tk.Tk()
    
    # 检查依赖
    try:
        from plyer import notification
    except ImportError:
        print("正在安装依赖...")
        import subprocess
        subprocess.check_call(["pip", "install", "plyer", "tkcalendar"])
        print("安装完成，请重新运行程序")
        return
    
    try:
        from tkcalendar import Calendar
    except ImportError:
        print("正在安装tkcalendar...")
        import subprocess
        subprocess.check_call(["pip", "install", "tkcalendar"])
        print("安装完成，请重新运行程序")
        return
    
    app = CuteCalendarApp(root)
    root.mainloop()

if __name__ == "__main__":
    print("="*50)
    print("🌈 卡通日历提醒计划表 v1.0")
    print("="*50)
    print("功能特点:")
    print("🎨 可爱卡通界面")
    print("🎯 多彩事件卡片")
    print("⏰ 智能提醒功能")
    print("🌈 颜色主题选择")
    print("🔍 快速搜索筛选")
    print("💾 数据自动保存")
    print("="*50)
    print("使用说明:")
    print("1. 点击日历选择日期")
    print("2. 点击'❤️添加新事件'添加")
    print("3. 点击'🌈选颜色'选择主题色")
    print("4. 支持编辑、删除、标记完成")
    print("5. 自动保存到 cute_calendar.json")
    print("="*50)
    print("程序启动中...")
    main()

