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

DATA_FILE = "course_data.json"
# 表头：星期
week_list = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
# 节次
period_list = ["第1节", "第2节", "第3节", "第4节", "第5节", "第6节", "第7节", "第8节"]

class CourseTableApp:
    def __init__(self, root):
        self.root = root
        self.root.title("个人课程表")
        self.root.geometry("780x520")
        self.root.resizable(False, False)
        self.root.config(bg="#f7f9fc")

        # 加载本地数据 {行号:{列号:课程名称}}
        self.course_data = self.load_file()
        self.create_widget()
        self.refresh_table()

    # 读取json文件
    def load_file(self):
        try:
            with open(DATA_FILE, "r", encoding="utf-8") as f:
                return json.load(f)
        except (FileNotFoundError, json.JSONDecodeError):
            return {}

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

    def create_widget(self):
        # 顶部标题
        tk.Label(self.root, text="📖 我的课程表", font=("微软雅黑", 18, "bold"), bg="#f7f9fc", fg="#2d3748").pack(pady=10)

        # 按钮区域
        frame_btn = tk.Frame(self.root, bg="#f7f9fc")
        frame_btn.pack(pady=5)
        ttk.Button(frame_btn, text="添加/修改课程", command=self.edit_course).grid(row=0, column=0, padx=6)
        ttk.Button(frame_btn, text="删除选中课程", command=self.del_course).grid(row=0, column=1, padx=6)
        ttk.Button(frame_btn, text="清空整张课表", command=self.clear_all).grid(row=0, column=2, padx=6)

        # 表格容器
        frame_table = tk.Frame(self.root)
        frame_table.pack(padx=15, pady=10, fill="both", expand=True)

        # 表格控件
        self.table = ttk.Treeview(frame_table, columns=week_list, show="headings", height=8)
        # 纵向滚动条
        v_scroll = ttk.Scrollbar(frame_table, orient="vertical", command=self.table.yview)
        self.table.configure(yscrollcommand=v_scroll.set)
        v_scroll.pack(side="right", fill="y")
        self.table.pack(fill="both", expand=True)

        # 设置表头
        for week in week_list:
            self.table.heading(week, text=week)
            self.table.column(week, width=100, anchor="center")

    # 刷新整张课表
    def refresh_table(self):
        # 清空原有所有行
        for item in self.table.get_children():
            self.table.delete(item)
        # 逐行填充
        for row_idx, period in enumerate(period_list):
            row_data = []
            for col_idx in range(len(week_list)):
                # 取出对应位置课程，无则空白
                cell_text = self.course_data.get(str(row_idx), {}).get(str(col_idx), "")
                row_data.append(cell_text)
            self.table.insert("", "end", text=period, values=row_data)

    # 新增/修改课程
    def edit_course(self):
        select = self.table.focus()
        if not select:
            messagebox.showinfo("提示", "请先点击表格里任意格子选中位置")
            return
        row_id = self.table.index(select)
        item_info = self.table.item(select)
        col_index = None
        # 获取点击的列
        for idx, val in enumerate(item_info["values"]):
            if self.table.selection() and self.table.focus() == select:
                col_index = idx
                break
        if col_index is None:
            return
        # 弹窗输入课程名称
        course_name = simpledialog.askstring("输入课程", f"设置 {period_list[row_id]} {week_list[col_index]} 的课程：")
        if course_name is None:
            return
        # 空内容则视为删除
        course_name = course_name.strip()
        if str(row_id) not in self.course_data:
            self.course_data[str(row_id)] = {}
        if course_name == "":
            if str(col_index) in self.course_data[str(row_id)]:
                del self.course_data[str(row_id)][str(col_index)]
        else:
            self.course_data[str(row_id)][str(col_index)] = course_name

        self.save_file()
        self.refresh_table()
        messagebox.showinfo("完成", "课程已保存")

    # 删除选中单元格课程
    def del_course(self):
        select = self.table.focus()
        if not select:
            messagebox.showinfo("提示", "请选中需要删除的课程格子")
            return
        row_id = self.table.index(select)
        item_info = self.table.item(select)
        col_index = None
        for idx, val in enumerate(item_info["values"]):
            col_index = idx
            break
        row_key = str(row_id)
        col_key = str(col_index)
        if row_key in self.course_data and col_key in self.course_data[row_key]:
            del self.course_data[row_key][col_key]
            self.save_file()
            self.refresh_table()
            messagebox.showinfo("删除成功", "该课程已移除")
        else:
            messagebox.showwarning("提示", "当前位置没有课程")

    # 清空全部课程
    def clear_all(self):
        ans = messagebox.askyesno("确认清空", "确定要清空整张课程表所有数据吗？此操作不可撤回！")
        if ans:
            self.course_data = {}
            self.save_file()
            self.refresh_table()
            messagebox.showinfo("已清空", "课表数据全部清除完毕")

if __name__ == "__main__":
    main_win = tk.Tk()
    app = CourseTableApp(main_win)
    main_win.mainloop()