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

DATA_FILE = "schedule.json"

COLORS = [
    "#E3F2FD", "#F3E5F5", "#E8F5E9",
    "#FFF3E0", "#FCE4EC", "#E0F2F1"
]


class ScheduleApp:
    def __init__(self, root):
        self.root = root
        self.root.title("036. 课程表（修正版）")
        self.root.geometry("950x520")
        self.root.resizable(False, False)

        self.week_days = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
        self.periods = [f"第{i}节" for i in range(1, 9)]

        self.data = {}
        self.color_map = {}

        self.load_data()
        self.build_ui()

    def load_data(self):
        if os.path.exists(DATA_FILE):
            try:
                with open(DATA_FILE, "r", encoding="utf-8") as f:
                    self.data = json.load(f)
            except:
                self.data = {}
        else:
            self.data = {}

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

    def build_ui(self):
        top = tk.Frame(self.root)
        top.pack(pady=8)

        tk.Label(
            top, text="📅 我的课程表",
            font=("微软雅黑", 18, "bold")
        ).pack(side=tk.LEFT, padx=10)

        # ===============================
        # ✅ 第 29 行：修复点（关键）
        iso = datetime.today().isocalendar()
        week_num = iso[1] if isinstance(iso, tuple) else iso.week
        # ===============================

        tk.Label(
            top, text=f"（第 {week_num} 周）",
            font=("微软雅黑", 10), fg="#666"
        ).pack(side=tk.LEFT)

        # ===============================
        # ✅ 第 56 行附近：Frame 创建（安全）
        table = tk.Frame(self.root)
        table.pack(padx=10, pady=5)
        # ===============================

        tk.Label(
            table, text="节次\\星期",
            width=10, height=2,
            font=("微软雅黑", 9, "bold"),
            bg="#EEEEEE", relief=tk.RAISED, bd=1
        ).grid(row=0, column=0)

        for col, day in enumerate(self.week_days, start=1):
            tk.Label(
                table, text=day,
                width=12, height=2,
                font=("微软雅黑", 9, "bold"),
                bg="#BBDEFB", relief=tk.RAISED, bd=1
            ).grid(row=0, column=col)

        self.cells = {}
        for row, period in enumerate(self.periods, start=1):
            tk.Label(
                table, text=period,
                width=10, height=3,
                font=("微软雅黑", 9),
                bg="#EEEEEE", relief=tk.RAISED, bd=1
            ).grid(row=row, column=0)

            for col, day in enumerate(self.week_days, start=1):
                cell = tk.Label(
                    table, text="",
                    width=12, height=3,
                    font=("微软雅黑", 8),
                    relief=tk.RAISED, bd=1,
                    bg="white"
                )
                cell.grid(row=row, column=col)
                cell.bind("<Button-1>", self.cell_click)
                self.cells[(row - 1, col - 1)] = cell

        self.refresh_cells()

        btn = tk.Frame(self.root)
        btn.pack(pady=10)

        tk.Button(btn, text="添加课程", width=12,
                  bg="#4CAF50", fg="white",
                  command=self.add_course).pack(side=tk.LEFT, padx=5)

        tk.Button(btn, text="清空本周", width=12,
                  bg="#FF9800", fg="white",
                  command=self.clear_week).pack(side=tk.LEFT, padx=5)

        tk.Button(btn, text="导出文本", width=12,
                  bg="#2196F3", fg="white",
                  command=self.export_text).pack(side=tk.LEFT, padx=5)

    def refresh_cells(self):
        for (r, c), cell in self.cells.items():
            key = f"{self.week_days[c]}-{self.periods[r]}"
            course = self.data.get(key)

            if isinstance(course, str):
                course = {"name": course}
            if not isinstance(course, dict):
                course = {}

            name = course.get("name", "")
            teacher = course.get("teacher", "")
            room = course.get("room", "")

            if name:
                cell.config(
                    text=f"{name}\n{teacher}\n{room}",
                    bg=self.get_color(name)
                )
            else:
                cell.config(text="", bg="white")

    def get_color(self, name):
        if name not in self.color_map:
            self.color_map[name] = COLORS[len(self.color_map) % len(COLORS)]
        return self.color_map[name]

    def cell_click(self, event):
        widget = event.widget
        for (r, c), cell in self.cells.items():
            if cell == widget:
                key = f"{self.week_days[c]}-{self.periods[r]}"
                self.edit_course(key)
                return

    def edit_course(self, key):
        old = self.data.get(key)
        if isinstance(old, str):
            old = {"name": old}
        if not isinstance(old, dict):
            old = {}

        name = simpledialog.askstring("课程名称", "请输入课程名称：",
                                      initialvalue=old.get("name", ""))
        if name is None:
            return
        name = name.strip()
        if not name:
            self.data.pop(key, None)
            self.save_data()
            self.refresh_cells()
            return

        teacher = simpledialog.askstring("任课教师", "请输入任课教师：",
                                         initialvalue=old.get("teacher", ""))
        if teacher is None:
            return
        teacher = teacher.strip()

        room = simpledialog.askstring("教室", "请输入教室：",
                                      initialvalue=old.get("room", ""))
        if room is None:
            return
        room = room.strip()

        self.data[key] = {
            "name": name,
            "teacher": teacher,
            "room": room
        }
        self.save_data()
        self.refresh_cells()

    def add_course(self):
        name = simpledialog.askstring("课程名称", "请输入课程名称：")
        if not name:
            return
        name = name.strip()

        teacher = simpledialog.askstring("任课教师", "请输入任课教师：") or ""
        room = simpledialog.askstring("教室", "请输入教室：") or ""

        for c in range(5):
            for r in range(8):
                key = f"{self.week_days[c]}-{self.periods[r]}"
                self.data[key] = {
                    "name": name,
                    "teacher": teacher.strip(),
                    "room": room.strip()
                }

        self.save_data()
        self.refresh_cells()
        messagebox.showinfo("完成", "课程已添加！")

    def clear_week(self):
        if not messagebox.askyesno("确认", "清空本周课程？"):
            return
        for c in range(7):
            for r in range(8):
                key = f"{self.week_days[c]}-{self.periods[r]}"
                self.data.pop(key, None)
        self.save_data()
        self.refresh_cells()

    def export_text(self):
        lines = ["===== 课程表 ====="]
        for r, period in enumerate(self.periods):
            row = [period]
            for c in range(7):
                key = f"{self.week_days[c]}-{period}"
                course = self.data.get(key, {})
                if isinstance(course, str):
                    course = {"name": course}
                name = course.get("name", "") if isinstance(course, dict) else ""
                row.append(name or "--")
            lines.append(" | ".join(row))

        with open("课程表.txt", "w", encoding="utf-8") as f:
            f.write("\n".join(lines))

        messagebox.showinfo("导出成功", "已导出为 课程表.txt")


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