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

SAVE_FILE = "timetable.json"
ROWS = 12   # 节数
COLS = 7    # 周一到周日
WEEK = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]


class TimeTableApp:
    def __init__(self, root):
        self.root = root
        self.root.title("课程表")
        self.root.geometry("960x650")

        # 数据：课程文本，背景颜色
        self.table_data = [[{"text": "", "bg": "#ffffff"} for _ in range(COLS)] for _ in range(ROWS)]
        self.load_file()

        # 顶部按钮栏
        top_frame = ttk.Frame(root, padding=6)
        top_frame.pack(fill=tk.X)
        ttk.Button(top_frame, text="编辑选中", command=self.edit_selected).pack(side=tk.LEFT, padx=4)
        ttk.Button(top_frame, text="设置课程颜色", command=self.set_color).pack(side=tk.LEFT, padx=4)
        ttk.Button(top_frame, text="保存课程表", command=self.save_file).pack(side=tk.LEFT, padx=4)
        ttk.Button(top_frame, text="清空全部", command=self.clear_all).pack(side=tk.LEFT, padx=4)

        # 当前选中单元格
        self.select_row = None
        self.select_col = None

        # 表格容器
        table_frame = ttk.Frame(root, padding=8)
        table_frame.pack()

        self.cell_widgets = []
        # 绘制表头
        ttk.Label(table_frame, text="节次\\星期", width=10, relief="solid", anchor="center").grid(row=0, column=0, padx=1, pady=1)
        for c, day in enumerate(WEEK):
            ttk.Label(table_frame, text=day, width=12, relief="solid", anchor="center").grid(row=0, column=c+1, padx=1, pady=1)

        # 绘制表格格子
        for r in range(ROWS):
            row_widget = []
            ttk.Label(table_frame, text=f"{r+1}节", width=10, relief="solid", anchor="center").grid(row=r+1, column=0, padx=1, pady=1)
            for c in range(COLS):
                lab = tk.Label(
                    table_frame,
                    text=self.table_data[r][c]["text"],
                    bg=self.table_data[r][c]["bg"],
                    width=12,
                    height=3,
                    relief="solid",
                    wraplength=90,
                    justify="center"
                )
                lab.grid(row=r+1, column=c+1, padx=1, pady=1)
                # ✅修复：全部使用英文半角减号 -
                lab.bind("<Button-1>", lambda e, rr=r, cc=c: self.on_click(rr, cc))
                lab.bind("<Double-Button-1>", lambda e, rr=r, cc=c: self.double_click_edit(rr, cc))
                row_widget.append(lab)
            self.cell_widgets.append(row_widget)

    def on_click(self, r, c):
        """单击选中格子"""
        self.select_row = r
        self.select_col = c

    def double_click_edit(self, r, c):
        """双击编辑课程"""
        old = self.table_data[r][c]["text"]
        res = simpledialog.askstring("编辑课程", f"{WEEK[c]} 第{r+1}节\n输入课程(可写教室):", initialvalue=old)
        if res is not None:
            self.table_data[r][c]["text"] = res
            self.refresh_ui()

    def edit_selected(self):
        if self.select_row is None:
            messagebox.showwarning("提示", "请先点击选择一个单元格！")
            return
        self.double_click_edit(self.select_row, self.select_col)

    def set_color(self):
        if self.select_row is None:
            messagebox.showwarning("提示", "请先点击选择一个单元格！")
            return
        color_input = simpledialog.askstring("设置背景色", "输入颜色英文(red/green/yellow/lightblue):")
        if color_input:
            self.table_data[self.select_row][self.select_col]["bg"] = color_input.strip()
            self.refresh_ui()

    def refresh_ui(self):
        """刷新界面显示"""
        for r in range(ROWS):
            for c in range(COLS):
                widget = self.cell_widgets[r][c]
                widget.config(text=self.table_data[r][c]["text"])
                widget.config(bg=self.table_data[r][c]["bg"])

    def save_file(self):
        with open(SAVE_FILE, "w", encoding="utf-8") as f:
            json.dump(self.table_data, f, ensure_ascii=False, indent=2)
        messagebox.showinfo("保存成功", f"已保存到 {SAVE_FILE}")

    def load_file(self):
        if os.path.exists(SAVE_FILE):
            try:
                with open(SAVE_FILE, "r", encoding="utf-8") as f:
                    self.table_data = json.load(f)
            except Exception:
                pass

    def clear_all(self):
        if messagebox.askyesno("确认", "确定清空所有课程？"):
            self.table_data = [[{"text": "", "bg": "#ffffff"} for _ in range(COLS)] for _ in range(ROWS)]
            self.refresh_ui()


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