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

# 保存文件路径
SAVE_FILE = "plan_data.json"

class CalendarPlanner:
    def __init__(self, root):
        self.root = root
        self.root.title("日历提醒计划表")
        self.root.geometry("720x520")
        # 存储计划数据 { "2026-08-30": [{"title":"xxx","time":"xxx","note":"xxx"}] }
        self.plan_dict = self.load_data()

        # 顶部选择日期区
        top_frame = ttk.Frame(root, padding=10)
        top_frame.pack(fill=tk.X)

        ttk.Label(top_frame, text="选择日期:").grid(row=0, column=0, padx=5)
        self.year_var = tk.StringVar(value=str(datetime.now().year))
        self.month_var = tk.StringVar(value=str(datetime.now().month))
        self.day_var = tk.StringVar(value=str(datetime.now().day))

        ttk.Spinbox(top_frame, from_=2000, to=2100, textvariable=self.year_var, width=6).grid(row=0, column=1)
        ttk.Label(top_frame, text="年").grid(row=0, column=2)
        ttk.Spinbox(top_frame, from_=1, to=12, textvariable=self.month_var, width=4).grid(row=0, column=3)
        ttk.Label(top_frame, text="月").grid(row=0, column=4)
        ttk.Spinbox(top_frame, from_=1, to=31, textvariable=self.day_var, width=4).grid(row=0, column=5)
        ttk.Label(top_frame, text="日").grid(row=0, column=6)
        ttk.Button(top_frame, text="查看当日计划", command=self.show_day_plan).grid(row=0, column=8, padx=10)

        # 添加计划区域
        add_frame = ttk.LabelFrame(root, text="添加新计划", padding=10)
        add_frame.pack(fill=tk.X, padx=10, pady=5)

        ttk.Label(add_frame, text="计划标题:").grid(row=0, column=0, sticky="w")
        self.title_entry = ttk.Entry(add_frame, width=40)
        self.title_entry.grid(row=0, column=1, padx=5)

        ttk.Label(add_frame, text="提醒时间(例 14:30):").grid(row=1, column=0, sticky="w", pady=5)
        self.time_entry = ttk.Entry(add_frame, width=15)
        self.time_entry.grid(row=1, column=1, sticky="w", padx=5)

        ttk.Label(add_frame, text="备注详情:").grid(row=2, column=0, sticky="w")
        self.note_text = tk.Text(add_frame, height=3, width=50)
        self.note_text.grid(row=2, column=1, padx=5)

        ttk.Button(add_frame, text="保存计划", command=self.add_plan).grid(row=3, column=1, pady=8)

        # 计划列表展示区
        list_frame = ttk.LabelFrame(root, text="当日计划列表", padding=10)
        list_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)

        # 表格
        self.tree = ttk.Treeview(list_frame, columns=("time", "title", "note"), show="headings")
        self.tree.heading("time", text="提醒时间")
        self.tree.heading("title", text="标题")
        self.tree.heading("note", text="备注")
        self.tree.column("time", width=100)
        self.tree.column("title", width=180)
        self.tree.column("note", width=350)
        self.tree.pack(fill=tk.BOTH, expand=True)

        # 删除按钮
        btn_frame = ttk.Frame(root, padding=5)
        btn_frame.pack()
        ttk.Button(btn_frame, text="选中项删除", command=self.delete_plan).pack(side=tk.LEFT, padx=10)

    # 读取本地保存的数据
    def load_data(self):
        if os.path.exists(SAVE_FILE):
            try:
                with open(SAVE_FILE, "r", encoding="utf-8") as f:
                    return json.load(f)
            except:
                return {}
        return {}

    # 保存数据到json文件
    def save_data(self):
        with open(SAVE_FILE, "w", encoding="utf-8") as f:
            json.dump(self.plan_dict, f, ensure_ascii=False, indent=2)

    # 获取格式化日期字符串 YYYY-MM-DD
    def get_date_str(self):
        y = self.year_var.get()
        m = self.month_var.get()
        d = self.day_var.get()
        return f"{y}-{int(m):02d}-{int(d):02d}"

    # 刷新列表显示当天任务
    def show_day_plan(self):
        #清空表格
        for item in self.tree.get_children():
            self.tree.delete(item)
        date_key = self.get_date_str()
        plan_list = self.plan_dict.get(date_key, [])
        for p in plan_list:
            self.tree.insert("", tk.END, values=(p["time"], p["title"], p["note"]))

    # 添加计划
    def add_plan(self):
        title = self.title_entry.get().strip()
        remind_time = self.time_entry.get().strip()
        note = self.note_text.get("1.0", tk.END).strip()
        if not title:
            messagebox.showwarning("提示", "计划标题不能为空！")
            return
        date_key = self.get_date_str()
        new_item = {"title": title, "time": remind_time, "note": note}
        if date_key not in self.plan_dict:
            self.plan_dict[date_key] = []
        self.plan_dict[date_key].append(new_item)
        self.save_data()
        #清空输入框
        self.title_entry.delete(0, tk.END)
        self.time_entry.delete(0, tk.END)
        self.note_text.delete("1.0", tk.END)
        self.show_day_plan()
        messagebox.showinfo("成功", "计划添加完成！")

    # 删除选中计划
    def delete_plan(self):
        selected = self.tree.selection()
        if not selected:
            messagebox.showwarning("提示", "请先选中一条计划！")
            return
        date_key = self.get_date_str()
        idx = self.tree.index(selected[0])
        del self.plan_dict[date_key][idx]
        if len(self.plan_dict[date_key]) == 0:
            del self.plan_dict[date_key]
        self.save_data()
        self.show_day_plan()
        messagebox.showinfo("完成", "计划已删除")


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