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

# 数据保存文件
SAVE_FILE = "study_plan.json"

class StudyPlanApp:
    def __init__(self, root):
        self.root = root
        self.root.title("每日学习计划")
        self.root.geometry("620x480")

        # 任务列表 [{title, time, finish}]
        self.task_list = self.load_data()

        # 界面布局
        self.create_widgets()
        self.refresh_task_tree()

    def create_widgets(self):
        # 输入区域框架
        frame_input = ttk.Frame(self.root, padding=10)
        frame_input.pack(fill=tk.X)

        ttk.Label(frame_input, text="任务名称：").grid(row=0, column=0, sticky="w")
        self.entry_title = ttk.Entry(frame_input, width=25)
        self.entry_title.grid(row=0, column=1, padx=5)

        ttk.Label(frame_input, text="预计时间：").grid(row=0, column=2, sticky="w")
        self.entry_time = ttk.Entry(frame_input, width=12)
        self.entry_time.grid(row=0, column=3, padx=5)

        btn_add = ttk.Button(frame_input, text="添加任务", command=self.add_task)
        btn_add.grid(row=0, column=4, padx=8)

        # 任务表格
        frame_table = ttk.Frame(self.root, padding=10)
        frame_table.pack(fill=tk.BOTH, expand=True)

        columns = ("title", "time", "status")
        self.tree = ttk.Treeview(frame_table, columns=columns, show="headings")
        self.tree.heading("title", text="学习任务")
        self.tree.heading("time", text="计划时间")
        self.tree.heading("status", text="状态")

        self.tree.column("title", width=280)
        self.tree.column("time", width=130)
        self.tree.column("status", width=100)

        scroll = ttk.Scrollbar(frame_table, orient=tk.VERTICAL, command=self.tree.yview)
        self.tree.configure(yscrollcommand=scroll.set)
        self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        scroll.pack(side=tk.RIGHT, fill=tk.Y)

        # 功能按钮区
        frame_btn = ttk.Frame(self.root, padding=10)
        frame_btn.pack(fill=tk.X)

        ttk.Button(frame_btn, text="标记完成", command=self.mark_finish).pack(side=tk.LEFT, padx=4)
        ttk.Button(frame_btn, text="标记未完成", command=self.mark_unfinish).pack(side=tk.LEFT, padx=4)
        ttk.Button(frame_btn, text="删除选中任务", command=self.delete_task).pack(side=tk.LEFT, padx=4)
        ttk.Button(frame_btn, text="保存计划", command=self.save_data).pack(side=tk.RIGHT, padx=4)

    def add_task(self):
        title = self.entry_title.get().strip()
        time_text = self.entry_time.get().strip()
        if not title:
            messagebox.showwarning("提示", "请输入学习任务！")
            return
        task = {
            "title": title,
            "time": time_text,
            "finish": False
        }
        self.task_list.append(task)
        self.entry_title.delete(0, tk.END)
        self.entry_time.delete(0, tk.END)
        self.refresh_task_tree()
        self.save_data()

    def refresh_task_tree(self):
        # 清空表格
        for item in self.tree.get_children():
            self.tree.delete(item)
        for task in self.task_list:
            status = "✅ 已完成" if task["finish"] else "🔲 未完成"
            self.tree.insert("", tk.END, values=(task["title"], task["time"], status))

    def get_selected_index(self):
        sel = self.tree.selection()
        if not sel:
            messagebox.showinfo("提示", "请先选中一条任务！")
            return None
        idx = self.tree.index(sel[0])
        return idx

    def mark_finish(self):
        idx = self.get_selected_index()
        if idx is not None:
            self.task_list[idx]["finish"] = True
            self.refresh_task_tree()
            self.save_data()

    def mark_unfinish(self):
        idx = self.get_selected_index()
        if idx is not None:
            self.task_list[idx]["finish"] = False
            self.refresh_task_tree()
            self.save_data()

    def delete_task(self):
        idx = self.get_selected_index()
        if idx is not None:
            del self.task_list[idx]
            self.refresh_task_tree()
            self.save_data()

    def save_data(self):
        with open(SAVE_FILE, "w", encoding="utf-8") as f:
            json.dump(self.task_list, f, ensure_ascii=False, indent=2)

    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 []

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