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

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

class CalendarPlanner:
    def __init__(self, root):
        self.root = root
        self.root.title("日历提醒计划表")
        self.root.geometry("820x580")

        # 加载日程数据
        self.schedule_data = self.load_data()
        # 记录已经提醒过的任务，防止重复弹窗
        self.reminded_tasks = set()

        self.create_widgets()
        self.refresh_schedule_list()
        # 启动自动定时检测提醒（每30秒扫描一次）
        self.auto_check_remind()

    def load_data(self):
        """读取本地日程文件"""
        if os.path.exists(DATA_FILE):
            try:
                with open(DATA_FILE, "r", encoding="utf-8") as f:
                    return json.load(f)
            except:
                return {}
        return {}

    def save_data(self):
        """保存日程到文件"""
        with open(DATA_FILE, "w", encoding="utf-8") as f:
            json.dump(self.schedule_data, f, ensure_ascii=False, indent=2)

    def create_widgets(self):
        # 左右布局
        left_frame = tk.Frame(self.root)
        left_frame.pack(side=tk.LEFT, padx=10, pady=10)

        right_frame = tk.Frame(self.root)
        right_frame.pack(side=tk.RIGHT, padx=10, pady=10, fill=tk.BOTH, expand=True)

        # ========== 左侧日历 ==========
        self.cal = Calendar(
            left_frame,
            selectmode="day",
            year=datetime.now().year,
            month=datetime.now().month,
            day=datetime.now().day,
            date_pattern="yyyy-mm-dd"
        )
        self.cal.pack()
        self.cal.bind("<<CalendarSelected>>", self.on_date_select)

        # 添加计划区域
        form_frame = tk.LabelFrame(left_frame, text="新建计划")
        form_frame.pack(pady=15, fill=tk.X)

        tk.Label(form_frame, text="标题：").grid(row=0, column=0, sticky="w")
        self.var_title = tk.StringVar()
        tk.Entry(form_frame, textvariable=self.var_title, width=22).grid(row=0, column=1, padx=5, pady=3)

        tk.Label(form_frame, text="提醒时间(时:分)：").grid(row=1, column=0, sticky="w")
        self.var_time = tk.StringVar(value="09:00")
        tk.Entry(form_frame, textvariable=self.var_time, width=22).grid(row=1, column=1, padx=5, pady=3)

        tk.Label(form_frame, text="内容：").grid(row=2, column=0, sticky="nw")
        self.text_content = tk.Text(form_frame, width=24, height=4)
        self.text_content.grid(row=2, column=1, padx=5, pady=3)

        tk.Button(form_frame, text="添加日程", command=self.add_schedule, bg="#4CAF50", fg="white")\
            .grid(row=3, column=0, columnspan=2, pady=6)

        # ========== 右侧日程列表 ==========
        tk.Label(right_frame, text="当日日程列表", font=("黑体",12,"bold")).pack(anchor="w")
        list_frame = tk.Frame(right_frame)
        list_frame.pack(fill=tk.BOTH, expand=True)

        scrollbar = ttk.Scrollbar(list_frame)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        self.schedule_list = tk.Listbox(list_frame, yscrollcommand=scrollbar.set, font=("微软雅黑",10))
        self.schedule_list.pack(fill=tk.BOTH, expand=True)
        scrollbar.config(command=self.schedule_list.yview)

        btn_frame = tk.Frame(right_frame)
        btn_frame.pack(pady=8)
        tk.Button(btn_frame, text="删除选中", command=self.del_schedule, bg="#f44336", fg="white").grid(row=0, column=0, padx=4)
        tk.Button(btn_frame, text="手动检查今日提醒", command=self.check_remind).grid(row=0, column=1, padx=4)

        self.selected_date = self.cal.get_date()

    def on_date_select(self, event):
        self.selected_date = self.cal.get_date()
        self.refresh_schedule_list()

    def refresh_schedule_list(self):
        self.schedule_list.delete(0, tk.END)
        day_list = self.schedule_data.get(self.selected_date, [])
        for idx, item in enumerate(day_list):
            line = f"[{item['time']}] {item['title']} | {item['content']}"
            self.schedule_list.insert(tk.END, line)

    def add_schedule(self):
        date = self.selected_date
        title = self.var_title.get().strip()
        remind_time = self.var_time.get().strip()
        content = self.text_content.get("1.0", tk.END).strip()

        if not title:
            messagebox.showwarning("提示", "请输入计划标题！")
            return

        new_item = {
            "title": title,
            "time": remind_time,
            "content": content
        }
        if date not in self.schedule_data:
            self.schedule_data[date] = []
        self.schedule_data[date].append(new_item)
        self.save_data()

        # 清空输入框
        self.var_title.set("")
        self.var_time.set("09:00")
        self.text_content.delete("1.0", tk.END)
        self.refresh_schedule_list()
        messagebox.showinfo("成功", "日程添加完成！")

    def del_schedule(self):
        sel = self.schedule_list.curselection()
        if not sel:
            messagebox.showwarning("提示", "请先选中一条日程")
            return
        idx = sel[0]
        date = self.selected_date
        task = self.schedule_data[date][idx]
        unique_key = f"{date}_{task['time']}_{task['title']}"
        if unique_key in self.reminded_tasks:
            self.reminded_tasks.remove(unique_key)

        del self.schedule_data[date][idx]
        if len(self.schedule_data[date]) == 0:
            del self.schedule_data[date]
        self.save_data()
        self.refresh_schedule_list()

    def check_remind(self):
        """检查今日所有到期提醒"""
        today_str = datetime.now().strftime("%Y-%m-%d")
        now_time = datetime.now().strftime("%H:%M")
        today_tasks = self.schedule_data.get(today_str, [])
        remind_list = []
        for task in today_tasks:
            if task["time"] <= now_time:
                remind_list.append(f"{task['title']}\n{task['content']}")
        if remind_list:
            msg = "\n————————\n".join(remind_list)
            messagebox.showwarning("⏰日程提醒⏰", msg)
        else:
            messagebox.showinfo("通知", "暂无到期提醒")

    def auto_check_remind(self):
        """自动循环检测，不卡死界面，30秒检测一次"""
        today_str = datetime.now().strftime("%Y-%m-%d")
        now_time = datetime.now().strftime("%H:%M")
        today_tasks = self.schedule_data.get(today_str, [])

        for task in today_tasks:
            key = f"{today_str}_{task['time']}_{task['title']}"
            if task["time"] <= now_time and key not in self.reminded_tasks:
                # 弹窗置顶提醒
                msg_win = messagebox.showwarning("⏰日程提醒⏰", f"{task['title']}\n{task['content']}")
                self.reminded_tasks.add(key)

        # 30000毫秒=30秒再次检测
        self.root.after(30000, self.auto_check_remind)

if __name__ == "__main__":
    root = tk.Tk()
    app = CalendarPlanner(root)
    root.mainloop()