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

# 数据存储文件
DATA_FILE = "plan_data.json"

# 初始化数据文件
def init_data():
    if not os.path.exists(DATA_FILE):
        with open(DATA_FILE, "w", encoding="utf-8") as f:
            json.dump({}, f, ensure_ascii=False, indent=2)

# 读取所有计划数据
def load_data():
    with open(DATA_FILE, "r", encoding="utf-8") as f:
        return json.load(f)

# 保存计划数据
def save_data(data):
    with open(DATA_FILE, "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=2)

class CalendarPlanner:
    def __init__(self, root):
        self.root = root
        self.root.title("日历提醒计划表")
        self.root.geometry("780x520")
        self.root.resizable(False, False)
        init_data()
        self.data = load_data()

        # 选中日期
        self.selected_date = datetime.now().strftime("%Y-%m-%d")

        # 左侧日历面板
        left_frame = ttk.Frame(root, width=320, height=520)
        left_frame.pack(side="left", fill="both", padx=5, pady=5)

        ttk.Label(left_frame, text="📅 日历选择", font=("微软雅黑", 14, "bold")).pack(pady=8)
        # 年月切换
        top_bar = ttk.Frame(left_frame)
        top_bar.pack()
        self.year_var = tk.IntVar(value=datetime.now().year)
        self.month_var = tk.IntVar(value=datetime.now().month)

        ttk.Button(top_bar, text="<", command=self.prev_month, width=3).grid(row=0, column=0, padx=2)
        ttk.Entry(top_bar, textvariable=self.year_var, width=6, justify="center").grid(row=0, column=1, padx=2)
        ttk.Label(top_bar, text="年").grid(row=0, column=2)
        ttk.Entry(top_bar, textvariable=self.month_var, width=4, justify="center").grid(row=0, column=3, padx=2)
        ttk.Label(top_bar, text="月").grid(row=0, column=4)
        ttk.Button(top_bar, text=">", command=self.next_month, width=3).grid(row=0, column=5, padx=2)
        ttk.Button(top_bar, text="今日", command=self.go_today, width=4).grid(row=0, column=6, padx=3)

        # 星期表头
        week_frame = ttk.Frame(left_frame)
        week_frame.pack(pady=5)
        week_text = ["一","二","三","四","五","六","日"]
        for i, w in enumerate(week_text):
            ttk.Label(week_frame, text=w, width=4, foreground="#222").grid(row=0, column=i)

        # 日历按钮容器
        self.cal_frame = ttk.Frame(left_frame)
        self.cal_frame.pack()
        self.cal_btns = []
        self.draw_calendar()

        # 右侧计划面板
        right_frame = ttk.Frame(root, width=440, height=520)
        right_frame.pack(side="right", fill="both", padx=5, pady=5)

        ttk.Label(right_frame, text=f"📋 {self.selected_date} 待办清单", font=("微软雅黑",14,"bold")).pack(pady=6)
        self.list_label = ttk.Label(right_frame, text=f"📋 {self.selected_date} 待办清单", font=("微软雅黑",14,"bold"))
        self.list_label.pack(pady=6)

        # 待办列表框
        self.plan_list = tk.Listbox(right_frame, width=55, height=14, font=("微软雅黑",10))
        self.plan_list.pack(pady=3)

        # 新增事项区域
        add_frame = ttk.Frame(right_frame)
        add_frame.pack(pady=5, fill="x")
        ttk.Label(add_frame, text="事项：").grid(row=0, column=0)
        self.task_entry = ttk.Entry(add_frame, width=38)
        self.task_entry.grid(row=0, column=1, padx=4)
        ttk.Button(add_frame, text="添加", command=self.add_task).grid(row=0, column=2)

        time_frame = ttk.Frame(right_frame)
        time_frame.pack(pady=3)
        ttk.Label(time_frame, text="提醒时间(时:分)：").grid(row=0, column=0)
        self.hour_entry = ttk.Entry(time_frame, width=4)
        self.hour_entry.insert(0, "08")
        self.hour_entry.grid(row=0, column=1, padx=2)
        ttk.Label(time_frame, text=":").grid(row=0, column=2)
        self.min_entry = ttk.Entry(time_frame, width=4)
        self.min_entry.insert(0, "00")
        self.min_entry.grid(row=0, column=3, padx=2)

        # 功能按钮
        btn_frame = ttk.Frame(right_frame)
        btn_frame.pack(pady=6)
        ttk.Button(btn_frame, text="删除选中", command=self.del_task).grid(row=0, column=0, padx=6)
        ttk.Button(btn_frame, text="清空当日", command=self.clear_day).grid(row=0, column=1, padx=6)
        ttk.Button(btn_frame, text="开启定时提醒", command=self.check_remind).grid(row=0, column=2, padx=6)

        self.refresh_plan()

    # 绘制日历
    def draw_calendar(self):
        for widget in self.cal_frame.winfo_children():
            widget.destroy()
        self.cal_btns.clear()

        y = self.year_var.get()
        m = self.month_var.get()
        from calendar import monthcalendar
        month_days = monthcalendar(y, m)

        today = datetime.now()
        today_str = today.strftime("%Y-%m-%d")

        for row_idx, week in enumerate(month_days):
            for col_idx, day in enumerate(week):
                if day == 0:
                    btn = ttk.Label(self.cal_frame, text="   ", width=4)
                else:
                    date_str = f"{y:04d}-{m:02d}-{day:02d}"
                    btn = tk.Button(
                        self.cal_frame, text=str(day), width=4, height=2,
                        command=lambda d=date_str: self.select_date(d)
                    )
                    # 今日高亮
                    if date_str == today_str:
                        btn.config(bg="#ffd966")
                    # 选中日期高亮
                    if date_str == self.selected_date:
                        btn.config(bg="#66b3ff")
                btn.grid(row=row_idx, column=col_idx, padx=1, pady=1)
                self.cal_btns.append(btn)

    # 选择日期
    def select_date(self, date):
        self.selected_date = date
        self.list_label.config(text=f"📋 {self.selected_date} 待办清单")
        self.draw_calendar()
        self.refresh_plan()

    # 上一月
    def prev_month(self):
        y = self.year_var.get()
        m = self.month_var.get()
        m -= 1
        if m < 1:
            m = 12
            y -= 1
        self.year_var.set(y)
        self.month_var.set(m)
        self.draw_calendar()

    # 下一月
    def next_month(self):
        y = self.year_var.get()
        m = self.month_var.get()
        m += 1
        if m > 12:
            m = 1
            y += 1
        self.year_var.set(y)
        self.month_var.set(m)
        self.draw_calendar()

    # 跳转今日
    def go_today(self):
        now = datetime.now()
        self.year_var.set(now.year)
        self.month_var.set(now.month)
        self.selected_date = now.strftime("%Y-%m-%d")
        self.list_label.config(text=f"📋 {self.selected_date} 待办清单")
        self.draw_calendar()
        self.refresh_plan()

    # 刷新当日计划列表
    def refresh_plan(self):
        self.plan_list.delete(0, tk.END)
        day_data = self.data.get(self.selected_date, [])
        for idx, item in enumerate(day_data):
            tip = f"[{item['time']}] {item['task']}"
            self.plan_list.insert(tk.END, tip)

    # 添加新事项
    def add_task(self):
        task = self.task_entry.get().strip()
        hour = self.hour_entry.get().strip()
        minute = self.min_entry.get().strip()
        if not task:
            messagebox.showwarning("提示", "请输入待办内容！")
            return
        try:
            int(hour)
            int(minute)
        except:
            messagebox.showerror("错误", "时间格式必须为数字！")
            return
        time_str = f"{hour.zfill(2)}:{minute.zfill(2)}"
        new_item = {"task": task, "time": time_str}
        if self.selected_date not in self.data:
            self.data[self.selected_date] = []
        self.data[self.selected_date].append(new_item)
        save_data(self.data)
        self.task_entry.delete(0, tk.END)
        self.refresh_plan()

    # 删除选中项
    def del_task(self):
        sel = self.plan_list.curselection()
        if not sel:
            messagebox.showinfo("提示", "请先选中一条事项")
            return
        idx = sel[0]
        del self.data[self.selected_date][idx]
        save_data(self.data)
        self.refresh_plan()

    # 清空当天所有计划
    def clear_day(self):
        if self.selected_date in self.data:
            del self.data[self.selected_date]
            save_data(self.data)
            self.refresh_plan()

    # 定时提醒轮询
    def check_remind(self):
        now = datetime.now()
        now_date = now.strftime("%Y-%m-%d")
        now_hm = now.strftime("%H:%M")
        today_tasks = self.data.get(now_date, [])
        remind_flag = False
        for item in today_tasks:
            if item["time"] == now_hm:
                messagebox.showinfo("⏰ 日程提醒", f"到时间啦：\n{item['task']}")
                remind_flag = True
        # 每60秒循环检测一次
        self.root.after(60000, self.check_remind)
        if not remind_flag:
            pass

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