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

FILE_NAME = "course.json"
# 表头：星期
week_list = ["周一", "周二", "周三", "周四", "周五"]
# 节次
section_list = ["第1节", "第2节", "第3节", "第4节", "第5节", "第6节", "第7节", "第8节"]

class CourseTable:
    def __init__(self, root):
        self.root = root
        self.root.title("简易课程表")
        self.root.geometry("720x480")
        self.root.resizable(False, False)

        # 读取保存数据
        self.course_data = self.load_data()

        # 顶部输入区
        top_frame = ttk.LabelFrame(root, text="添加/修改课程")
        top_frame.pack(padx=10, pady=5, fill="x")

        ttk.Label(top_frame, text="星期:").grid(row=0, column=0, padx=3, pady=6)
        self.week_var = tk.StringVar()
        self.com_week = ttk.Combobox(top_frame, textvariable=self.week_var, values=week_list, width=6)
        self.com_week.grid(row=0, column=1, padx=3)

        ttk.Label(top_frame, text="节次:").grid(row=0, column=2, padx=3)
        self.sec_var = tk.StringVar()
        self.com_sec = ttk.Combobox(top_frame, textvariable=self.sec_var, values=section_list, width=6)
        self.com_sec.grid(row=0, column=3, padx=3)

        ttk.Label(top_frame, text="课程名:").grid(row=0, column=4, padx=3)
        self.course_var = tk.StringVar()
        entry_course = ttk.Entry(top_frame, textvariable=self.course_var, width=18)
        entry_course.grid(row=0, column=5, padx=3)

        ttk.Button(top_frame, text="保存", command=self.save_course).grid(row=0, column=6, padx=4)
        ttk.Button(top_frame, text="清空选中", command=self.del_course).grid(row=0, column=7, padx=2)

        # 课程表格
        table_frame = ttk.LabelFrame(root, text="课程总表")
        table_frame.pack(padx=10, pady=5, fill="both", expand=True)

        self.tree = ttk.Treeview(table_frame, columns=week_list, show="headings", height=8)
        # 设置表头
        for w in week_list:
            self.tree.heading(w, text=w)
            self.tree.column(w, width=120, anchor="center")

        # 行标题
        for idx, sec in enumerate(section_list):
            self.tree.insert("", index=idx, text=sec, values=self.course_data[idx])

        scroll_y = ttk.Scrollbar(table_frame, orient=tk.VERTICAL, command=self.tree.yview)
        self.tree.configure(yscrollcommand=scroll_y.set)
        scroll_y.pack(side="right", fill="y")
        self.tree.pack(fill="both", expand=True)

        # 底部按钮
        bottom_frame = ttk.Frame(root)
        bottom_frame.pack(pady=3)
        ttk.Button(bottom_frame, text="全部清空课表", command=self.clear_all).grid()

    # 读取本地json
    def load_data(self):
        if os.path.exists(FILE_NAME):
            with open(FILE_NAME, "r", encoding="utf-8") as f:
                return json.load(f)
        # 空课表 8行5列
        empty = [["" for _ in range(5)] for _ in range(8)]
        return empty

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

    # 保存课程
    def save_course(self):
        wd = self.week_var.get()
        sc = self.sec_var.get()
        cls = self.course_var.get().strip()
        if not all([wd, sc, cls]):
            messagebox.showwarning("提示", "星期、节次、课程不能为空！")
            return
        try:
            w_idx = week_list.index(wd)
            s_idx = section_list.index(sc)
        except:
            messagebox.showerror("错误", "选择的星期/节次无效")
            return
        self.course_data[s_idx][w_idx] = cls
        self.write_data()
        self.refresh_table()
        messagebox.showinfo("成功", "课程已保存！")
        self.course_var.set("")

    # 删除单个格子课程
    def del_course(self):
        wd = self.week_var.get()
        sc = self.sec_var.get()
        if not wd or not sc:
            messagebox.showwarning("提示", "先选择星期和节次！")
            return
        w_idx = week_list.index(wd)
        s_idx = section_list.index(sc)
        self.course_data[s_idx][w_idx] = ""
        self.write_data()
        self.refresh_table()
        messagebox.showinfo("完成", "已清空该时段课程")

    # 刷新表格
    def refresh_table(self):
        for item in self.tree.get_children():
            self.tree.delete(item)
        for i, sec in enumerate(section_list):
            self.tree.insert("", i, text=sec, values=self.course_data[i])

    # 全清空
    def clear_all(self):
        if messagebox.askyesno("确认", "确定清空整张课表？不可撤回！"):
            self.course_data = [[""]*5 for _ in range(8)]
            self.write_data()
            self.refresh_table()

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